STM32 新建寄存器版本MDK工程简要步骤

新建工程文件夹

新建一个工程根目录文件夹,并在该文件夹里新建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),共同制定的标准。

  1. 用户层(用户代码)
  2. 中间层(CMSIS)
  3. 硬件层

HAL库简介

ST公司为了方便用户开发STM32芯片开发,提供了三种库:

  1. 标准外设库(Standard Peripheral Libraries)
  2. HAL库(硬件抽象层):Hardware Abstraction Layer
  3. LL库:Low Layer

不同方式的优缺点:

  1. 直接操作寄存器:执行效率高、时间成本高
  2. 标准库:F0/1/2/3/4L1,目前已停止维护
  3. HAL库:全系列兼容,ST目前主推的库,兼容性、易移植性
  4. 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)

  1. 裁剪HAL库外设驱动源码(不进行编译)
  2. 设置外部高速晶振频率
  3. 设置外部低速晶振频率

stm32f1xx_hal.c文件

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

相关推荐
智商偏低5 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen6 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森8 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白8 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D8 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术11 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt12 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘12 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang12 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n15 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件