STM32 MCUs 技术知识点合集
0 摘记
0.1 SMPS(开关电源)提供电源
选择MCU时一定要注意是否支持SMPS 电源供应,因为同型号同封装的MCU,支持SMPS和不支持的 PIN map有细微差,不完全兼容
0.2 各mcu datasheet的 ordering information 都有详细选型代码,标明是否支持SMPS
0.3 大部分同封装同pin数的mcu基本满足pin对pin兼容(GPIO,io复用功能或有不同),但要注意SMPS支持与否。
0.3.1 比如 同pin数LQPF封装的stm32f10xx stm32f4xx stm32L4x1~x6 ,R5/7, S5/7 基本都兼容,
但是R9和S9 因为支持camera就与前者有些许不兼容的地方。
0.3.2 这仅是对gpio而言,复用功能和特定功能没有考虑在列。
0.4 stm 系列的mcu ,BOOT1 一般都是 PB2
0.5 NVIC 和 SCB 的教程 atk的 《StM32F429 FreeRTOS 开发手册》 的4.1 章节
0.5.1 STM32 家族的MCU, 抢占优先级+次级优先级 合并 设定占 4bit
查询文件 stm32xxxx.h // xxxxx---> mcu具体型号
0.5.2 不同厂商的 mcu,NVIC 抢占优先级+ 次级优先级 自我设定
0.6 __MPU : 内存保护单元
0.7 自设文件,自定义项解析
0.7.1 global_def.h : 定义供所有mcu,所有项目使用公共宏
bsp_glbtree_xxx.h : 定义仅供指定开发平台使用的公共宏,如 _pdra,表示这些宏仅供Pandora 开发平台使用
mcu_sys_head.h :设置仅供本项目使用到的头文件 ,设备和变量等
0.7.2 BSP_BD_xx : 一般针对 开发平台 on board 板载的项
BSP_EX_xx : 一般针对 开发平台 outside board 板外扩展的
BSP_xxx_xC: 核心板板载
BSP_xxx_xM: 底板主板板载
MCU_xx : 针对 MCU内部设备
0.7.3 GPIO文件
0.7.3.1 MCU_GPIO MCU各接口模块的gpio配置api
0.7.4
0.8 关于 M4和M4F
第三方厂商会根据自己的产品线增加或裁剪 arm 给定的 cortex m核 内模组
带FPU(浮点数运算单元) 的 是 M4F; 不带的是 M4
当然这并不是严格规定的,stm带fpu 的 mcu ,有的资料标注是M4 ,有些则标注的是M4F
0.9 关于编译工具的宏定义
0.9.1 __CC_ARM ---> ARM Realview MDK
0.9.2 __ICCARM__ ---> IAR EWARM
0.9.3 __GNUN__ ---> GNU Compiler Collection
0.10 stm32xxxx.h(如stm32l4xx.h#237) 的 #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL)))
0.10.1 POSITION_VAL ---》获取VAL值的最高位位数
0.10.2
0.11 如果使用了 rtos,尽量不要频繁反复触发mcu的硬件中断(红外遥控就依赖硬件定时器的中断去扫描接收器,捕获信号)
0.12
1 SysTick 时钟配置,基于HAL库 :xxxx_hal_cortex.c
1.0 HAL_Init()执行时就执行使能了 systick时钟的程序,并装载了一个默认值,一直反复循环倒计时。
具体是 core_cm4.h中的内部api :SysTick_Config()
1.1 Systick底层寄存器结构体(core_cmx.h)
下图是野火《零死角玩转stm32》p152; 要注意的是《cortex-m3权威指南》p134页截取 , 该资料systick控制及状态寄存器的bit2的解释有误
1.2 时钟
1.2.0 来源
SysTick的时钟<----HCLK or HCLK/8<-----AHB<-----SYSCLK(mcu主频)
1.2.1 时钟选择 api (xxxx_hal_cortex.c)选择全频HCLK或者HCLK/8
1.2.2 参数 (xxxx_hal_cortex.h)
1.2.3 说明
SysTick->CTRL 的bit2 决定systick的时钟源来自哪里
1.2.3.1 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
表示取stm32 的HCLK (stm32f429的HCLK)
1.2.3.2 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
表示取stm32 的HCLK/8 (HCLK是72MHz,systick的时钟就是9MHz)
1.2.4 注意, stm32中文参考手册_v10.pdf p56 时钟树对systick的时钟源解释的有误,
1.3 底层systick产生中断的 时基 api:SysTick_Config(uint32_t ticks)的使用。(core_cmx.h)
该api 默认使用的是mcu主频时钟,并开启了systick中断服务
以stm32f429,180MHz主频为例,systick->val 减小1,耗时 1/180 us
如果要设置1us的中断时基,那么形参 ticks = 180;SysTick_Config(180) 就等于每1us产生一次中断
如果要设置1ms的中断时基,那么形参 ticks = 180000;SysTick_Config(180000) 就等于每1ms产生一次中断
1.4
1.5
2 stm32的启动模式(以stm32f429为例)
2.0 信息
2.0.1 参考资料《野火零死角玩转stm32f429》 p1002 第52章节
2.1 基本知识
2.1.1 图解
2.1.2 用户闪存启动,就是从mcu的内部flash启动,这是最常用的方式
2.1.3 系统存储器 启动 boot0/1 = (1,0)常用于 串口下载
下载软件
注意! F429的mcu不要使用这个软件下载
下载完程序后 把 boot0/1 调整到(0,x),然后按复位键,程序才启动
2.1.4 从mcu内嵌sram启动,一般用于调试
2.2
3 中断系统
3.1 前述
3.1.1 web
3.1.2
3.2 NVIC
3.2.0 前述
3.2.0.1 armv7-m 抢占优先级+次级优先级 设置位宽最高是 8bit
但是 STM32 MCUs, 抢占优先级+次级优先级 设置位宽是 4bit
查询文件 stm32xxxx.h // xxxxx---> mcu具体型号
3.2.0.2 armv7-m 最多可以设置8个 nvic group;
但是stm32 mcu 只有4个 NVIC_PRIORITYGROUP,
NVIC_PRIORITYGROUP_ x 由 SCB->AIRCR[10:8] 决定;
3.2.1 三要素:组NVIC_PRIORITYGROUP_x; 抢占优先级 ; 响应优先级(次级优先级)
NVIC_PRIORITYGROUP_0 0 0~15
NVIC_PRIORITYGROUP_1 0,1 0~7
NVIC_PRIORITYGROUP_2 0~3 0~3
NVIC_PRIORITYGROUP_3 0~7 0,1
NVIC_PRIORITYGROUP_4 0~15 0
优先顺序 0 > 1 …> 4 0 > 1 …> 15 0 > 1 …> 15
3.2.2 原则:
3.2.2.1 对于多cortexm核心的 stm32 mcu而言,组最优先,高组可以抢低阻;
3.2.2.2 同组高抢占可以抢占低抢占(可嵌套);同组同抢占级,高响应的先执行,低的后执行,
3.2.2.3 高响应级 不能抢占低响应(不可嵌套),要等待上一个执行完毕才可执行。
3.2.3 对于加入了FreeRTOS的pjt 而言,NVIC group 只能设置为 NVIC_PRIORITYGROUP_4
3.3
4 SCB :System Control Block
4.1 前述
4.1.1 相关定义所在文件 core_cmx.h
对 SCB->AIRCR 或 0x05fa0004 将会强行复位 MCU
4.1.2
4.1.3
4.2
5