【专题1:电子工程师】 之 【4.stm32内核】
笔者在嵌入式领域深耕6年,对嵌入式项目构建,BLDC电机控制,产品上位机开发以及产品量产和产品售后维护有多年工作经验。经验分享,从0到1, 让我带你从实际工作的角度走进嵌入式成长之路。
原创不易,欢迎大家关注我的微信公众号:嵌入式工程师成长之路 或 扫下面二维码
所有文章总目录:【电子工程师 qt工程师 做产品过程中遇到的坑】
原创视频总目录:【电子工程师 qt工程师 做产品过程中遇到的坑】
1.CPU选型
1.1.概述
性能由低到高:cortex-M0–>cortex-M0±->cortex-M3–>cortex-M4–>cortex-M7(M7在智能家居上有应用)。
1.2.CPU选型需要考虑的因素
(1)CPU体积,譬如手持设备和车载设备的CPU体积选择可能就不一样。
(2)CPU的工作温度范围,存储温度范围。
- 商业级:0-70°
- 工业级:-40 - 85°
- 车规级:-40 - 120°
- 军工级:-40 - 150°
(3)可以进行长期供货的CPU厂家或者代理商。
(4)CPU的性能(频率 架构)。
(5)CPU的功耗,是电池供电还是交流转直流供电。
(6)CPU支持的接口。
(7)CPU的价格。
(8)CPU的上市时间和供货周期。
2.Cortex-M系列CPU的内核
2.1.架构
2.2.复位方式
- 上电复位:CPU、调试组件、外设都会被复位。
- 系统复位:CPU、外设会被复位,调试组件不会被复位。
- 处理器复位:只有CPU会被复位,外设和调试组件不会被复位。
2.3.复位时序
Cortex-M系列的CPU和经典的ARM7 CPU不一样,Cortex-M复位时,会先读取0地址处的值到MSP主堆栈指针中,然后才开始读取异常向量表里面的复位中断向量。这两步骤是CPU自动完成的。
2.4.启动代码
传统的单片机因为比较简单,其启动代码相对固定,所以被ic厂家直接固化到了芯片内部,所以在单片机开发时,一上来就是写C语言代码。但32位的MCU比较复杂,其初始化流程也比较复杂,也为了灵活性考虑,厂家就没有固化启动代码到ic内部,需要我们自己编写。
启动代码主要做了以下事情:
(1)初始化堆栈指针 SP;
(2)初始化程序计数器指针 PC;
(3)设置堆、栈的大小;
(4)设置中断向量表的入口地址;
(5)配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
(6)调用 SystemInit() 函数配置 STM32 的系统时钟;
(7)设置C库的分支入口“ __main”(最终用来调用 main 函数);
2.5.中断编程的步骤
(1)初始化中断源
(2)使能中断源/设置优先级
(3)实现中断服务函数
注意:
进入中断服务程序之后,功能代码执行完毕之后,需要清理中断,这种才能确保下一次有中断进来。
3.功耗管理
3.1.降低功耗的方法
口诀:不快就慢(降低主频),不用就关(关闭时钟,关闭外设供电)。
(1)降低CPU主频。
(2)降低外设功耗(关闭某些不用的外设、降低外设的工作频率、关闭液晶屏)。
3.2.RTC
RTC也是MCU内部的一个外设,主要用来计时/存储时间,类似于计数器。组成:晶振、RTC模块、电池。根据晶振频率,RTC每隔一定时间,计数器就会加1,然后将值存在RTC内部的寄存器中,即使主板关电了,电池也能对RTC模块继续供电。每次系统起来时,可以读取RTC内部的寄存器来获取时间。
3.2.资源介绍
(1)32bit、主频为72M、144个引脚(其中有112个IO引脚,大部分的IO口都耐5V(模拟管脚除外))、512K Flash、64kSRAM(这块存储都是集成在soc内部的,如果存储器容量不够,可以外扩)。
(2)2.0~3.6v电源供电。
(3)可外接4~16M的外部高速晶振,一般是外接8M的晶振,因为8M比较好计算延时。
(4)内部有一个8M的高速RC振荡器/晶振。所以外部晶振也不一定非要接,只不过用额外的晶振模块,会使芯片更加稳定。
(5)内部还要一个40KHz的低速RC振荡器,可以用作看门狗的时钟来源。
(6)内部有一个锁相环(PLL),可以进行时钟倍频,一般系统时钟都是通过外部晶振或内部高速振荡器经过PLL倍频得到。
(7)外部可以再接一个低速的32.768K的晶振,用来作为RTC的时钟。
(8)低功耗:有睡眠、停止和待机三种低功耗模式。可用电池为RTC和备份寄存器供电。
(9)MCU内部有3个12位的AD,每个AD多达21个通道。
(10)MCU内部有一个温度传感器,接在了AD的一个采样通道中。
(11)两个12bit的DA。
(12)12个DMA通道(7通道DMA1,5通道DMA2),支持外设:定时器、ADC、DAC、SDIO、I2S、SPI、I2C和USART。
(13)有11个定时器。
- 4个通用定时器
- 2个基本定时器
- 2个高级定时器
- 1个系统定时器
- 2个看门狗定时器
(14)13个通信接口。
- 2个I2C接口(可以接EEPROM/MPU6050陀螺仪/0.96寸OLED屏/电容屏)。
- 5个串口(可以接ESP8266/WIFI模块/GSM模块/蓝牙模块/GPS模块/指纹识别模块)。
- 3个SPI接口(串行FLASH/以外网模块W5500/VS1003/1053音频模块/SPI接口的OLED屏/电阻屏)。
- 1个CAN2.0接口。
- 1个USB FSMC。
- 1个SDIO。
注意:
通过查数据手册看哪个PIN支持哪种接口。
如果有FT存在,表示该引脚兼容5V,如果是TTA,表示该引脚(一般这类是模拟引脚)只支持3.3V。
3.STM32芯片架构
3.1.芯片架构
3.2.系统结构
AHB系统总系被分出了两个总线,APB1和APB2,APB2一般是72M,APB1一般是36M。在使用外设时,必须先开始其时钟。
4.STM32最小系统
最小系统组成:电源电路、复位电路、晶振电路和下载电路四部分组成。
存储器映射和操作寄存器: