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学习总结(二)相关推荐

  1. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  2. STM32学习心得二十六:DAC数模转换实验

    记录一下,方便以后翻阅~ 主要内容: 1) DAC数模转换原理: 2) 寄存器和库函数介绍: 3) 相关实验代码解读. 实验功能:系统启动后,按WK_UP键,输出电压加200点,对应电压值200*3. ...

  3. STM32学习心得二十四:内部温度传感器原理及实验

    记录一下,方便以后翻阅~ 主要内容: 1) STM32内部温度传感器概述: 2) 相关实验代码解读. 实验功能:系统启动后,实时将内部温度传感器的值传至串口助手上. 官方资料:<STM32中文参 ...

  4. stm32学习(二)STM32F103ZET6内部资源讲解

    大家好,今天和大家分享一下STM32F103ZET6的板载资源,希望和大家一起学习,一起进步.当然本人目前是一个对库函数版本的初学者,如果谈论不妥的地方,希望大家能够及时提出,批评指正,本人将不胜感激 ...

  5. STM32学习(二)

    常用开发工具简介 安装仿真器驱动 DAP仿真器免驱 ST LINK仿真器驱动安装方法:(A盘)\6,软件资料\1,软件\5,其他软件\ST LINK驱动及教程 为什么要安装CH340 USB串口驱动? ...

  6. STM32学习笔记二:命令行工具安装

    一目了然 1 简述 2 Windows Terminal 安装 3 PowerShell7 安装 4 Cmake安装 5 ninja安装 1 简述 熟悉 Linux 系统的小伙伴都清楚 Termina ...

  7. STM32学习心得十九:电容触摸按键实验及相关代码解读

    记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...

  8. STM32学习心得十八:通用定时器基本原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容: 1) 三种定时器分类及区别: 2) 通用定时器特点: 3) 通用定时器工作过程: 4) 实验一:定时器中断实验补充知识及部代码解读: 6) 实验二:定时器PWM输 ...

  9. STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习

    记录一下,方便以后翻阅~ 主要内容: 1) 窗口看门狗概述: 2) 常用寄存器和库函数配置: 3) 窗口看门狗实验. 窗口看门狗实验内容: 为了对之前的知识进行总结复习,本人在教学案例的基础上又&qu ...

  10. STM32学习笔记:FLASH读写之二

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

最新文章

  1. MyBatis的动态SQL详解
  2. asp.net调用opencv类库,实现图像处理显示
  3. [Codeforces741D]Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths——dsu on tree
  4. 【原创】存储器设计思想——冯诺依曼结构和哈佛结构
  5. 百度黄埔学院学员开题 | ‘首席 AI 架构师’实战之旅开启!
  6. java 垃圾回收 null_java方法中把对象置null,到底能不能加速垃圾回收
  7. Java 包装类 自动装箱和拆箱
  8. 深入Java核心:JVM中的栈和局部变量
  9. 无法支持python程序的编辑运行和调试_python程序的调试方法
  10. Go Module 工程化实践(二):go get 取包原理篇
  11. elasticsearch sql插件 2.4及以下版本配置
  12. Visual Studio中删除所有空行
  13. 文件比较,忽略目录引起编译出错
  14. 2656 阿克曼函数
  15. iPhone各个机型屏幕尺寸
  16. C语言怎么等价汇编语言,第四章汇编语言程序结构.ppt
  17. 练习4闭合导线平差计算
  18. 记录某学校热水卡安全性研究
  19. MinIO客户端mc使用
  20. Power BI(十三)Power pivot之工作日计算

热门文章

  1. 解决 button 的背景图片被拉伸
  2. springcloud入门——config分布式配置中心
  3. 计算机组成原理复习笔记——二、数据的表示和运算
  4. python 实验八 函数 (上)
  5. 使用RTMP协议实现视频桌面共享功能
  6. math.floor javascript
  7. 超级牛人华为工作十年离职感想
  8. 大二实训(二)问答题
  9. 浙江工业大学计算机与软件学院,浙江工业大学计算机科学与技术学院、软件学院...
  10. MySql主从复制 Master-slaver