HAL库
使用STM32Cube_FW_F3_V1.11.0软件包搭建模板
STM32Cube_FW_F3_V1.11.0\Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates
里面放的是启动文件startup_stm32f373xc.s和system_stm32f3xx.c
startup_stm32f373xc.s会调用SystemInit 函数
SystemInit 函数在文件 system_stm32f3xx.c 里面,主要实现 RCC 相关寄存器复位和中断向量
表位置设置。
系统启动流程:
第 1 步:系统上电复位,进入启动文件startup_stm32f373xc.s,在这个文件里面执行复位中断服务程序。
-
在复位中断服务程序里面执行函数 SystemInit,此函数在文件system_stm32f3xx.c 里面。
-
之后是调用编译器封装好的函数,比如用于 MDK 的启动文件是调用__main,最终进入到 main函数。
第 2 步:进入到 main 函数就可以开始用户应用程序编程了。在这个函数里面要做几个重要的初始化,依次是:
- HAL 库初始化函数 HAL_Init,需要用到文件 stm32f3xx_hal.c。
- 系统时钟初始化,需要用到库文件stm32f3xx_hal_rcc.c。
stm32f3xx_hal.c
基准电压大小配置,EXTI 配置,IO 补偿配置等都在这个文件里面设置。
- HAL库中各个外设驱动里面的延迟实现是基于此文件提供的时间基准,而这个时间基准既可以使用滴答定时器实现也可以使用通用的定时器实现,默认情况下是用的滴答定时器。
- 函数 HAL_Init 里面会调用时间基准初始化函数 HAL_InitTick,而调用函数
HAL_RCC_ClockConfig也会调用时间基准初始化函数 HAL_InitTick。 - stm32f3xx_it.c文件SysTick_Handler函数下添加:HAL_IncTick();则可以使用HAL库时间基准HAL_Delay
- 如果在中断服务程序里面调用延迟函数 HAL_Delay 要特别注意,因为这个函数的时间基准是基于滴答定时器或者其他通用定时器实现,实现方式是滴答定时器或者其他通用定时器里面做了个变量计数。如此一来,结果是显而易见的,如果其他中断服务程序调用了此函数,且中断优先级高于滴答定时器,会导致滴答定时器中断服务程序一直得不到执行,从而卡死在里面。所以滴答定时器的中断优先级一定要比它们高。
stm32f3xx_hal_rcc.c
主要是实现内部和外部时钟(HSE、HSI、LSE、LSI、PLL、CSS、MCO)以及总线时钟(SYSCLK、AHB1、AHB2、AHB3、APB1)的配置。
系统上电复位后,通过内部高速时钟 HSI 运行(主频 16MHz),Flash 工作在 0 等待周期,所有外设除了 SRAM、Flash、JTAG 和 PWR,时钟都是关闭的。
- AHB 和 APB 总线无分频,所有挂载这两类总线上的外设都是以 HSI 频率运行。
- 所有的 GPIO 都是模拟模式,除了 JTAG 相关的几个引脚。
系统上电复位后,用户需要完成以下工作:
- 选择用于驱动系统时钟的时钟源。
- 配置系统时钟频率和 Flash 设置。
- 配置分频器。
- 使能外设时钟。
- 配置外设时钟源,部分外设的时钟可以不来自系统时钟(I2S, RTC, ADC, USB OTGFS/SDIO/RNG)。
HAL_RCC_MCOConfig会用到HAL_GPIO_Init是配置 MCO1(PA8 引脚)和 MCO2(PC9 引脚)的时钟输出,工程上需要添加stm32f3xx_hal_gpio.c
stm32f3xx_hal_cortex.c
主要功能是 NVIC,MPU 和 Systick 的配置,里面的 API 其实就是将 ARM 的 CMSIS 库各种 API 重新封装了一遍。这么做的好处是保证了 HAL 的 API 都是以字母 HAL开头。
如下为HAL库驱动最小系统,后续需要什么外设添加什么外设
产品介绍
https://seeker.taobao.com/