新建工程文件夹
新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹。
- Drivers:存放与硬件相关的驱动层文件
- Middlewares:存放正点原子提供的中间层组件文件和第三方中间层文件
- Output:存放工程编译输出文件
- Projects:存放MDK工程文件
- User:存放HAL库用户配置文件、main.c、中断处理文件以及分散加载文件
Drivers文件夹
- BSP:存放开发板板级支持包驱动代码,如各种外设驱动
- CMSIS:存放CMSIS底层代码,如启动文件(.s文件)等
- SYSTEM:存放正点原子系统级核心驱动代码
Projects文件夹
该文件夹用于存放编译器(MDK、IAR等)工程文件,为了方便区分,在该文件夹下新建:MDK-ARM文件夹,用于存放MDK的工程文件。
- DebugConfig:用于存放调试设置信息文件(.dbgconf),不可删除!
- Listings:用于存放编译过程产生的链接列表等文件
- Objects:用于存放编译过程产生的调试信息、.hex、预览、.lib文件等
魔术棒设置
设置全局宏定义:STM32F103xE,用于定义所用STM32型号,在stm32f1xx.h里面会用到该宏定义。
设置优化等级为-O0,可以得到最好的调试效果。
勾选C99模式,即使用C99C语言标准。
AC5和AC6编译器对比
CMSIS
CMSIS(微控制器软件接口标准):Cortex Microcontroller Software Interface Standard,是由ARM和其合作的芯片厂商(ST、NXP)、软件工具厂商(KEIL、IAR),共同制定的标准。
- 用户层(用户代码)
- 中间层(CMSIS)
- 硬件层
HAL库简介
ST公司为了方便用户开发STM32芯片开发,提供了三种库:
- 标准外设库(Standard Peripheral Libraries)
- HAL库(硬件抽象层):Hardware Abstraction Layer
- LL库:Low Layer
不同方式的优缺点:
- 直接操作寄存器:执行效率高、时间成本高
- 标准库:F0/1/2/3/4L1,目前已停止维护
- HAL库:全系列兼容,ST目前主推的库,兼容性、易移植性
- LL库:全系列兼容,与HAL库捆绑发布,轻量级,效率高,不匹配部分复杂外设
STM32Cube固件包
STM32Cube固件包是ST公司根据CMSIS开发的固件包。
Drivers文件夹里又包含三个文件夹:
- BSP:板级支持包,用于适配ST官方的开发板(可参考)
- CMSIS:符合CMSIS的组件,包括:DSP库、Cortex-M内核及其设备文件、微控制器专用头文件、启动文件、专用系统文件等
- STM32F1xx_HAL_Driver:HAL库外设驱动源码,包括F1系列HAL库源文件和头文件
CMSIS标准规定软件包目录
- Driver:CMSIS驱动程序外设接口API的头文件
- Include:CMSIS-Core(Cortex-M)和CMSIS-DSP需要包括的头文件等
Device和Include文件夹的关键文件介绍
- stm32f1xx.h:是所有F1系列的顶层头文件,通过条件编译来包含某个芯片的头文件,定义通用的枚举类型,定义通用的宏定义。
- stm32f103xe.h:包含中断编号定义、外设寄存器结构体类型定义、寄存器映射、寄存器位定义、外设判定
- system_stm32f1xx.c/.h:定义了系统初始化函数SystemInit和系统时钟更新函数
- startup_stm32f103ex.s:大容量F103系列芯片的启动文件
HAL库文件夹结构
- HAL库和LL库驱动源码
- 用户手册
HAL库文件介绍
- stm32f1xx_hal.c/.h:HAL库初始化、系统滴答、HAL库延时等相关函数
- stm32f1xx_hal_conf.h:HAL库的用户配置文件,用于裁剪HAL库、配置晶振参数等
- stm32hxx_hal_def.h:包含HAL库通用的枚举类型数据和宏定义
- stm32f1xx_hal_cortex.h/.c:内核通用函数定义和声明,如NVIC、MPU、系统软复位、Systick,主要是对core_cm3.h文件的相关函数再次封装
- stm32f1xx_hal_ppp.c/.h:任意外设驱动源码,PPP表示任意外设
- stm32f1xx_hal_ppp_ex.c/.h:主要是存放外设的扩展功能的驱动源码,PPP表示任意外设
- stm32f1xx_ll_ppp.c/.h:LL库驱动源码,在部分stm32f1xx_hal_ppp.c或stm32f1xx_hal_ppp_ex.c中会被调用
HAL库回调函数
HAL_PPP_MspInit()/_DeInit()
该函数主要用于存放外设使用到的GPIO、CLOCK、NVIC、DMA等初始化代码
HAL_PPP_ProcessCpltCallback()
由于外设中断或DMA中断调用,HAL库中断公共处理函数已经实现对中断标记位读取、判断和清除操作,用户只需要专注于中断逻辑功能的实现即可
HAL_PPP_ErrorCallback()
外设或DMA中断中发生的错误,用于发生错误处理
HAL库的用户配置文件(stm32f1xx_hal_conf.h)
- 裁剪HAL库外设驱动源码(不进行编译)
- 设置外部高速晶振频率
- 设置外部低速晶振频率
stm32f1xx_hal.c文件
HAL_StatusTypeDef HAL_Init(void)
{
__HAL_FLASH_PREFETCH_BUFFER_ENBALE();//使能FLASH预取缓冲
HAL_NVIC_SetPrioorityGrouping(NVIC_PRIORITYGROUP_2);/*配置中断优先级分组*/
/*使用滴答定时器作为时钟基准,配置1ms滴答(时钟源为HSI)*/
HAL_InitTick(TICK_INT_PRIORITY);
HAL_MspInit();/* 初始化其它底层硬件(如果必要) */
return HAL_OK;
}
设置全局宏定义:USE_HAL_DRIVER和STM32F103xE