STM32学习总结(二)
STM32学习总结(二)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- STM32学习总结(二)
- 一、STM32F407的电源,复位和时钟系统
- 1.电源
- 1.1 电源供电
- 1.2 电源去耦电容的选择
- 2 硬件复位
- 2.1 上电复位和手动复位
- 3 软件复位
- 4 RCC时钟控制
- 4.1 HSE和LSE硬件设计
- 4.2 时钟配置
- 二、STM32F407的GPIO基础知识
- 学前注意
- 1.GPIO功能简介
- 2.GPIO功能模式分析(重要)
- 2.1 推挽输出
- 2.2开漏输出
- 2.3 复用推挽和开漏
- 2.4 四种输入模式
- 3.GPIO的拉电流负载和灌电流负载能力
- 4.IO补偿单元,用于高速
- 5.GPIO兼容CMOS和TTL电平
- 6.不使用的引脚推荐设置为模拟模式
- 三、STM32F407必备的HAL库API(重要)
- 四、STM32F407之GPIO的HAL库API
一、STM32F407的电源,复位和时钟系统
1.电源
电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。
1.1 电源供电
1.2 电源去耦电容的选择
每个电源对 (VDD/VSS, VDDA/VSSA …)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。
2 硬件复位
所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。
所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。
当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。
如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。
2.1 上电复位和手动复位
STM32F407开发板的硬件复位原理图如下:
- STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。
- R84和C53组成简单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R84给C53充电,当C53的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。
- 在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。
- 当按下S4轻触开关时,C53两端被短路接地,可实现手动复位CPU。
— 注,根据需要,大家也可以使用STM32F407 NRST引脚的内部上拉:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93144
3 软件复位
除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm4.h文件提供,函数如下:
/**\brief System Reset\details Initiates a system reset request to reset the MCU.*/
__STATIC_INLINE void __NVIC_SystemReset(void)
{__DSB(); /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */__DSB(); /* Ensure completion of memory access */for(;;) /* wait until reset */{__NOP();}
}
软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:
4 RCC时钟控制
STM32F407有如下六种时钟可供使用:
HSI (High-speed internal oscillator) :
HSI是内部的高速RC振荡器,频率16MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。HSE (High-speed external oscillator):
HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-26MHz。优势是精度高,缺点是增加成本。LSE (Low-speed external oscillator)
LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。LSI (Low-speed internal oscillator)
LSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。
通过下面的时钟树再进一步的认识这几个时钟:
4.1 HSE和LSE硬件设计
- HSE时钟
当前V5开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:
晶振和负载电容需要尽可能近地靠近F4的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。
对于C46和C47,推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C46和C47通常具有相同的值。
这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V5板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到26MHz 的晶振 / 陶瓷谐振振荡器产生:
而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-26MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:
- LSE时钟
当前V5开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下:
STM32的LSE晶振起振难(又称RTC起振)是老毛病了,选取晶振和配套电容比较讲究,最好按照ST提供的厂家和配套电容选取:http://www.armbbs.cn/forum.php?mod=viewthread&tid=87673 。
4.2 时钟配置
STM32F4开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到168MHz的主频。
- 第1步:在stm32f4xx_hal_conf.h文件配置HSE_VALUE
配置的大小要跟板子的实际晶振大小匹配。
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
- 第2步:系统上电后,在启动文件startup_stm32f429xx.s的复位中断服务程序里面会调用函数SystemInit。
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT SystemInitIMPORT __mainLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP
以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下:
1. /**
2. * @brief Setup the microcontroller system
3. * Initialize the FPU setting, vector table location and External memory
4. * configuration.
5. * @param None
6. * @retval None
7. */
8. void SystemInit(void)
9. {10. /* FPU settings ------------------------------------------------------------*/
11. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
12. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
13. #endif
14. /* Reset the RCC clock configuration to the default reset state ------------*/
15. /* Set HSION bit */
16. RCC->CR |= (uint32_t)0x00000001;
17.
18. /* Reset CFGR register */
19. RCC->CFGR = 0x00000000;
20.
21. /* Reset HSEON, CSSON and PLLON bits */
22. RCC->CR &= (uint32_t)0xFEF6FFFF;
23.
24. /* Reset PLLCFGR register */
25. RCC->PLLCFGR = 0x24003010;
26.
27. /* Reset HSEBYP bit */
28. RCC->CR &= (uint32_t)0xFFFBFFFF;
29.
30. /* Disable all interrupts */
31. RCC->CIR = 0x00000000;
32.
33. #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
34. SystemInit_ExtMemCtl();
35. #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
36.
37. /* Configure the Vector Table location add offset address ------------------*/
38. #ifdef VECT_TAB_SRAM
39. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
40. #else
41. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
42. #endif
43. }
第12行:使能FPU单元。
第16 – 31行:复位RCC相关寄存器。
第69 – 73行:设置中断向量表的位置。
- 第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到168MHz。
二、STM32F407的GPIO基础知识
学前注意
- 学习本章节务必要认真学习并掌握2小节GPIO功能模式分析,学好它们,对后续章节中外设的学习大有裨益。
- 对于不使用的引脚,推荐设置为模拟模式,悬空即可。
- GPIO的速度等级高的时候,最好使能IO补偿单元。
- GPIO还涉及到一个注入电流的问题,此贴可以作为了解
1.GPIO功能简介
STM32F407的GPIO特性如下:
- 输出状态:开漏/推挽 + 上拉/下拉电阻。
- 通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。
- GPIO速度等级设置。
- 输入状态:浮空,上拉/下拉,模拟。
- 通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。
- 通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。
- 通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。
- 每两个时钟周期就可以翻转一次IO。
- 高度灵活的引脚复用功能,允许IO引脚既可以做GPIO也可以做功能复用。
2.GPIO功能模式分析(重要)
STM32F4的GPIO端口可以配置为如下的8种模式:
输入浮空
输入上拉
输入下拉
模拟功能
具有上拉或下拉功能的开漏输出
具有上拉或下拉功能的推挽输出
具有上拉或下拉功能的复用功能推挽
具有上拉或下拉功能的复用功能开漏
由于上拉和下拉是可选配置,对应的HAL库配置使用下面6种就可以表示:GPIO_MODE_INPUT 输入模式
GPIO_MODE_OUTPUT_PP 推挽输出
GPIO_MODE_OUTPUT_OD 开漏输出
GPIO_MODE_AF_PP 复用推挽
GPIO_MODE_AF_OD 复用开漏
GPIO_MODE_ANALOG 模拟模式
2.1 推挽输出
推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中。 电路工作时,两只对称的开关管每次只有一个导通,导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级提高电路的负载能力。 相对于开漏输出模式,推挽输出最大优势是输出高电平时,上升时间快,电压驱动能力强。
2.2开漏输出
开漏端相当于 MOS 管的漏极(三极管的集电极),要得到高电平状态必须外接上拉电阻才行,因此输出高电平的驱动能力完全由外接上拉电阻决定,但是其输出低电平的驱动能力很强。开漏形式的电路有以下几个特点:
- 输出高电平时利用外部电路的驱动能力,减少 IC 内部的驱动。
- 开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低,功耗越小。
- 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
- 可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑 0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为 0,只有都为高电平时,与的结果才为逻辑 1。
2.3 复用推挽和开漏
复用指的是GPIO切换到CPU内部设备(比如SPI,I2C,UART等电路),也就是GPIO不是作为普通IO使用,是由内部设备直接驱动。推挽和开漏的特征同上。
2.4 四种输入模式
通过上面的引脚结构图可以得到如下三种方式
- 浮空输入:CPU内部的上拉电阻、下拉电阻均断开的输入模式。
- 下拉输入:CPU内部的下拉电阻使能、上拉电阻断开的输入模式。
- 上拉输入:CPU内部的上拉电阻使能、下拉电阻断开的输入模式。
而模拟输入模式是GPIO引脚连接内部ADC。
3.GPIO的拉电流负载和灌电流负载能力
拉电流负载:一种负载电流从驱动门流向外电路,称为拉电流负载。比如使用STM32F4的GPIO直接驱动LED就是拉电流形式。
灌电流负载:负载电流从外电路流入驱动门,称为灌电流负载。比如下面这种形式的LED驱动电路。
有了上面这些知识后再来看STM32F407的IO驱动能力(截图来自STM32F407数据手册):
通过上面的截图可知:STM32F407单个引脚的最大拉电流和灌电流不可超过25mA。
4.IO补偿单元,用于高速
/** @defgroup GPIO_speed_define GPIO speed define* @brief GPIO Output Maximum frequency* @{*/
#define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< Low speed */
#define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< Medium speed */
#define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< Fast speed */
#define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< High speed */
不同的速度等级支持的最大时钟速度可以看此贴 。
5.GPIO兼容CMOS和TTL电平
CMOS和TTL电平兼容问题也是一个比较重要的知识点,参见此贴
6.不使用的引脚推荐设置为模拟模式
主要从功耗和防干扰考虑。
- 所有用作带上拉电阻输入的 I/O都会在引脚外部保持为低时产生电流消耗。此电流消耗的值可通过使用的静态特性中给出的上拉 / 下拉电阻值简单算出。
- 对于输出引脚,还必须考虑任何外部下拉电阻或外部负载以估计电流消耗。
- 若外部施加了中间电平,则额外的 I/O 电流消耗是因为配置为输入的 I/O。此电流消耗是由用于区分输入值的输入施密特触发器电路导致。除非应用需要此特定配置,否则可通过将这些I/O 配置为模拟模式以避免此供电电流消耗。 ADC 输入引脚应配置为模拟输入就是这种情况。
- 任何浮空的输入引脚都可能由于外部电磁噪声,成为中间电平或意外切换。为防止浮空引脚相关的电流消耗,它们必须配置为模拟模式,或内部强制为确定的数字值。这可通过使用上拉 / 下拉电阻或将引脚配置为输出模式做到。
综上考虑,不使用的引脚设置为模拟模式,悬空即可。
三、STM32F407必备的HAL库API(重要)
具体参考此贴
四、STM32F407之GPIO的HAL库API
具体参考此贴
STM32学习总结(二)相关推荐
- STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...
- STM32学习心得二十六:DAC数模转换实验
记录一下,方便以后翻阅~ 主要内容: 1) DAC数模转换原理: 2) 寄存器和库函数介绍: 3) 相关实验代码解读. 实验功能:系统启动后,按WK_UP键,输出电压加200点,对应电压值200*3. ...
- STM32学习心得二十四:内部温度传感器原理及实验
记录一下,方便以后翻阅~ 主要内容: 1) STM32内部温度传感器概述: 2) 相关实验代码解读. 实验功能:系统启动后,实时将内部温度传感器的值传至串口助手上. 官方资料:<STM32中文参 ...
- stm32学习(二)STM32F103ZET6内部资源讲解
大家好,今天和大家分享一下STM32F103ZET6的板载资源,希望和大家一起学习,一起进步.当然本人目前是一个对库函数版本的初学者,如果谈论不妥的地方,希望大家能够及时提出,批评指正,本人将不胜感激 ...
- STM32学习(二)
常用开发工具简介 安装仿真器驱动 DAP仿真器免驱 ST LINK仿真器驱动安装方法:(A盘)\6,软件资料\1,软件\5,其他软件\ST LINK驱动及教程 为什么要安装CH340 USB串口驱动? ...
- STM32学习笔记二:命令行工具安装
一目了然 1 简述 2 Windows Terminal 安装 3 PowerShell7 安装 4 Cmake安装 5 ninja安装 1 简述 熟悉 Linux 系统的小伙伴都清楚 Termina ...
- STM32学习心得十九:电容触摸按键实验及相关代码解读
记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...
- STM32学习心得十八:通用定时器基本原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容: 1) 三种定时器分类及区别: 2) 通用定时器特点: 3) 通用定时器工作过程: 4) 实验一:定时器中断实验补充知识及部代码解读: 6) 实验二:定时器PWM输 ...
- STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习
记录一下,方便以后翻阅~ 主要内容: 1) 窗口看门狗概述: 2) 常用寄存器和库函数配置: 3) 窗口看门狗实验. 窗口看门狗实验内容: 为了对之前的知识进行总结复习,本人在教学案例的基础上又&qu ...
- STM32学习笔记:FLASH读写之二
因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...
最新文章
- MyBatis的动态SQL详解
- asp.net调用opencv类库,实现图像处理显示
- [Codeforces741D]Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths——dsu on tree
- 【原创】存储器设计思想——冯诺依曼结构和哈佛结构
- 百度黄埔学院学员开题 | ‘首席 AI 架构师’实战之旅开启!
- java 垃圾回收 null_java方法中把对象置null,到底能不能加速垃圾回收
- Java 包装类 自动装箱和拆箱
- 深入Java核心:JVM中的栈和局部变量
- 无法支持python程序的编辑运行和调试_python程序的调试方法
- Go Module 工程化实践(二):go get 取包原理篇
- elasticsearch sql插件 2.4及以下版本配置
- Visual Studio中删除所有空行
- 文件比较,忽略目录引起编译出错
- 2656 阿克曼函数
- iPhone各个机型屏幕尺寸
- C语言怎么等价汇编语言,第四章汇编语言程序结构.ppt
- 练习4闭合导线平差计算
- 记录某学校热水卡安全性研究
- MinIO客户端mc使用
- Power BI(十三)Power pivot之工作日计算