【STM32】时钟系统
在我们学习STM32之前,我们需要先了解STM32系列芯片的时钟系统,这个是我们学习这个芯片的基础。为什么时钟系统这么重要呢?举个例子,如果把STM32比作我们的整个人体,那么时钟就是维持我们人体正常工作的心脏。STM32芯片是一块高度集成的芯片,里面的每个器件工作需要有一个统一的信号,而这个规定某个电路在特定的时间段做合适的事情的信号就是时钟。而复位可以理解为是刷新,也就是重生。
注意:这里我们主要针对的是STM32F1系列的单片机!!!
目录
⚙时钟系统
首先要产生时钟信号,需要有一个产生信号的源头,在STM32里面,总共有三个可以作为系统时钟(SYSCLK)的时钟源:HSI振荡器时钟、HSE振荡器时钟和PLL时钟。除了上面主要用到的时钟源外,还有二级时钟源,主要用于特殊的功能,这些二级时钟源包括40kHz的低速内部RC时钟和32.768kHz的低速外部晶体。RC可以用于驱动看门狗和实时时钟、低速的外部晶体可以用来驱动RTCCLK,这些时钟源如果不用的话可以选择性关闭以节约能耗。
接下来就是最让人头皮发麻的时钟树了:
📻时钟源系统
关于这个时钟树我们分两部分来看,一部分是时钟产生源,另一部分是变频部分。首先我们先来看时钟产生源,这里为了方便,我先把时钟产生源部分给提取出来:
首先我们从上往下看,首先出现的是“8MHz HSI RC”的方框,结合我们上面的理解,以及右下角的图例解释,这个就是单片机的内部时钟源HSI,它能够通过振动电路产生8MHz的时钟信号,它产生的8MHz信号有两个去处,一个是“/2”之后给PLLSRC,另一个就是直接给SW。这里的“/2”就是将8MHz的信号进行二分频,也就是变成4MHz后给PLLSRC作为PLL的时钟输入,所以实际上PLL这个源并不能自己产生时钟信号,它是通过接收别人产生的振荡信号进行处理产生时钟源的。那为什么需要PLL呢?我们再从PLLSRC往右看,可以很明显看到它有一共PLLMUL的方框,它里面主要是“×16,×2,×3等”,结合前面我们对“/2”的理解,这个很明显就是进行倍频,也就是说将我们输入的时钟信号进行倍乘处理。综合上面的理解,不难看出其实PLL就是为了给时钟信号进行倍频的一个时钟源。值得注意的是,因为HSI是经历了二分频再给的PLL,所以PLL经历倍频后出来最多也就是8MHz / 2(HSI是先除二再给的PLLSRC)× 16(PULLMUL阶段的倍频) = 64MHz。而PLLMUL右边一个旋转90°的梯形框SW就是对系统时钟信号SYSCLK的信号源进行选择的选择器,系统时钟SYSCLK有三个输入的时钟源,HSI、PLLCLK(PLL)和HSE,这也与前面相对应。
我们继续从左边往下看(跳过CSS方框先),就能够看到一个写着“4-16MHz HSE OSC”的放框,这个就是外部高速时钟信号HSE,它可以是外部晶振(如陶瓷谐振器)的振荡信号或者用户从引脚自定义的时钟输入信号。我们可以通过外部晶振接到OSC_IN和OSC_IN口来给单片机输入外部时钟信号,时钟信号的输入范围是4-16MHz,如果我们需要用HSE,那么需要控制相应的寄存器RCC_CR的HSEON位来启动。这个外部高速时钟除了可以像HSI一样给系统用和二分频(或者不二分频,由PLLXTPRE选择)后给PLL进行倍频以外,还可以除以128变成低速频率信号给RTC实时时钟用。
看完了HSI、HSE和PLL后,我们接下来看看LSI和LSE,这两个分别表示内部低速时钟和外部低速时钟。容易看出,内部的低速时钟HSI就是一个大约40kHz的振荡信号,它可以作为独立看门狗的时钟信号,也可也作为RTC内部实时时钟的输入时钟源之一。而LSE外部低速时钟就是一个32.768kHz输入的时钟信号,它由OSC32_IN和OSC32_OUT输入,它也可以作为RTC的时钟源之一。
其实HSI、HSE、PLL、LSI和LSE这五个时钟源不仅可以作为驱动信号,其中HSI、HSE、SYSCLK和PLLCLK/2还可以输出,这个输出就通过MCO选择器进行选择后输出到MCO引脚。这个输出在C8T6里面就是PA8引脚。
最后我们来看看CSS,时钟安全系统。它的作用是如果HSE发生故障,那么CSS会通过TIM1的刹车输入端产生中断CSSI,CSSI连接中断NMI,所以会产生不可屏蔽中断NMI,并且不断执行中断NMI,直至通过CSSC位清除NMI,此时需要将系统时钟的来源从故障的外部时钟源HSE切换到安全的内部时钟源HSI。
关于每个时钟源都有更为详细的解释,具体可以参考STM32F10XX参考手册57-59页。
📻变频系统
在整个时钟树系统中,除了时钟源外,还有一共很重要的部分就是变频的部分,这个部分是将时钟源输入的时钟信号进行变频,将不同的时钟信号输出给不同的外设中。在整个时钟树中,变频系统主要结构如下图所示:
从上面的图中不难看出,其实大部分的外设都是通过系统时钟作为时钟源的,只有USB是只选择PLLCLK作为时钟信号的,而USB所需的时钟信号的频率为48MHz,它是经过PLL后再经过USB预分频器分频而来。
我们主要来看时钟源是系统时钟的部分(先忽略I2S2和I2S3),SYSCLK系统时钟进去后首先经历AHB预分频器预分配,通过AHB预分频后它可以直接作为SDIO和FSMC两种外设的时钟,或者输出至AHB总线,核心的存储器和DMA;同时如果AHB输出的时钟信号RCC的频率的再经历8分频后的HCLK还可以成为内部芯片系统定时器(SysTick)的外部时钟。
除了上面的外设和内部核心以外,RCC经历AHB分频后,还可以再经过APB2和APB1两个预分频器进行分频,他们分别会作为高速总线APB2(最高速72MHz)和低速总线APB1(最高速36MHz)的时钟。其中挂载在APB2总线上面的外设:IO、部分USART、部分中断EXTI等都需要使用经历AHB和APB2预分频的时钟信号PCLK2;挂载在APB1总线上面的外设:I2C、部分USART、部分中断EXTI等都需要使用经历AHB和APB1预分频的时钟信号PCLK1。同时,如果APB1和APB2的预分频系数保持不变都是1,那么如果再将AHB输入到APB1和APB2预分频器的时钟信号✖2就是输入到定时器里面的时钟了。最后与APB1不同,APB2还可以作为ADC模数转换的时钟,不过需要先经历了AHB和ADC预分频器分频才能成为ADC的时钟信号ADCCLK。
📻时钟系统寄存器
当我们看完时钟系统的组成后,接下来就是如何去操控时钟系统了。关于如何去操控时钟系统主要是通过写控制数据到RCC寄存器,所以接下来我们主要来看时钟系统有哪些寄存器。
💻RCC_CR
这个是时钟控制寄存器,接下来我们主要来了解一下它的各个位的意义。
位25是PLLRDY位,它只支持读操作,它里面存储的是PLL时钟是否就绪的标志位,如果PLL的时钟已经就绪了,那么这个位就是1;
位24是PLLON位,它是开启时钟源PLL的使能位,如果写入1则表示使能PLL时钟源,如果进入待机或者停止后,这个位会被硬件清0,但是如果PLL是用作系统时钟,那么这个位就不会被清0。
位23到位20没有用到,保留且为0;
位19是CSSON位,它是是否使能CSS时钟安全系统的标志,如果软件置1开启,那么当外部HSE有输入,也就是输入就绪时,就会自动开启;
位18是HSEBYP位,它表示外部高速时钟旁路是否开启,
位17是HSERDY位,它表示HSE是否就绪的标志位,如果HSE已经就绪,那么该位就会被硬件自动置为1,所以该位只能读不能写;
位16是HSEON位,它表示是否开启外部高速时钟。同理,当待机或者停止时,该位会被硬件清零,如果是用作系统时钟时,就不能被清零;
位15到位8是HSICAL位,它的功能是内部高速时钟校准,系统启动时这些位会被自动初始化;
位7到位3是HSIRIM位,它的功能是内部高速时钟调整,可以通过这些位来对内部高速时钟进行调整,它是在HSICAL的基础上叠加进行进一步调整;
位2是保留位,且为0;
位1是HSIRDY位,它表示内部高速时钟已经就绪,1表示已就绪,0表示未就绪;
位0是HSION位,它表示内部高速时钟的使能开启功能,当从待机或者停止状态返回,又或者是系统外部时钟HSE发生故障时,它就会被置1。如果它是系统时钟,就不会被清0。
💻RCC_CFGR
这个是时钟配置寄存器,它主要配置是否进行倍频和变频操作。
位31到位27是保留位,为0;
位26到位24是MCO位,由它来选择芯片内部时钟输出的时钟源:
⚠注意!
系统时钟最高可以为72MHz,但是I/O口的速度最高为50MHz,所以MCO位输出的时钟信号最高只能为50MHz。
位22是USBPRE位,它表示PLL输入到USB预分分频器的预分频值,如果是1则对信号进行1.5倍频,如果是0则不变就是PLL直接作为USBCLK。
⚠注意!
如果使能了USB,那么就必须要保证这个位是有效的!
位21到位18是PLLMUL位,它是确定PLL的倍频系数的,使用前得先关闭PLL。
这4个位的数值和对应的倍频值如下图所示:
位17是PLLXTPRE位,它表示HSE选为PLL的输入频率,如果为1则选择HSE直接作为PLL的输入时钟源,如果为0则表示先将HSE二分频再作为输入时钟源;
位16是PLLSRC位,它表示PLL的输入时钟源选择,如果它是1则表示PLL的输入是HSI二分频后的RCC,如果是0则表示PLL的输入是HSE;
位15到位14是ADCPRE位,它表示ADC的预分频系数
这两个位的数值和对应的预分频系数的关系:
位13到位11是PPRE2位,它表示APB2总线的预分频值,必须保证它的时钟频率不超过72MHz:
它三个位数值和对应的预分频值的关系:
位10到位8是PPRE1位,它表示APB1总线的预分频值,必须保证它的时钟频率不超过36MHz:
它三个位数值和对应的预分频值的关系:
位7到位4是HPRE位,也就是对AHB的预分频值进行选择,这里有个注意事项是如果AHB的预分频系数大于1,俺么必须开启预取缓冲器:
它四个位数值和对应的预分频值的关系:
位3到位2是SWS位,它表示系统时钟切换状态的查询:
它两个位数值和系统时钟来源的关系;
位1到位0是SW位,它表示系统时钟切换选择;
它两个位数值和系统时钟来源的关系;
⚠注意!
SW和SWS两个是不同的,SW表示对系统时钟来源的选择,SWS是对系统来源时钟的查询,例如我成功设置了系统时钟来源是PLL,那么查询SWS的位即可看到是10
💻RCC_CIR
这个寄存器是时钟的中断寄存器,用以查询一些时钟就绪、故障等中断的标志位。
位23是CSSC位,它是清除时钟安全系统中断的操作位,从前面我们可以了解到的,如果HSE产生了故障,那么会触发安全中断,这个位就是在处理了故障后对中断标志位进行清除的操作位,如果该位为1则表示清除CSSF安全系统中的标志位CSSF;
位20是PLLRDYC位,它是清除PLL就绪中断的操作位;
位19是HSERDYC位,它是清除HSE就绪中断的操作位;
位18是HSIRDYC位,它是清除HSI就绪中断的操作位;
位17是LSERDYC位,它是清除LSE就绪中断的操作位;
位16是LSIRDYC位,它是清除LSI就绪中断的操作位;
位15到位13是保留位;
位12是PLLRDYIE位,它是PLL就绪中断使能位,当该位为1,则在PLL时钟就绪后开启中断;
位11是HSERDYIE位,它是HSE就绪中断使能位;
位10是HSIRDYIE位,它是HSI就绪中断使能位;
位9是LSERDYIE位,它是LSE就绪中断使能位;
位8是LSIRDYIE位,它是LSI就绪中断使能位;
位7是CSSF位,也就是时钟安全中断标志位,当系统时钟直接、间接为HSE,且HSE发生故障时,该位会被置1;
⚠注意!
这里的直接或者间接是指包含HSE直接输入到SW或者先输入到PLL再输入到SW的两种情况。
位4是PLLRDYF位,它是表示PLL已经就绪的中断标志位,通过查询该位可以查询PLL是否就绪,一般该位由硬件置1,软件清除,清楚就是通过PLLRDYC操作位;
位3是HSERDYF位,它是表示HSE已经就绪的中断标志位;
位2是HSIRDYF位,它是表示HSI已经就绪的中断标志位;
位1是LSERDYF位,它是表示LSE已经就绪的中断标志位;
位0是LSIRDYF位,它是表示LSI已经就绪的中断标志位。
💻RCC_APB2RSTR
这个是APB2外设的复位寄存器,总共由16个位被用到了。
位15表示ADC3RST,软件置1则表示ADC3接口复位;
位14表示USART1RST,软件置1则表示USART1通用同步异步收发口复位;
位13表示TIM8RST,软件置1则表示定时器TIM8复位;
位12表示SPI1RST,软件置1则表示SPI1复位;
位11表示TIM1RST,软件置1则表示定时器TIM1复位;
位10表示ADC2RST,软件置1则表示ADC2接口复位;
位9表示ADC1RST,软件置1则表示ADC1接口复位;
位8表示IOPGRST,软件置1则表示I/O端口G复位;
位7表示IOPFRST,软件置1则表示I/O端口F复位;
位6表示IOPERST,软件置1则表示I/O端口E复位;
位5表示IOPDRST,软件置1则表示I/O端口D复位;
位4表示IOPCRST,软件置1则表示I/O端口C复位;
位3表示IOPBRST,软件置1则表示I/O端口B复位;
位2表示IOPARST,软件置1则表示I/O端口A复位;
位1保留且为0;
位0表示AFIORST,软件置1表示辅助功能I/O复位。
💻RCC_APB1RSTR
这个是与APB1总线有关的外设的复位操作寄存器。
位29表示DACRST位,软件置1表示DAC数模转换接口复位;
位28表示PWRRST位,软件置1表示电源接口复位;
位27表示BKPRST位,软件置1表示备份接口复位;
位26保留且为0;
位25表示CANRST位,软件置1表示CAN总线复位;
位24保留且为0;
位23表示USBRST位,软件置1表示USB复位;
位22表示I2C2RST位,软件置1表示I2C2复位;
位21表示I2C1RST位,软件置1表示I2C1复位;
位20表示UART5RST位,软件置1表示UART5异步收发器复位;
位19表示UART4RST位,软件置1表示UART4异步收发器复位;
位18表示USART3RST位,软件置1表示USART3通用同步异步收发器复位;
位17表示USART2RST位,软件置1表示USART2通用同步异步收发器复位;
位16保留且为0;
位15表示SPI3RST位,软件置1表示SPI3复位;
位14表示SPI2RST位,软件置1表示SPI2复位;
位13到位12保留且为0;
位11表示WWDGRST位,软件置1表示窗口看门狗复位;
位10到位6保留且为0;
位5表示TIM7RST,软件置1表示定时器7复位;
位4表示TIM6RST,软件置1表示定时器6复位;
位3表示TIM5RST,软件置1表示定时器5复位;
位2表示TIM4RST,软件置1表示定时器4复位;
位1表示TIM3RST,软件置1表示定时器3复位;
位0表示TIM2RST,软件置1表示定时器2复位。
💻RCC_AHBENR
前面提及了APB1和APB2的复位寄存器,接下来看看与系统相关的AHB总线的外设时钟使能寄存器。
位10表示SDIOEN位,软件置1表示SDIO时钟使能;
位9保留且为0;
位8表示FSMCEN位,软件置1表示FSMC时钟使能;
位7保留且为0;
位6是CRCEN位,软件置1表示CRC时钟使能;
位5保留且为0;
位4是FLTFEN位,它是闪存接口电路的时钟使能位,软件置1表示开启睡眠模式下闪存接口电路的时钟;
位3保留且为0;
位2是SRANEB位,它是SRAM时钟的使能位,软件置1表示开启睡眠模式时的SRAM时钟;
位1是DMA2EN位,软件置1表示DMA2时钟的使能;
位0是DMA1EN位,软件置1表示DMA1时钟的使能;
💻RCC_APB2ENR
前面提及了APB2总线上外设的复位寄存器,接下来就是对APB2总线上外设的时钟进行使能的寄存器了,这个寄存器就是RCC_APB2ENR。
位15表示ADC3EN,软件置1则表示ADC3接口时钟使能;
位14表示USART1EN,软件置1则表示USART1通用同步异步收发口时钟使能;
位13表示TIM8EN,软件置1则表示定时器TIM8时钟使能;
位12表示SPI1EN,软件置1则表示SPI1时钟使能;
位11表示TIM1EN,软件置1则表示定时器TIM1时钟使能;
位10表示ADC2EN,软件置1则表示ADC2接口时钟使能;
位9表示ADC1EN,软件置1则表示ADC1接口时钟使能;
位8表示IOPGEN,软件置1则表示I/O端口G时钟使能;
位7表示IOPFEN,软件置1则表示I/O端口F时钟使能;
位6表示IOPEEN,软件置1则表示I/O端口E时钟使能;
位5表示IOPDEN,软件置1则表示I/O端口D时钟使能;
位4表示IOPCEN,软件置1则表示I/O端口C时钟使能;
位3表示IOPBEN,软件置1则表示I/O端口B时钟使能;
位2表示IOPAEN,软件置1则表示I/O端口A时钟使能;
位1保留且为0;
位0表示AFIOEN,软件置1表示辅助功能I/O时钟使能。
💻RCC_APB1ENR
既然有APB2总线外设的时钟使能寄存器,怎么能少了APB1总线外设的时钟寄存器呢?
位29表示DACEN位,软件置1表示DAC数模转换接口时钟使能;
位28表示PWREN位,软件置1表示电源接口时钟使能;
位27表示BKPEN位,软件置1表示备份接口时钟使能;
位26保留且为0;
位25表示CANEN位,软件置1表示CAN总线时钟使能;
位24保留且为0;
位23表示USBEN位,软件置1表示USB时钟使能;
位22表示I2C2EN位,软件置1表示I2C2时钟使能;
位21表示I2C1EN位,软件置1表示I2C1时钟使能;
位20表示UART5EN位,软件置1表示UART5异步收发器时钟使能;
位19表示UART4EN位,软件置1表示UART4异步收发器时钟使能;
位18表示USART3EN位,软件置1表示USART3通用同步异步收发器时钟使能;
位17表示USART2EN位,软件置1表示USART2通用同步异步收发器时钟使能;
位16保留且为0;
位15表示SPI3EN位,软件置1表示SPI3时钟使能;
位14表示SPI2EN位,软件置1表示SPI2时钟使能;
位13到位12保留且为0;
位11表示WWDGEN位,软件置1表示窗口看门狗时钟使能;
位10到位6保留且为0;
位5表示TIM7EN,软件置1表示定时器7时钟使能;
位4表示TIM6EN,软件置1表示定时器6时钟使能;
位3表示TIM5EN,软件置1表示定时器5时钟使能;
位2表示TIM4EN,软件置1表示定时器4时钟使能;
位1表示TIM3EN,软件置1表示定时器3时钟使能;
位0表示TIM2EN,软件置1表示定时器2时钟使能。
💻RCC_BDCR
这个是备份域控制寄存器,这个寄存器控制的某些位(LSEON、LSEBYP、RTCSEL和RTCEN)在复位后仍能处于读保护状态,只有在电影控制寄存器的DBP位置1后才能修改,这些位只能通过备份域复位来清除,任何内部和外部复位都不会改变它们的数值。
位16表示BDRST位,它置1表示整个备份域复位;
位15表示RTCEN位,它置1表示RTC时钟开启;
位14到位10保留且为0;
位9到位8表示RTCSEL,即RTC时钟源的选择,一旦选定怎么复位都不会变,直到下次通过BDRST来改变整个后备域;
位7到位3保留且为0;
位2表示LSEBYP位,它是外部低速时钟振荡器旁路位,调试模式下一旦它置1表示LSE时钟倍旁路;
位1表示LSEYRDY位,它由硬件置1,表示外部的32kHz的振荡器已经就绪;
位0表示LSEON位,它是使能LSE低速外部振荡器的使能位,一旦它开启,外部的32kHz振荡器才开启。
💻RCC_CSR
最后就是控制/状态寄存器RCC_CSR,它是对一些特殊功能进行控制的寄存器。
位31表示LPWRRSTF,低功耗复位标志,如果在低功耗下发生复位则该位将会被硬件置为1,通常在其被置为1后通过RMVF位来软件清零;
位30表示WWDGRSTF位,它是窗口看门狗的复位标志,在窗口看门狗复位时会被硬件置1,通常可以通过RMVF位进行软件清零;
位29表示IWDGRSTF,它是独立看门狗的复位标志,在独立看门狗复位发生在VDD区域后由硬件置1,可通过RMVF位进行软件清零;
位28表示SFTRSTF位,它是软件复位标志位,一旦发生软件复位,那么该位就会被硬件置1,可通过RMVF位清零;
位27表示PORRSTF位,即上电和掉电复位标志,如果在上电/掉电复位发生则由硬件置1,可通过RMVF位清零;
位26表示PINRSTF位,如果在NRST引脚复位则由硬件置1,可通过RMVF位清零;
位25保留且为0;
位24就是RMVF位了,它是清除复位标志的操作位,通过将其置1可以清除掉前面复位的标志位
位23到位2是保留且为0;
位1是LSIRDY位,它表示内部低速振荡器已经就绪。如果内部的40kHz RC振荡器就绪,该位会通过硬件置1;
位0是LSION位,它是内部低速时钟的开启操作位,它表示内部低速振荡器使能。
📻时钟系统库函数
当我们了解了和时钟系统有关的寄存器后,接下来最主要的就是了解去设置时钟系统的库函数了。在STM32的固件库说明手册中,和时钟系统有关的库函数总共有32个,这里我们主要是说几个我们经常用到的库函数。
💻APB1和APB2总线挂载外设时钟使能/复位函数
我们知道,我们经常需要用的外设是挂载在APB1和APB2总线上的,为了让这些外设能够正常工作,需要通过下面几个库函数对挂载在总线上的外设进行时钟使能。
- RCC_APB2PeriphClockCmd ---- APB2总线外设时钟使能函数
- RCC_APB1PeriphClockCmd ---- APB1总线外设时钟使能函数
- RCC_APB2PeriphResetCmd ---- APB2总线外设复位函数
- RCC_APB1PeriphResetCmd ---- APB1总线外设复位函数
由于时钟使能总线1和总线2函数的结构和形参类似,所以我们这里只以总线2为例:
该函数主要有两个形参,一个是外设,另一个是它的状态;状态好说,总共就两个说法,一个是开启ENABLE,另一个就是关闭DISABLE。而对于外设就有很多了,每个外设都有自己对应的参数,外设对应的参数列表如下图所示:
所以如果我们想使能一个外设,例如使能GPIOA、ADC2的时钟,只需要执行下面的代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC2,ENABLE);
而关于APB2的复位函数,它的两个形参和时钟使能函数Clockcmd类似,一个是外设,另一个是状态:
所以如果我们想复位一GPIOA和ADC2的外设,只需要:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC2,ENABLE);
💻系统时钟时钟源选择函数
由前面我们知道,系统时钟SYSCLK是可以选择三个时钟源的,包括PLL、HSI和HSE,而配置这三个源就是通过RCC_SYSCLKConfig函数:
它主要是通过配置形参RCC_SYSCLKSouce来配置三个源中的某一个,而这三个源对应的参数分别是:
所以如果我们想将系统时钟选为HSI,只需要:
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
💻使能类库函数
在前面我们介绍寄存器时,提到了很多的使能位,这些使能位对应着一大堆的库函数操作,接下来我们来详细列一下具体有哪些使能类的库函数。
①HSI时钟源使能:
使用方法:
RCC_HSICmd(ENABLE);
②PLL时钟源使能:
使用方法:
RCC_PLLCmd(ENABLE);
③LSI时钟源使能:
使用方法:
RCC_LSICmd(ENABLE);
④CSSC时钟安全系统使能:
使用方法:
RCC_ClockSecuritySystemCmd(ENABLE);
⑤RTC时钟使能:
使用方法:
RCC_RTCCLKCmd(ENABLE);
💻配置类库函数
除了使能类的库函数,时钟系统还有很多配置类的库函数:
①HSE配置函数:
它是配置HSE状态的库函数,它的形参主要有三个状态:
如果我们需要开启HSE外部晶振
RCC_HSEConfig(RCC_HSE_ON);
②PLL配置函数:
它是配置PLL的来源和倍频数值的函数,它总共有两个形参,一共是选择PLL时钟输入来源的参数,另外一共就是倍频系数的参数。
如果我们想使用HSI内部时钟,同时倍频系数为8,那么操作是
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_8);
③AHB预分频器配置函数:
这个是AHB预分频器的配置函数,它总共有一个形参,主要是是对系统时钟进行预分频的预分频系数:
如果这里我们的AHB需要进行2分频,那么具体操作为:
RCC_HCLKConfig(RCC_SYSCLK_Div2);
④APB1预分频配置函数:
这个是总线APB1的预分频配置函数,主要也是一共形参,形参的意义是预分频系数:
如果我们设置APB1预分频器二分频,那么操作为:
RCC_PCLK1Config(RCC_HCLK_Div2);
④APB2预分频配置函数:
这个是总线APB2的预分频配置函数,主要也是一共形参,形参的意义是预分频系数:
如果我们设置APB2预分频器二分频,那么操作为:
RCC_PCLK2Config(RCC_HCLK_Div2);
⑤时钟中断配置函数:
关于时钟的中断也有一个配置的函数,这个函数主要有两个参数,第一个形参是选择中断源,第二个形参是是否开启中断源:
如果我们需要开启PLL就绪中断:
RCC_ITConfig(RCC_IT_PLLRDY, ENABLE);
⑥USB预分频配置函数:
前面我们提到的众多预分频器里面就有一个和USB有关的预分频器,它主要会进行分频操作,而分频的系数就可以通过选择USB预分频配置函数的参数来配置:
例如我们需要将PLL时钟除以1.5:
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
⑦ADC预分频器配置函数:
关于ADC预分频器的库函数主要有一个参数,这个参数是配置ADC预分频分频系数的参数,该参数的选择范围如下图所示:
如果我们想要将ADC预分频器的系数选为8:
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
⑧LSE配置函数:
LSE是低速外部时钟,关于它的配置其实就只有一个参数,该参数可以有三种状态,开启、关闭和旁路,其实这点和HSE配置函数参数的三个状态类似。
如果我们想要关闭LSE:
RCC_LSEConfig(RCC_LSE_ON);
⑨RTC配置函数:
RTC的配置函数实际上就是对RTC的时钟来源进行选择,这个函数只有一个参数,这个参数有三个选择,可以分别选择LSE、LSI和HSE作为RTC的输入时钟来源。
如果我们想选择LSI作为RTC时钟:
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
⑩时钟输出配置函数:
前面我们提到,STM32F1系列可以通过引脚输出时钟到外部,而输出哪个时钟就是通过这个MCOC函数进行配置的了,它一共有一个参数,这个参数有5种状态,分别对应4路可以选择的输出和无输出状态:
假如我们将HSI时钟输出:
RCC_MCOConfig(RCC_MCO_HSI);
参考资料:
《STM32中文参考手册_V10》
《STM32固件库说明(中文版)》
《基于STM32嵌入式接口与传感器应用开发》
原文地址:https://blog.csdn.net/m0_61151031/article/details/138199378
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!