● 复位
共有三种类型的复位:系统复位、电源复位和备份域复位。
系统复位:除了时钟控制寄存器CSR中的复位标志和备份域寄存器,系统复位会将其它全部寄存器都复位为复位值。
只要发生以下事件之一,就会产生系统复位:
1. NRST 引脚低电平(外部复位):NRST引脚电平拉低。
2. 窗口看门狗计数结束( WWDG 复位)
3. 独立看门狗计数结束( IWDG 复位)
4. 软件复位( 内核软复位):将Cortex-M4内核的应用中断和复位控制寄存器(SCB_AIRCR)中的SYSRESEREQ(sys_reset_eq)位置1
5. 低功耗管理复位
引发低功耗管理复位的方式有两种:
1. 进入待机模式时产生复位:此复位的使能方式是清零用户选项字节中的 nRST_STDBY 位。使能后,只要成功执行进入待机模式序列,器件就将复位,而非进入待机模式。
2. 进入停止模式时产生复位:此复位的使能方式是清零用户选项字节中的 nRST_STOP 位。使能后,只要成功执行进入停止模式序列,器件就将复位,而非进入停止模式。
电源复位:将除备份域内的寄存器外,其他所有寄存器复位。
MCU内部的复位信号会在NRST引脚上输出,脉冲发生器会确保每个内部复位源的复位脉冲都至少持续20us
复位条件:1.上电/掉电/欠压复位; 2.退出待机模式复位。
备份域复位:备份域复位会将所有RTC寄存器和RCC_BDCR寄存器复位,但BKPSRAM不受影响。BKPSRAM的唯一复位方式是通过FLASH接口将FLASH保护等级从1切换到0。
备份域复位条件:
1. 软件复位,通过将 RCC 备份域控制寄存器 (RCC_BDCR) 中的 BDRST 位置 1 触发。
2. 在电源 VDD 和 VBAT 都已掉电后,其中任何一个又再上电。
●时钟(重要)
外设在使用之前,都要使能相应的时钟使能位。因为要正常使用外设,需要时钟信号进行驱动。
● STM32F407时钟树
STM32F4芯片有五个时钟来源:
低速内部时钟(LSI):是由STM32内部集成的RC(电阻-电容)振荡器产生的。(RC振荡器是内部集成的一种低速振荡器,主要用于提供低功耗的基准时钟信号,通常工作频率为32kHz。)LSI可作为低功耗时钟源在停机和待机模式下保持运行,供独立看门狗 (IWDG) 、自动唤醒单元 (AWU) 和实时时钟(RTC)使用。LSI可通过 RCC 时钟控制和状态寄存器 (RCC_CSR) 中的 LSION 位打开或关闭。如在RCC时钟中断寄存器 (RCC_CIR) 中使能中断,则可产生中断。
低速外部时钟(LSE):外接一个精确的32.768 kHz 低速外部晶振或陶瓷谐振器产生的(晶振产生的频率的稳定性非常高),可作为实时时钟外设 (RTC) 的时钟源来提供时钟/日历或其它定时功能,具有功耗低且精度高的优点。
高速内部时钟(HSI):也是由STM32内部集成的RC(电阻-电容)振荡器产生的。频率为16MHz。它可以为MCO1提供时钟来源,可以作为系统时钟(SYSCLK)的来源,还可以作为主PLL的时钟源。
高速外部时钟(HSE):有 2 个时钟源:HSE 外部晶振/陶瓷谐振器;HSE 外部用户时钟。通过外接晶振产生(范围是4-26MHz,本开发板接的8MHz)。当使用有源晶振时,时钟从OSC_IN 引脚进入,OSC_OUT 引脚悬空;当选用无源晶振时,时钟从OSC_IN 和OSC_OUT进入,并且要配谐振电容。当HSE 故障时,高速的内部时钟信号HSI会作为备用的系统时钟,直到HSE恢复正常。HSE 的特点是精度非常高。可作为系统时钟(SYSCLK)的来源,可为主PLL倍频器模块提供时钟源,可作为实时时钟外设 (RTC) 的时钟源,可为MCO1和MCO2提供时钟源。HSE 晶振可通过 RCC 时钟控制寄存器 (RCC_CR) 中的 HSEON 位打开或关闭。
PLL锁相环模块(PLL):PLL锁相环模块通过对HSI或HSE时钟进行倍频和分频处理,可以得到高频、稳定的时钟信号,以满足复杂应用对时钟精度和频率的要求。主PLL可以作为系统时钟(SYSCLK)的来源,产生的PLL48CK时钟给USB模块使用。除了主PCC外还有一个给I2S专用的PLLI2SCLK。(I2S时钟可由外部的时钟引脚I2S_CKIN输入,也可由专用的PLLI2SCLK提供。)
PLL时钟计算方法:假定PLL的输入时钟(个人叫法,非官方)为f。
PLLCLK=。当系统时钟选用168MHz大小的时钟时候,就是使用PLLCLK作为时钟源。HSE或者HSI经过PLL 时钟输入分频因子M(2~63)分频后,成为VCO 的时钟输入,VCO 的时钟必须在1~2M 之间,STM32F407选择HSE=8M作为PLL 的时钟输入,M 设置为8,那么VCO输入时钟就等于1M。PLLCLK=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz。(HSE=8MHz),即F407 最高可超频到168M。
系统时钟(SYSCLK)有三个时钟来源:HSI,HSE,PLLCLK。具体的由时钟配置寄存器RCC_CFGR的SW位配置。
AHB 总线时钟HCLK:系统时钟SYSCLK经AHB预分频器分频后得到的时钟叫AHB总线时钟,即HCLK。HCLK再通过分频器得到其他外设所需的时钟,片上大部分外设的时钟都是经过HCLK分频得到。
APB2 总线时钟HCLK2:APB2 总线时钟PCLK2 由HCLK经高速APB2 预分频器得到。HCLK2属于高速的总线时钟,片上高速的外设挂载到这条总线上,比如全部的GPIO、USART1、SPI1等。
APB1 总线时钟HCLK1:APB1总线时钟PCLK1 由HCLK经过低速APB1 预分频器得到。HCLK1属于低速的总线时钟,最高为45M,片上低速的外设就挂载到这条总线上,比如USART2/3/4/5、SPI2/3,I2C1/2等。
PHY以太网时钟:
STM32F4要想实现以太网功能,除了有本身内置的MAC之外,还需要外接一个PHY芯片。当使用RMII接口时,PHY芯片只需输出一路时钟给MCU即可。如果是MII接口,PHY芯片则需要提供两路时钟给MCU。
USB PHY 时钟:
stm32F4的USB没有集成PHY,必须外置USB PHY 芯片。当外接USB PHY芯片时,PHY芯片需要给MCU提供一个时钟。
STM32F4时钟信号输出MCO1(PA8),和MCO2(PA9):(MCO最大输出时钟不超过100MHz),MCO是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。
MCO1:用户可以配置预分频器(1-5),向MCO1引脚PA8输出4个不同的时钟源:HSI,LSE,HSE,PLL。
MCO2:用户可以配置预分频器(1-5),向MCO2引脚PA9输出4个不同的时钟源:HSE,PLL,SYSCLK, PLLI2S。
AHB和APB区分:
AHB和APB是两种不同的总线协议。
AHB是高级高性能总线。AHB总线连接了存储器和处理器核心,用于高速传输数据和指令。AHB总线的时钟频率由主时钟频率分频器控制,可以达到最高主频的1/1、1/2、1/4或1/8。AHB总线一般用于连接主存储器、DMA等高速外设。
APB是高级外设总线。APB总线连接了低速外设,如串口、SPI、I2C、定时器等,供它们传输数据。APB总线的时钟频率由主时钟频率分频器控制,一般取决于外设的工作频率和性能要求。在STM32系列中,APB总线被分为APB1和APB2两个部分,以支持更多的外设。
AHB总线和APB总线的主要区别在于它们所连接的外设种类和速度等级不同。AHB总线连接的是高速外设,而APB总线连接的是相对较慢的外设。
STM32系列微控制器提供多个时钟源的原因:为满足不同应用场景和需求。首先,STM32微控制器需要提供高精度、稳定的时钟信号。实际应用中,不同的应用场景需要不同时钟精度,而不同时钟精度可通过不同时钟源实现。其次,不同的时钟源可以提供不同的时钟频率或时钟分频器,以满足不同的功耗要求、应用复杂度、通信速率等方面需求。然后,STM32微控制器提供了多个时钟源是为了方便集成外部时钟源。通过提供多个时钟源,STM32可以很容易地与外部时钟源(例如晶体振荡器)进行集成,以提供更精确的时钟信号。总之,STM32提供多个时钟源是为了满足不同的应用需求,包括时钟精度、功耗、应用复杂度、通信速率等方面的要求,同时也方便用户进行外部时钟源的集成。
● STM32F4外设挂载总线框图
● STM32F407-RCC寄存器(常用)
RCC 时钟控制寄存器 (RCC_CR):主要用于配置和控制处理器系统时钟的源、频率、分频和开关等参数。使能时钟源并等待它就绪。
RCC PLL 配置寄存器 (RCC_PLLCFGR):主要用于配置RCC的PLL多路复用器的参数。
RCC 时钟配置寄存器 (RCC_CFGR):设置一些分频系数和时钟源的选择。
RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
RCC AHB2 外设时钟使能寄存器 (RCC_AHB2ENR)
RCC AHB3 外设时钟使能寄存器 (RCC_AHB3ENR)
● 常用RCC库函数
RCC_AHBPeriphClockCmd():使能/失能AHB外设时钟
RCC_APB2PeriphClockCmd():使能/失能APB2外设时钟
RCC_APB1PeriphClockCmd():使能/失能APB1外设时钟
RCC_HSICmd():使能/失能HSI晶振 RCC_PLLConfig():设置PLL时钟源及倍频系数
RCC_PLLCmd():使能/失能PLL输出 RCC_SYSCLKConfig():设置系统时钟SYSCLK
RCC_HCLKConfig():设置AHB总线时钟HCLK RCC_PCLK1Config():设置低速APB时钟PCLK1
RCC_PCLK2Config():设置高速APB时钟PCLK2 RCC_USBCLKConfig():设置USB时钟
RCC_ADCCLKConfig():设置ADC时钟 RCC_LSEConfig():设置LSE晶振
RCC_LSICmd():使能/失能LSE晶振 RCC_RTCCLKConfig():设置RTC时钟
RCC_RTCCLKCmd():使能/失能RTC时钟 RCC_GetClocksFreq():返回不同片上时钟的频率
RCC_BackupResetCmd():强制/释放后备域复位 RCC_HSEConfig():设置HSE晶振
RCC_GetSYSCLKSource(): 返回用作系统时钟SYSCLK的时钟源
RCC_ITConfig():使能/失能指定的RCC中断
RCC_GetITStatus(): 检查指定的RCC中断是否发生
RCC_ClearITPendingBit():清除RCC的中断待处理位
RCC_GetFlagStatus():检查指定的RCC标志位是否设置