CMSIS文件夹:
最近看了几个开发板厂的STM32F1系列的HAL库工程代码。发现关于时钟配置单独手写了一个,对于用惯了标准库的产生一个疑问,时钟配置不都自带的文件里配置好了,非特殊甚至直接拿来用就行。为什么要单独手写了一个呢?从启动文件往下捋,发现HAL库自带的system_f1xx.c里还真有时钟配置函数,头文件也声明了。但是sym32f1xx.h没有加入.....原因未知。好吧,明白了咋回事,觉得需要先捋一捋文件的关系,HAL库文件关系不用对比了。重要是对比一下CMSIS里的文件关系。
再大概的进行一下代码接口大的对比吧。
一.外部中断:
我们看库里面,HAL库不再有类似stm32f1xx_hal_exit.c的文件。
HAL库中EXIT已经归类到GPIO类,只剩下中断回调和清理标志两个函数。
二.串口
1.HAL库进一步将协议和硬件分离。对具体MCU底层硬件相关的配置如引脚、时钟、 DMA、中断等是在HAL_UART_MspInit(UART_HandleTypeDef *huart) 函数中完成的,该函数被 HAL_UART_Init 函数所调用。与标准库不同,HAL_UART_Init 函数里__HAL_UART_ENABLE完成了串口的使能。
2. HAL_UART_Transmit函数与标准库的发送函数不一样,虽然都是死循环,但是hal里加入了长度.超时等一系列封装的代码。
三.DMA
DMA参数配置中dir方向配置参数相对标准库增加DMA_MEMORY_TO_MEMORY模式,去删掉了结构体中DMA_M2M的配置成员。
HAL库将源数据内存地址设置,目的数据内存地址设置,数据量设置,dma使能统一封装到了HAL_DMA_Start函数。HAL_UART_Transmit_DMA的函数的功能和HAL_DMA_Start函数类似,设置源数据内存地址和数据量以及DMA使能设置,最后向DMA发出TX请求。
__HAL_DMA_CLEAR_FLAG清理标志位。
四.TIM基本定时器
基本的架构思想都差不多,硬件层和用户层/协议栈分离(个人理解)。
对具体MCU底层硬件相关的配置如时钟、中断等是在HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) 函数中完成的,该函数被 HAL_TIM_Base_Init函数所调用。与标准库不同,HAL库是在HAL_TIM_Base_Start_IT(&htimx);完成的使能,配置在中断模式下启动定时器。
HAL_TIMEx_MasterConfigSynchronization配置了主定时器的同步功能
sMasterConfig.MasterOutputTrigger设置主定时器的输出触发模式,输出触发信号:在主模式下向从定时器发送的同步信息(TRGO)。
TIM_MASTERSLAVEMODE_DISABLE禁用主从模式,即该定时器不会作为其他定时器的主定时器。