在学习各种外设的过程中,发现外设有一些通用的东西可以总结一下,后面发现再继续更新。图来源于正点原子的学习视频和PPT。
专栏目录:记录自己的嵌入式学习之路-CSDN博客
目录
1 外设的时钟的开启
每个外设要使用,就必须开启其时钟,开启时钟的函数调用格式为:
__HAL_RCC_PPP_CLK_ENABLE();
平时也可以随用随查,在stm32f1xx_hal_rcc.h中。
2 外设初始化的回调机制
初始化回调函数的一般定义格式:
void HAL_PPP_MspInit(…);
可以从外设的库.c文件中找。
在使用HAL库的外设初始化函数时,其会默认调用其对应的MSP回调函数。默认情况下MSP回调函数内容为空,且被__weak修饰,其作用是让用户对其进行重写,以实现用户的自定义配置功能。
在STM32官方例程(不是正点原子的例程)中,其在USER文件夹中有一个stm32f1xx_hal_msp.c专门用于存放重写的各外设MSP回调函数。但实际上这样做的话,该文件会过于臃肿,因此一般在外设的BSP文件夹对应的外设.c文件中进行重写。
3 外设的中断服务函数
在遇到外设中断时系统会自动调用,中断服务函数的一般定义格式是:
void PPP_IRQHandler(void);
在芯片的启动文件(如startup_stm32103xe.s)中从中断向量表中找。
而在中断服务函数中,用户需要调用HAL库公共中断数据处理函数,其一般调用格式为:
HAL_PPP_IRQHandler();
可以从外设的库.c文件中找。
4 HAL库中断回调机制
中断回调函数的一般定义格式:
HAL_PPP_xxxCallback(…);
可以从外设的库.c文件中找。
外设的中断服务函数中,同样调用了一个__weak修饰的回调函数,这个回调是系统用来给用户重写然后实现其在中断过程中执行的一些自定义操作的。如果觉得不方便重写,就直接在重写中断服务函数的时候调用自己的处理逻辑就行了,不重写回调也可以。
在官方例程(不是正点原子的例程)中,各外设的中断服务函数及其回调函数都是统一放在stm32_f1xx_it.c中。一般自己写项目也不放在这个文件中,太庞大和混乱了。
5 函数的常见传入参数类型
5.1 PPP_TypeDef*
外设PPP的基地址,如GPIO_A,可在芯片型号.h(如stm32f103xe.h)文件中找到。
5.2 PPP_InitTypeDef*
用于外设初始化的结构体指针,其中一般包含了该外设初始化所需要的参数和配置,需要用户对结构体中所有需要配置的成员进行配置(部分成员可能根据模式的不同,无需配置)。可在外设.h文件找到。
5.3 PPP_HandleTypeDef*
外设句柄,一般包含了一些初始化时需要用到的东西以及外设工作过程中的可变参数(Maybe)。可在外设.h文件找到。
一般句柄的结构体中只有前两个成员是需要进行手工初始化的,第一个是外设的基地址PPP_TypeDef,另一个是初始化结构体PPP_InitTypeDef。其他的有可能和外设工作过程中的东西有关。
5.4 XXX_IRQn
中断名称,可以去芯片名.h文件(如stm32f103xe.h)中找。
6 标志位操作
一般用于获取状态和清除状态。
6.1 获取标志位
__HAL_PPP_GET_FLAG()
用法如:
__HAL_RCC_GET_FLAG(RRC_FLAG_WWDGRST);
6.2 清除标志位
__HAL_PPP_CLEAR_FLAG
用法如:
__HAL_TIM_CLEAR_FLAG(&tim_ic_handle, TIM_FLAG_CC2);
7 外设源文件的导入
若需要使用某个库的时候发现Keil的Function(如下)没有对应的.c文件,那就意味着需要手动添加了。
手动添加步骤如下:
- Project中双击HAL_Driver文件夹(如下)
- 在真正的电脑文件夹中选中项目目录中HAL_Driver文件夹中需要用到的外设对应的.c文件,如下:
8 中断发生后需要手动重新开启中断的外设
- U(S)ART的Receive_IT中断
- DMA的传输完成中断
9 外设引脚的极性判断(高/低电平有效)
在原理图中,若引脚后有#号或者引脚名上有横线,就意味着该引脚低电平有效,如下图为低电平有效的写保护引脚以及低电平有效的片选引脚:
10 外设引脚的编号
一般切角、有小圆点(同时有一大一小的看小的那个)的为1号引脚,其他引脚按照逆时针顺序排列。还有一些特殊情况,参见这位大佬的文章: 芯片引脚1的识别方法和技巧_tps565201芯片 如何通过丝印确定第一脚-CSDN博客