(二)裸机开发框架构建之---点灯大师

2023-05-16

裸机开发框架构建

      • 3.设备管理层
        • 抽象出结构体
        • 初始化结构体
          • 第一种初始化方法(c89标准)
          • 第二种初始化方法(C99标准)
      • 2.硬件接口层
      • 1.硬件层
        • 硬件LED层初始化函数
        • 硬件层LED控制函数
      • 4.应用层
      • 整体源代码(mdk4下调试编译通过,主控STM32F103RB)
        • 硬件层
        • 硬件接口层
        • 设备管理层
        • 应用层
        • 源工程下载链接

接上一篇 (一)裸机开发框架构建之—开发框架思想

实际设计代码,

总共分四层:硬件层—硬件接口层—设备管理层—应用层面

面向对象编程步骤:

3.设备管理层

1.首先对对象进行描述,有什么属性,任务要求可以实现什么功能,
拿LED来说:使用需要初始化函数,可能有相同的多个设备,我们要准确控制哪一个设备的开关状态,颜色??亮度??根据项目需求可以自己设计,写法一般是把设备所有实现的功能抽象出一个结构体,实现函数啥的全部放到结构体里面,如下:

这里描述了设备名字,选择哪一个LED,初始化函数,控制LED的开关函数,设置LED颜色,亮度等等,这里的参数为结构体指针的形式

抽象出结构体

在这里插入图片描述

初始化结构体

结构体的初始化看相同设备的数量,如果数量比较多的话就用结构体数组,如果只是单个设备就用结构体变量,这里的初始化可以用两种形式,第一种c89标准下,这里描述相同设备比较多,使用结构体数组的形式

第一种初始化方法(c89标准)

在这里插入图片描述

第二种初始化方法(C99标准)

第二种c99以上标准,此种方法代码可读性更高(MDK下使用需要勾选C99标准)

在这里插入图片描述
这一层的函数还没实现
在这里插入图片描述
实现如下:可以看到,调用了硬件接口层的函数

在这里插入图片描述

接下来就实现硬件接口层的函数

2.硬件接口层

这一层仅仅是对硬件层的函数进行封装,比较简单
可以看到,就是一层包装而已,实现应用层和硬件层的分离
在这里插入图片描述

1.硬件层

这一层就是直接对硬件的操作,根据库不同和板子不同会有不同的写法,但是最终这个函数实现的,都将被硬件接口层封装

硬件LED层初始化函数

int LED_Init(struct LEDDevice *ptLEDDevice)
{
	 static char ucLed=0;
	 GPIO_InitTypeDef GPIO_InitStruct; 
	
	if (!ptLEDDevice) /* 防御式编程:判断为空指针 */
		return -1;
	
	
	
  switch (ptLEDDevice->which)  /*选择使能哪个LED*/
	{
		case LED1:   
		{
		 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
		 break;
		}

		case LED2: 
		{
		 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
		 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
		 break;
		}

		case LED3: 
		{
		   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
		   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
		   break;
		}
			default:
			return -1;
}
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);/*锁存器时钟*/		
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct);															//数据引脚
	
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOD, &GPIO_InitStruct);															//锁存引脚
	
    GPIO_Write(GPIOC, ~ucLed <<8);
    GPIO_SetBits(GPIOD,GPIO_Pin_2);
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);		

	return 0;
	}

硬件层LED控制函数

int LEDControl(struct LEDDevice *ptLEDDevice, int iStatus)
{
	BitAction pinstate;
	
	if (!ptLEDDevice)
		return -1;

	pinstate = iStatus ? Bit_RESET : Bit_SET;
	
	switch (ptLEDDevice->which)
	{
		case LED1: 
		{
		   GPIO_WriteBit(GPIOC,GPIO_Pin_8,pinstate);
		   GPIO_SetBits(GPIOD,GPIO_Pin_2);/*锁存器引脚*/
           GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
		   
			break;
		}

		case LED2: 
		{
		   GPIO_WriteBit(GPIOC,GPIO_Pin_9,pinstate);
		   GPIO_SetBits(GPIOD,GPIO_Pin_2);
           GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
			break;
		}

		case LED3: 
		{
		    GPIO_WriteBit(GPIOC,GPIO_Pin_10,pinstate);
			GPIO_SetBits(GPIOD,GPIO_Pin_2);
            GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
			break;
		}

		default:
			return -1;
	}

	return 0;
	
}

这里有三个设备,如何使用某一个LED设备,这里在设备管理层还写了这么一个函数

定义一个指针函数,这里传输的参数是witch,通过输入witch值确定哪一个数组

PLEDDevice GetLEDDevice(int which)
{
	if (which >= LED1 && which <= LED3)
		return &g_tLEDDevices[which];
	else
		return NULL;
}

4.应用层

最后应用测试代码

void Led_test(void)
{
	PLEDDevice PLED1 = GetLEDDevice(LED1);
	PLEDDevice PLED2 = GetLEDDevice(LED2);
	PLEDDevice PLED3 = GetLEDDevice(LED3);

    PLED1->Init(PLED1);
	PLED2->Init(PLED2);
	PLED3->Init(PLED3);
	
    PLED1->Control(PLED1, 0); /*打开设备*/
    PLED2->Control(PLED2, 0);
	PLED3->Control(PLED3, 0);
}

整体源代码(mdk4下调试编译通过,主控STM32F103RB)

硬件层

led.c

#include "led.h"


/*硬件层LED函数的初始化,返回值:-1失败,0:成功*/
int LED_Init(struct LEDDevice *ptLEDDevice)
{
	 static char ucLed=0;
	 GPIO_InitTypeDef GPIO_InitStruct; 
	
	if (!ptLEDDevice) /* 防御式编程:判断为空指针 */
		return -1;
	
	
	
  switch (ptLEDDevice->which)  /*选择使能哪个LED*/
	{
		case LED1:   
		{
		 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
		 break;
		}

		case LED2: 
		{
		 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
		 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
		 break;
		}

		case LED3: 
		{
		   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
			 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
			
			break;
		}
			default:
			return -1;
}
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);		
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct);															//数据引脚
	
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOD, &GPIO_InitStruct);															//锁存引脚
	
	GPIO_Write(GPIOC, ~ucLed <<8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);		

	return 0;
	}



int LEDControl(struct LEDDevice *ptLEDDevice, int iStatus)
{
	BitAction pinstate;
	
	if (!ptLEDDevice)
		return -1;

	pinstate = iStatus ? Bit_RESET : Bit_SET;
	
	switch (ptLEDDevice->which)
	{
		case LED1: 
		{
			GPIO_WriteBit(GPIOC,GPIO_Pin_8,pinstate);
			GPIO_SetBits(GPIOD,GPIO_Pin_2);/*锁存器*/
            GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
		   
			break;
		}

		case LED2: 
		{
		  GPIO_WriteBit(GPIOC,GPIO_Pin_9,pinstate);
		  GPIO_SetBits(GPIOD,GPIO_Pin_2);
          GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
			break;
		}

		case LED3: 
		{
		  
			GPIO_WriteBit(GPIOC,GPIO_Pin_10,pinstate);
			GPIO_SetBits(GPIOD,GPIO_Pin_2);
           GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
			break;
		}

		default:
			return -1;
	}

	return 0;
	
}


led.h

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"
#include "bsp_interface_led.h"
#include "bsp_device_led.h"

int LEDControl(struct LEDDevice *ptLEDDevice, int iStatus);/*LED控制函数*/
int LED_Init(struct LEDDevice *ptLEDDevice);

#endif

硬件接口层

bsp_interface_led.c

#include "bsp_interface_led.h"
#include "bsp_device_led.h"
#include "led.h"

/*硬件接口层的LED初始化函数*/
int Interface_LEDInit(struct LEDDevice *ptLEDDevice)
{
	/* 硬件层LED初始化函数 */
   return LED_Init(ptLEDDevice);
}
 
	/*硬件接口层的LED控制函数*/
int Interface_LEDControl(struct LEDDevice *ptLEDDevice, int iStatus)
{ 
	  /* 硬件层LED控制函数 */
		return  LEDControl(ptLEDDevice, iStatus);
}

bsp_interface_led.h

#ifndef __BSP_LED_INTERFACE_H
#define __BSP_LED_INTERFACE_H

#include "bsp_device_led.h"

int Interface_LEDInit(struct LEDDevice *ptLEDDevice);
int Interface_LEDControl(struct LEDDevice *ptLEDDevice, int iStatus);
	

#endif /* __BSP_LED_INTERFACE_H */

设备管理层

bsp_device_led.c

#include "bsp_device_led.h"
#include "bsp_interface_led.h"

/*设备管理层的LED初始化函数*/
int LEDDeviceInit(struct LEDDevice *ptLEDDevice)
{
	 	/*硬件接口层的LED初始化函数*/
   return Interface_LEDInit(ptLEDDevice);
}
 
/*设备管理层的LED控制函数*/	
int LEDDeviceControl(struct LEDDevice *ptLEDDevice, int iStatus)
{
	 /*硬件接口层的LED控制函数*/
	 return Interface_LEDControl(ptLEDDevice,iStatus);
}
	

 LEDDevice g_tLEDDevices[] = {
	{"LED1",LED1, LEDDeviceInit, LEDDeviceControl},
	{"LED2",LED2, LEDDeviceInit, LEDDeviceControl},
	{"LED3",LED3, LEDDeviceInit, LEDDeviceControl},
};
 

/*  C99标准可写成以下形式

 LEDDevice g_tLEDDevices[] = {
	{.name="LED1",
	 .which=LED1, 
	 .LEDDeviceInit=LEDDeviceInit,
	 .LEDDeviceControl=LEDDeviceControl},
	
	 {.name="LED2",
	 .which=LED2, 
	 .LEDDeviceInit=LEDDeviceInit,
	 .LEDDeviceControl=LEDDeviceControl},
	 
	 {.name="LED3",
	 .which=LED3, 
	 .LEDDeviceInit=LEDDeviceInit,
	 .LEDDeviceControl=LEDDeviceControl},
	};

 */


PLEDDevice GetLEDDevice(int which)
{
	if (which >= LED1 && which <= LED3)
		return &g_tLEDDevices[which];
	else
		return NULL;
}



bsp_device_led.c

#ifndef __BSP_LED_DEVICE_H
#define __BSP_LED_DEVICE_H

#ifndef NULL
#define NULL (void *)0
#endif

#define LED1 	  0
#define LED2  	  1
#define LED3 	  2



typedef struct LEDDevice {
	
	/* 设备名字 */
	char *name;
	
	/*选择哪个LED设备*/
	int which; /*这里不用io组与io口的形式,内部函数判断实现*/
	
	/*  初始化LED设备  参数:LED1-LED3 */
  int (*Init)(struct LEDDevice *ptLEDDevice);
	
	/* 控制LED设备, iStatus取值: 1-亮,0-灭 */
  int (*Control)(struct LEDDevice *ptLEDDevice, int iStatus);
	
	/* 设置颜色(未实现) */
	void (*SetColor)(struct LEDDevice *ptLEDDevice, int iColor);

	/* 设置亮度(未实现) */
	void (*SetBrightness)(struct LEDDevice *ptLEDDevice, int iBrightness);

}LEDDevice, *PLEDDevice;



PLEDDevice GetLEDDevice(int which);




#endif /* __BSP_LED_DEVICE_H */


应用层

void Led_test(void)
{
	PLEDDevice PLED1 = GetLEDDevice(LED1);
	PLEDDevice PLED2 = GetLEDDevice(LED2);
	PLEDDevice PLED3 = GetLEDDevice(LED3);

    PLED1->Init(PLED1);
	PLED2->Init(PLED2);
	PLED3->Init(PLED3);
	
    PLED1->Control(PLED1, 1); /*打开设备*/
    PLED2->Control(PLED2, 1);
	PLED3->Control(PLED3, 1);
}


源工程下载链接

git地址:https://gitee.com/he-dejiang/framework.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二)裸机开发框架构建之---点灯大师 的相关文章

  • 电子设计大赛-室内可见光定位装置

    室内可见光定位装置 1 1 设计任务 设计并制作可见光室内定位装置 xff0c 其构成示意图如图 1 所示 参赛者自行搭建不小于 80cm 80cm 80cm 的立方空间 xff08 包含顶部 底部和 3 个侧面 xff09 顶部平面放置
  • 嵌入式面试题

    首先给大家分享一个在线练习面试题的网站 xff1a 牛客网 该网站包含使用实例 应用技巧 基本知识点总结和需要注意事项 xff0c 具有参考价值 xff0c 需要的朋友可以参考一下 嵌入式面试题 点击进行练习 嵌入式面试题 第一部分 xff
  • ESP32 DIY 机器狗

    关注v x 公 众 号 xff1a 嵌入式基地 后 台 回 复 xff1a 电赛 即可获资料 回复 编程 即可获取 包括有 xff1a C C 43 43 C JAVA Python JavaScript PHP 数据库 微信小程序 人工智
  • 半桥与全桥的优缺点

    关注v x 公 众 号 xff1a 嵌入式基地 后 台 回 复 xff1a 电赛 即可获资料 回复 编程 即可获取 包括有 xff1a C C 43 43 C JAVA Python JavaScript PHP 数据库 微信小程序 人工智
  • 分享几个适合新手的C/C++开源项目

    分享几个适合新手的C C 43 43 开源项目 今天主要给大家分享一些github内适合初学者练手的c c 43 43 开源项目 所有项目均提供项目下载地址 xff0c 无法使用github的读者 xff0c 也可以在文末进行获取 如果说不
  • 树莓派VNC viewer显示cannot currently show the desktop的三种可能与解决办法(自己遇到过的)

    一 储存空间满了 var cache apt archives提示空间不够 xff0c 下线后再次连接VNC可能会黑屏 xff0c 改分辨率没有用 解决方法 xff1a sudo apt span class token operator
  • 程序员常用刷题网站分享

    1 牛客网 https www nowcoder com link pc csdncpt qrsjd c 该网站内集成了面试 题库 社群交流 课程教育 面试 招聘内推等多个模块 另外还是一个交流学习的平台 xff0c 在该网站经常会有大佬对
  • C语言刷题(二)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 牛客网
  • 嵌入式软件工程师面试题(八)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 嵌入式
  • 嵌入式软件工程师面试题(九)

    作者简介 xff1a 大家好我是 xff1a 嵌入式基地 xff0c 是一名嵌入式工程师 xff0c 希望一起努力 xff0c 一起进步 xff01 x1f4c3 个人主页 xff1a 嵌入式基地 x1f525 系列专栏 xff1a 嵌入式
  • 单片机、嵌入式的大神都平时浏览什么网站?

    单片机 嵌入式的大神都平时浏览什么网站 xff1f 1 基础学习 xff08 C C 43 43 xff0c Linux基础等 xff09 菜鸟教程 xff08 C语言学习 xff09 c语言中文网计算机科学网站 xff08 C语言部分 x
  • 一文读懂锁相环基本原理

    1 锁相环是什么 xff1f 锁相环电路是使一个特殊系统跟踪另外一个系统 xff0c 更确切的说是一种输出信号在频率和相位上能够与输入参考信号同步的电路 xff0c 它是模拟及数模混合电路中的一个基本的而且是非常重要的模块 2 锁相环基本理
  • 史上最全—毕业设计答辩技巧

    史上最全 毕业设计答辩技巧 一 常见问题二 答辩技巧三 论文答辩 图表穿插四 论文答辩 语流适中五 论文答辩六 论文答辩七 论文答辩八 论文答辩 紧扣主题九 论文答辩 人称使用十 完整版下载 一 常见问题 1 自己为什么选择这个课题 xff
  • 毕业设计答辩常见问题汇总

    毕设答辩常见问题汇总 1 P0 口需不需要加上拉电阻问题 xff1f 2 本课题的选课背景 意义等等 xff1f 3 数码管采用的是什么扫描方式 xff1f 4 蜂鸣器或继电器的驱动三极管为什么选用pnp型的 xff08 9012 8550
  • 【C语言】判断素数的函数

    文章目录 一 函数描述二 素数定义三 函数实现 一 函数描述 自定义一个函数 xff0c 传入一个整数n xff0c 判断是否为素数 若是返回1 xff0c 否则返回0 二 素数定义 素数又称质数 一个大于1的自然数 xff0c 除了1和它
  • 【C语言】判断闰年的函数

    文章目录 一 函数描述二 相关说明三 函数实现 一 函数描述 自定义一个函数 xff0c 传入一个年份n xff0c 判断是否为闰年 若是返回1 xff0c 否则返回0 二 相关说明 平年二月28 xff0c 闰年二月29 平年有365天
  • PX4串口驱动的三种方式:系统级操作、task/work_queue、类似PX4IO中断响应

    因为项目需要 xff0c 需在px4实现与stm32F407串口通信功能 xff0c 以200Hz双工交互数据 xff0c 所以探究了3种不同的串口驱动方式 三种方式概况参考了AcmeUavs公众号的文章 xff1a PX4 6 串口设备驱
  • 【C语言】求n的阶乘(递归法和循环法)

    文章目录 一 循环法二 递归法 一 循环法 根据阶乘的计算方法 xff1a n xff01 61 1 2 3 n xff0c 我们在一个for循环完成 n 次乘法运算 注意因为是连乘 xff0c 最终阶乘结果可能会非常大所以我们在Fac函数
  • 【C语言】数组排序方法总结

    一 冒泡排序 相邻元素两两比较 xff0c 按照要求交换位置 xff0c n个元素一共要比较n 1趟 xff0c 每趟要两两比较未排序元素个数 1次 span class token macro property span class to
  • 【C语言】通讯录实现

    通讯录功能 添加联系人信息 xff08 名字 xff0c 性别 xff0c 年龄 xff0c 电话号码 xff0c 家庭住址 xff09 输出指定联系人信息查找指定联系人信息修改指定联系人信息打印所有联系人信息对所有联系人 xff08 通过

随机推荐

  • 【C++】多态学习总结

    文章目录 一 多态的分类1 静态的多态2 动态的多态 二 多态的相关概念介绍及其实现1 虚函数2 虚函数的重写 xff08 覆盖 xff09 3 多态的构成条件4 C 43 43 11的 override 和 final5 重载 覆盖 重写
  • 【Linux】线程基础知识

    文章目录 一 什么是线程 xff1f 1 线程概念2 重新理解进程3 线程优缺点4 线程周期5 线程调度6 线程工作原理7 线程异常8 线程资源 二 为什么要有线程 xff1f 三 如何控制线程 xff1f 1 Linux支持的POSIX线
  • 【MySQL】数据库基础知识

    文章目录 一 什么是数据库二 为什么要有数据库三 数据库分类四 数据库的基本使用1 MySQL安装2 检查MySQL后端服务器是否启动3 连接MySQL服务器4 服务器 xff0c 数据库 xff0c 表关系5 数据存储逻辑 五 MySQL
  • 【C语言】typedef关键字

    文章目录 一 使用介绍1 对一般类型进行重命名2 对结构体类型进行重命名3 对指针进行重命名4 对数组进行重命名 二 typedef 和 define 的区别 一 使用介绍 typedef 的作用就是对类型进行重命名 xff0c 具体作用在
  • 【C语言】深入理解注释

    文章目录 一 预处理阶段对注释的处理二 注释使用时的注意事项1 C风格的注释无法嵌套使用2 基本注释注意事项3 注释导致的二义性 四 关于注释的一个使用建议 一 预处理阶段对注释的处理 我们知道一个源文件要变成可执行程序的话 xff0c 首
  • 【Java】数组

    文章目录 一 为什么要有数组 xff1f 二 什么是数组 xff1f 1 基本语法2 数组的本质 三 数组的使用1 获取长度 访问元素2 遍历数组3 下标越界 空引用4 数组作为函数参数5 数组作为函数返回值 四 数组拷贝1 手动拷贝2 使
  • 欧几里得算法的图形化理解

    欧几里得算法用于求两个数的最大公约数 xff0c 这篇博文力求以可视化的图形帮助读者理解欧几里得算法 首先 xff0c 简单介绍一下欧几里得算法 设a b N xff0c 我们规定gcd a b 代表a与b的最大公约数 欧几里得算法的实质是
  • PX4IO刷写BootLoader、固件 PX4IO固件损坏修复

    前两天玩坏了一个飞控的IO芯片 xff0c 具体表现为上电后红灯一直闪或常亮 xff0c 有以下解决办法 xff1a 文章目录 FMU给IO刷写重新烧写BootLoader FMU给IO刷写 先断电 xff0c 按住安全开关 xff0c 上
  • Maven版本3.6.1环境配置安装

    文章目录 前言一 操作步骤 xff1a 总结 前言 注意 xff1a 在换源时保持联网状态 xff0c 才能成功换成 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 操作步骤 xff1a 1 下载maven安装包
  • 蓝桥杯STM32F103RB数码管计时(秒表)

    STM32F103RB数码管定时 xff08 秒表 xff09 硬件单路 96 配置TIM2及其中断代码片如下 示例 96 96 中断执行函数代码片如下 示例 96 96 seg c 数码管 代码片如下 示例 96 完整工程下载 gt gt
  • 第七届蓝桥杯嵌入式(省赛)程序题

    第七届蓝桥杯 xff08 省赛 xff09 解读 43 程序 解读 xff1a 这里自己多读几遍设计任务以及要求再看下面 96 A 先搭总体框架 96 各初始化函数 96 LCD初始化 96 96 按键初始化 96 96 ADC初始化 96
  • STM32普通io口模拟pwm输出的三种方法

    STM32F103RB普通io口模拟pwm输出的第三种方法 xff08 周期占空比可调 xff09 第 xff08 一 xff09 种定时器中断产生pwm 96 第 xff08 一 xff09 种代码片 96 第 xff08 二 xff09
  • STM32 RS232通信实验

    stm32F103 RS232通信实验 什么是RS232 软件设计 完整工程下载 什么是RS232 先来看看UART传输所存在的问题 于是就有了RS232协议 这里注意使用的是负逻辑电平信号 在规定范围内的电平信号代表逻辑1或0 xff0c
  • MDK中变量无法添加到逻辑分析仪中原因

    MDK中变量无法添加到逻辑分析仪中原因 解决方法 去掉static 提示无法将变量添加到逻辑分析仪中 解决方法 去掉static 设置为bit 全速运行
  • 三,FreeRTOS之——动态创建多任务+优先级

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 动态创建多
  • ESP8266组网+STM32数据传输项目

    ESP8266 43 STM32数据传输项目 实验硬件 xff1a 项目关键词 xff1a 项目描述项目涉及知识 xff1a 1 ESP8266开发2 MQTT协议3 STM32 整体开发流程 xff1a 实验硬件 xff1a ESP826
  • 十一,FreeRTOS之——互斥信号量(优先级反转,优先级继承,递归锁)

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 互斥量理论
  • (一)裸机开发框架构建之---开发框架思想

    裸机开发框架构建 声明 xff1a 本专栏通过查阅资料以及自己对开发框架的理解所编写 xff0c 如有错误 xff0c 还请指正 为什么要使用框架 xff1f xff1f xff1f 我的框架分层思想体现 声明 xff1a 本专栏通过查阅资
  • PX4添加外置IMU传感器MPU-9250

    使用PX4 v1 13 2代码 xff0c 淘宝购买的MPU 9250传感器 MPU 9250 芯片架构图 实物图 手册 寄存器 https invensense tdk com wp content uploads 2015 02 RM
  • (二)裸机开发框架构建之---点灯大师

    裸机开发框架构建 3 设备管理层抽象出结构体初始化结构体第一种初始化方法 xff08 c89标准 xff09 第二种初始化方法 xff08 C99标准 xff09 2 硬件接口层1 硬件层硬件LED层初始化函数硬件层LED控制函数 4 应用