stm32系统时钟配置问题
STM32常见问题解析(论文资料)
![STM32常见问题解析(论文资料)](https://img.taocdn.com/s3/m/3b9eea7a1fb91a37f111f18583d049649b660ea2.png)
STM32常见问题解析1、时钟安全系统(CSS)时钟安全系统被激活后,时钟监控器将实时监控外部高速振荡器;如果HSE时钟发生故障,外部振荡器自动被关闭,产生时钟安全中断,该中断被连接到Cortex‐M3的NMI的中断;同时CSS将内部RC振荡器切换为STM32的系统时钟源(对于STM32F103,时钟失效事件还将被送到高级定时器TIM1的刹车输入端,用以实现电机保护控制)。
操作流程:1)、启动时钟安全系统CSS: RCC_ClockSecuritySystemCmd(ENABLE); (NMI中断是不可屏蔽的!)2)外部振荡器失效时,产生NMI中断,对应的中断程序:void NMIException(void){if (RCC_GetITStatus(RCC_IT_CSS) != RESET){ // HSE、PLL已被禁止(但是PLL设置未变)…… // 客户添加相应的系统保护代码处// 下面为HSE恢复后的预设置代码RCC_HSEConfig(RCC_HSE_ON); // 使能HSERCC_ITConfig(RCC_IT_HSERDY, ENABLE); // 使能HSE就绪中断RCC_ITConfig(RCC_IT_PLLRDY, ENABLE); // 使能PLL就绪中断RCC_ClearITPendingBit(RCC_IT_CSS); // 清除时钟安全系统中断的挂起位// 至此,一旦HSE时钟恢复,将发生HSERDY中断,在RCC中断处理程序里, 系统时钟可以设置到以前的状态}}3)、在RCC的中断处理程序中,再对HSE和PLL进行相应的处理。
注意:一旦CSS被激活,当HSE时钟出现故障时将产生CSS中断,同时自动产生 NMI。
NMI 将被不断执行,直到CSS中断挂起位被清除。
因此,在NMI的处理程序中 必须通过设置时钟中断寄存器(RCC_CIR)里的CSSC位来清除CSS中断。
STM32F407的系统时钟配置
![STM32F407的系统时钟配置](https://img.taocdn.com/s3/m/1cc3c2f3a26925c52dc5bf0f.png)
STM32F4的系统时钟树时钟系统是微处理器同步系统的基准和运行节拍,如同人的心跳节拍一样。
因此时钟系统是微处理器中最重要的一个核心部分。
STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。
问:采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?答:因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。
同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。
时钟总线:STM32F407上挂载有3根时钟总线,分别为AHB、APB1、APB2;其芯片的外设大部分都挂载在这三根总线上,因此还需要弄清楚这三根总线的时钟频率。
在STM32F4中,有5个最重要的时钟源,为HSI、HSE、LSI、LSE、PLL。
PLL实际是分为两个时钟源,分别为主PLL和专用PLL。
从时钟频率来分可以分为高速时钟源和低速时钟源,在这5个中HSI,HSE以及PLL是高速时钟,LSI和LSE是低速时钟。
从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。
根据左边的时钟系统图中的红色标记分别为:①LSI是低速内部时钟,RC振荡器,频率为32kHz左右。
供独立看门狗和自动唤醒单元使用②LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
这个主要是RTC的时钟源。
③HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。
HSE也可以直接做为系统时钟或者PLL输入。
④HSI是高速内部时钟,RC振荡器,频率为16MHz。
可以直接作为系统时钟或者用作PLL输入。
⑤PLL为锁相环倍频输出。
STM32F4有两个PLL:1)主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。
STM32的晶振,时钟稳定性要重视!!!
![STM32的晶振,时钟稳定性要重视!!!](https://img.taocdn.com/s3/m/34b46f04a32d7375a41780cd.png)
STM32 的晶振,时钟稳定性要重视!!!
最近看了不少网上网友的应用案例,在STM32 晶振问题上不少都栽了跟头。
我自己也碰见过一次。
就是电容值搞错了。
ourdev 有网友说:他的设备隔几天系统就出问题,系统时钟变慢。
----------------------------------------有网友说:
国产的晶振,我们用在产品里吃过很多亏。
发出去几百个货(出厂都检验合格),
到客户那里几个有时就不起振了(几个月后),后来改用进口的,从此不出问题了。
哎!
---------------------------------------有网友说:
第一次遇到是忘了焊接22P 的电容,板子可以工作,但是运行速度慢,但是晶振起振了,
示波器看波形有刺,想必是STM32 认为外部晶振信号不好,。
STM32单片机RTC时钟的使用方法及步骤
![STM32单片机RTC时钟的使用方法及步骤](https://img.taocdn.com/s3/m/7ee3b6b8aff8941ea76e58fafab069dc51224777.png)
STM32单片机RTC时钟的使用方法及步骤以下是使用STM32单片机的RTC时钟的步骤:1.初始化RTC模块:首先,需要在RCC寄存器中使能RTC和LSE(Low-Speed External)晶振模块。
然后,配置RTC的时钟源和预分频器,选择合适的时钟频率。
2.配置RTC时间和日期:通过设置RTC的寄存器来配置当前时间和日期。
需要设置秒、分钟、小时、星期、日期、月份和年份,确保其具有正确的值。
3.启动RTC时钟:设置RTC的控制寄存器,使其开始工作。
可以选择启用或禁用闹钟功能,设置闹钟的时间和日期。
4.读取RTC数据:可以随时读取RTC的时间和日期数据。
读取数据后,可以进行各种计算和处理,如计算两个时间之间的差异、比较时间等。
5.处理RTC中断:可以设置RTC中断来触发一些操作,如闹钟触发时执行一些任务。
需要配置NVIC(Nested Vector Interrupt Controller)中断向量表,使能相应的中断。
6.备份和恢复RTC数据:RTC模块提供了备份寄存器,可以用来存储额外的信息。
可以使用一些特殊的寄存器,如BKP (Backup)寄存器或CPU的系统寄存器来备份和恢复数据。
7.断电维持能力:RTC模块的一个关键特性是其断电维持能力。
即使在断电情况下,RTC模块中的数据仍然能够保持。
可以通过电池供电电路来提供必要的电力。
8.节能模式:可以利用RTC模块的节能模式来降低功耗。
可以选择性地关闭RTC模块的不需要的功能,以减少功耗。
需要注意的是,具体的步骤可能会因芯片型号和开发工具的不同而有所差异。
因此,在使用STM32单片机的RTC时钟之前,需查阅相关的技术文档和参考手册,以了解具体操作步骤和寄存器配置。
以上是使用STM32单片机的RTC时钟的基本步骤。
在实际应用中,可以根据具体需求对RTC进行更多的配置和使用。
STM32F103RC系统时钟配置
![STM32F103RC系统时钟配置](https://img.taocdn.com/s3/m/ee73c333482fb4daa58d4b3c.png)
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图:2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图:4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图:6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图:8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司9、点击“Go To Definition Of SYSCLK_FREQ_72MHz ”,会跳转到下图:10、在上图中,我们可以设置所需要的系统时钟,这里设置系统时钟是SYSCLK_FREQ_72MHz ,见下面粘贴的部分#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000 //这是我们要设置的系统时钟#endif。
STM32定时器定时时间配置总结
![STM32定时器定时时间配置总结](https://img.taocdn.com/s3/m/19285c297f21af45b307e87101f69e314332fae0.png)
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
STM32F时钟配置1
![STM32F时钟配置1](https://img.taocdn.com/s3/m/8723bd47cf84b9d528ea7a42.png)
//程序中需要用的其他时钟也可以确定了。 //因为 APB1 Prescaler=1(没有分频),所以 TIMxCLK=PLCK1=36M //因为 APB2 Prescaler=1(没有分频),所以 TIM1CLK=PLCK2=36M //在 SystemInit 中 ADCPRE:ADC 预分频 00:PCLK2 2 分频后作为 ADC 时钟,即 ADCCLK=PCLK2/2,所以 ADCCLK=18M
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;
CanolaFlower
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC->CIR = 0x009F0000;
SetSysClock(); }
static void SetSysClockTo36(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
//注释为:SYSLCK,HCLK,PCLK2 和 PCLK1 的配置
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) { }
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
STM32时钟详细配置
![STM32时钟详细配置](https://img.taocdn.com/s3/m/b1d6a6c95fbfc77da269b142.png)
STM32时钟配置STM32时钟配置步骤// 开启HSI时钟寄存器操作1).开启高速时钟HSE // 设置时钟控制寄存器RCC_CR 位16 置1使能RCC->CR|= 0x00010000;位16 :HSEON:外部高速时钟使能当进入待机和停止模式时,该位由硬件清零,关闭4-16MHz外部振荡器。
当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。
2).等待高速时钟就绪// 读取时钟控制寄存器RCC_CR位17为1就位while(!(RCC-> CR>>17));位17:HSERDY:外部高速时钟就绪标志由硬件置’1’来指示外部4-16MHz振荡器已经稳定。
在HSEON位清零后,该位需要6个外部4-25MHz振荡器周期清零。
3).设置APB1,APB2,AHB分频系数// 设置时钟配置寄存器RCC_CFGRRCC_CFGR=0x00000400;(AHB :位4-7, (低速)APB1 :位8-10, (高速)APB2 :位11-13)位7:4:HPRE[3:0]:AHB预分频(AHB Prescaler)0xxx:SYSCLK不分频位10:8:PPRE1[2:0]:低速APB预分频(APB1) 100:HCLK 2分频位13:11:PPRE2[2:0]:高速APB预分频(APB2) 0xx:HCLK不分频4).设置PLL倍频// 配置时钟配置寄存器RCC_CFGR 位18-21RCC_CFGR|=7<<18;位21:18:PLLMUL:PLL倍频系数0111:PLL 9倍频输出5).PLL输入时钟源选择// 配置时钟配置寄存器RCC_CFGR 位16RCC_CFGR|=1<<16;位16:PLLSRC:PLL输入时钟源(PLL entry clock source) 1:HSE时钟作为PLL输入时钟。
由软件置’1’或清’0’来选择PLL输入时钟源。
STM32时钟配置方法详解
![STM32时钟配置方法详解](https://img.taocdn.com/s3/m/5f9a281b14791711cc791790.png)
一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①HSI是高速内部时钟,RC振荡器,频率为8MHz。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。
此方法可提高EMC性能;第2种:分别重映射OSC_IN 和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。
此方法可以减小功耗并(相对上面)节省2个外部电阻。
三、用HSE时钟,程序设置时钟参数流程:01、将RCC寄存器重新设置为默认值RCC_DeInit;02、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();04、设置AHB时钟RCC_HCLKConfig;05、设置高速AHB时钟RCC_PCLK2Config;06、设置低速速AHB时钟RCC_PCLK1Config;07、设置PLL RCC_PLLConfig;08、打开PLL RCC_PLLCmd(ENABLE);09、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)/******************************************************************************** Function Name : RCC_Configuration* Description : RCC配置(使用外部8MHz晶振)* Input : 无* Output : 无* Return : 无*******************************************************************************/void RCC_Configuration(void){/*将外设RCC寄存器重设为缺省值*/RCC_DeInit();/*设置外部高速晶振(HSE)*/RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON)/*等待HSE起振*/HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 {/*设置AHB时钟(HCLK)*/RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB 时钟= 系统时钟/* 设置高速AHB时钟(PCLK2)*/RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK/*设置低速AHB时钟(PCLK1)*/RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2/*设置FLASH存储器延时时钟周期数*/FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期/*选择FLASH预取指缓存的模式*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9/*使能PLL */RCC_PLLCmd(ENABLE);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/*设置系统时钟(SYSCLK)*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟/* PLL返回用作系统时钟的时钟源*/while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟 {}}/*使能或者失能APB2外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph _GPIOB |RCC_APB2Periph_GPIOC , ENABLE);//RCC_APB2Periph_GPIOA GPIOA时钟//RCC_APB2Periph_GPIOB GPIOB时钟//RCC_APB2Periph_GPIOC GPIOC时钟//RCC_APB2Periph_GPIOD GPIOD时钟}五、时钟频率STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。
STM32单片机RTC时钟的使用方法及步骤
![STM32单片机RTC时钟的使用方法及步骤](https://img.taocdn.com/s3/m/4b21698409a1284ac850ad02de80d4d8d05a0168.png)
STM32单片机RTC时钟的使用方法及步骤一、配置RTC模块时钟源RTC模块的时钟源可以选择外部低速晶振(LSE)或者低速内部时钟(LSI)。
通过以下步骤配置RTC时钟源:1.使能外部低速晶振(LSE)或者低速内部时钟(LSI)。
例如,如果使用外部低速晶振,则需要使能相应的GPIO端口,并配置为晶振模式。
2.配置RCC时钟控制寄存器(RCC_CR)和时钟配置寄存器(RCC_CSR)。
二、使能RTC模块时钟1.使能PWR模块时钟和备份寄存器访问。
RCC_APB1ENR,=(1<<28);RCC_APB1ENR,=(1<<27);2.校验并关闭RTC模块。
RCC->BDCR,=RCC_BDCR_RTCEN;PWR->CR,=PWR_CR_DBP;if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0)RCC->BDCR,=RCC_BDCR_RTCEN;3.配置RTC时钟预分频器和提供给RTC的时钟源。
RTC->PRER ,= rtc_prescaler_value << RTC_PRER_PREDIV_S_Pos;RTC->PRER ,= 127 << RTC_PRER_PREDIV_A_Pos;RTC->CR&=~RTC_CR_FMT;三、配置RTC模块时间和日期1.关闭RTC时钟写保护功能。
RTC->WPR=0xCA;RTC->WPR=0x53;RTC->ISR,=RTC_ISR_INIT;while((RTC->ISR & RTC_ISR_INITF) == 0);2.配置RTC的时间和日期寄存器。
RTC->TR ,= (uint32_t)((hours / 10) << RTC_TR_Hours10_Pos);RTC->TR ,= (uint32_t)((hours % 10) << RTC_TR_Hours1_Pos);RTC->TR ,= (uint32_t)((minutes / 10) <<RTC_TR_Minutes10_Pos);RTC->TR ,= (uint32_t)((minutes % 10) <<RTC_TR_Minutes1_Pos);RTC->TR ,= (uint32_t)((seconds / 10) <<RTC_TR_Seconds10_Pos);RTC->TR ,= (uint32_t)((seconds % 10) <<RTC_TR_Seconds1_Pos);RTC->DR ,= (uint32_t)((year / 10) << RTC_DR_YT_Pos);RTC->DR ,= (uint32_t)((year % 10) << RTC_DR_YU_Pos);RTC->DR ,= (uint32_t)((month / 10) << RTC_DR_MT_Pos);RTC->DR ,= (uint32_t)((month % 10) << RTC_DR_MU_Pos);RTC->DR ,= (uint32_t)((day / 10) << RTC_DR_DT_Pos);RTC->DR ,= (uint32_t)((day % 10) << RTC_DR_DU_Pos);3.开启RTC时钟写保护功能。
STM32新手常见的一个错误并给出解决方法
![STM32新手常见的一个错误并给出解决方法](https://img.taocdn.com/s3/m/9670d263492fb4daa58da0116c175f0e7cd1193b.png)
STM32新手常见的一个错误并给出解决方法在使用STM32微控制器进行开发时,新手常常会遇到一些常见的错误。
以下是一些常见错误以及对应的解决方法,帮助新手更好地克服这些问题。
1.芯片未正确连接:通常情况下,STM32芯片应与开发板正确连接。
新手可能会出现错误的连接方式,例如将芯片倒置或错位连接。
解决这个问题的方法是仔细查看芯片的引脚图并确保正确地连接所有的引脚。
2.引脚配置错误:STM32微控制器具有多功能引脚,可以根据需要进行不同功能的配置。
新手可能会错误地配置引脚,导致功能无法正常工作。
解决这个问题的方法是仔细阅读芯片的数据手册,以确定正确的引脚功能和配置设置。
3.时钟配置错误:STM32微控制器依赖于准确的时钟源以确保正常运行。
新手可能会忽视时钟配置,导致系统无法启动或无法正常工作。
解决这个问题的方法是仔细配置时钟源,并确保时钟频率与所需的系统时钟频率相匹配。
4.软件驱动错误:在使用STM32微控制器进行开发时,需要正确的软件驱动程序来控制硬件功能。
新手可能会遗漏或错误地使用关键的驱动程序,导致无法实现预期的功能。
解决这个问题的方法是仔细阅读相关的软件库文档,并确保正确使用所有必需的软件驱动程序。
5.中断配置错误:STM32微控制器支持多种中断,并需要正确配置以实现正确的中断处理。
新手可能会忽略或错误地配置中断,导致系统无法正确响应中断事件。
解决这个问题的方法是仔细阅读关于中断配置和处理的文档,并确保正确配置所有中断。
6.电源和电源管理问题:STM32微控制器需要稳定和适当的电源供应以确保正常运行。
新手可能会遇到电源不稳定或不足的问题,导致系统无法正常工作。
解决这个问题的方法是确保提供稳定的电源,并使用适当的电源管理技术,例如使用电容和稳压器等来提供稳定和适当的电源。
7.调试问题:在使用STM32微控制器进行开发时,调试是非常重要的。
新手可能会遇到调试问题,例如无法正确读取或显示调试信息。
STM32f407系统定时器时钟配置计算
![STM32f407系统定时器时钟配置计算](https://img.taocdn.com/s3/m/6f7fef84ba4cf7ec4afe04a1b0717fd5360cb2dc.png)
STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。
STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。
通过软件配置,我们可以选择其中一种时钟源。
1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。
具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。
b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。
具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。
配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。
系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。
重载值是计数器的初始值,当计数器减到0时,会触发定时中断。
举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。
中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。
配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。
STM32时钟配置方法详解
![STM32时钟配置方法详解](https://img.taocdn.com/s3/m/884b8808ef06eff9aef8941ea76e58fafab0459c.png)
STM32时钟配置方法详解STM32是意法半导体(STMicroelectronics)公司推出的一系列32位Flash微控制器,被广泛应用于各种嵌入式系统中。
时钟是STM32微控制器的核心部分,正确配置时钟可以确保系统正常工作并达到预期的性能。
本文将详细介绍STM32时钟配置的方法。
1.时钟源:STM32微控制器提供了多个时钟源,包括内部时钟(HSI、LSI)和外部时钟(HSE、LSE)。
其中,HSI(高速内部时钟)是一个高频率(通常为8MHz)的内部RC振荡器,适用于低功耗应用;LSI(低速内部时钟)是一个低频率(通常为40kHz)的内部RC振荡器,用于RTC(实时时钟)模块;HSE(高速外部时钟)是一个外接的高频晶振,用于提供更精确的时钟信号;LSE(低速外部时钟)是一个外接的低频晶振,适用于RTC模块。
2.主频和系统时钟:主频是指CPU的时钟频率,系统时钟是指STM32微控制器的总线时钟,包括AHB(高性能总线)、APB1(低速外设总线)和APB2(高速外设总线)。
在进行STM32时钟配置之前,需要按照以下几个步骤来完成。
1.启用对应的时钟源:根据具体需求,选择合适的时钟源并启用相应的时钟。
可以通过设置RCC_CR寄存器和RCC_APB1ENR/RCC_APB2ENR寄存器来实现。
例如,要使用HSE作为时钟源,需要首先启用HSE时钟。
2.配置时钟分频器:为了使系统时钟不超过芯片规格要求的最大频率,需要对时钟进行分频。
分频器有两个,即AHB分频器和APB分频器。
可以通过设置RCC_CFGR寄存器来实现。
例如,将AHB分频器设置为8,将APB1和APB2分频器分别设置为4,可以将主频分别分频为8MHz、32MHz和64MHz。
3.等待时钟稳定:当启用外部时钟源时,需要等待时钟稳定。
可以通过读取RCC_CR寄存器的特定标志位来判断时钟是否稳定。
4. 配置Flash存储器的延时:根据主频的不同,需要设置Flash存储器的访问延时,以确保正常读写数据。
STM32的系统时钟设置SystemClock_Config()探究
![STM32的系统时钟设置SystemClock_Config()探究](https://img.taocdn.com/s3/m/252f48797f21af45b307e87101f69e314332fa2b.png)
STM32的系统时钟设置SystemClock_Config()探究⼀、⾸先了解⼏个硬件名词:stm32有多种时钟源,为HSE、HSI、LSE、LSI、PLL,对于L系统的,还有⼀个专门的MSI1、HSE是⾼速外部时钟,⼀般8M的晶振,精度⽐较⾼,⽐较稳定。
2、HSI是⾼速内部时钟,RC振荡器,频率为8MHz。
精度略差。
3、LSE是低速外部时钟,接频率为32.768kHz的⽯英晶体。
⼀般为RTC使⽤。
4、LSI是低速内部时钟,RC振荡器,频率为40kHz。
5、PLL为锁相环倍频输出,其时钟输⼊源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最⼤不得超过72MHz。
6、MSI是L系列独有的,它是⼀个产⽣于内部的可选择的时钟源,能提供12种不同频率:100 kHz, 200 kHz, 400 kHz, 800 kHz, 1 MHz, 2 MHz, 4 MHz (default value), 8 MHz, 16 MHz, 24 MHz, 32 MHz and 48 MHz。
可以直接选择为系统主系统时钟,也可以作为PLL源,经倍频后选择作为系统的主系统时钟。
为低功耗提供更多的选择。
其相当于代替了HSI了。
stm32有多个总线,主要有AHB和APB总线AHB是⾼速总线,是⼀种系统总线,它主要负责连接处理器、DMA等⼀些内部接⼝。
AHB 系统由主模块、从模块和基础结构3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。
APB是低速总线,它主要负责连接外围设备,它⼜分为APB1和APB2,它的总线架构不像 AHB⽀持多个主模块,在APB⾥⾯唯⼀的主模块就是APB 桥。
APB桥就是连接AHB和APB中间的玩意。
APB1最⼤时钟频率为36MHzAPB2最⼤时钟频率为72MHz⼆、其次了解三个结构体:stm32的HAL库,在系统时钟设置的结构有,RCC_OscInitTypeDef和RCC_ClkInitTypeDef、RCC_PLLInitTypeDef三个。
STM32CubeMX配置SystemTick时钟
![STM32CubeMX配置SystemTick时钟](https://img.taocdn.com/s3/m/2a2fb2326fdb6f1aff00bed5b9f3f90f76c64d6c.png)
STM32CubeMX配置SystemTick时钟STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。
1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。
2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。
自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // = /8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK _DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。
STM32CubeMX配置SystemTick时钟
![STM32CubeMX配置SystemTick时钟](https://img.taocdn.com/s3/m/da148db2b9d528ea81c77990.png)
STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。
1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。
2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。
自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // =/8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。
STM32时钟配置方法详解
![STM32时钟配置方法详解](https://img.taocdn.com/s3/m/5d111612f11dc281e53a580216fc700aba68525a.png)
STM32时钟配置方法详解时钟树是STM32微控制器中一系列时钟源和时钟分频器的组成部分。
时钟树包括系统时钟、外设时钟和内核时钟。
系统时钟用于驱动整个微控制器系统的核心,外设时钟用于驱动各种外设,内核时钟用于驱动CPU的运算。
在进行时钟配置之前,首先需要了解系统所需的时钟频率。
在STM32中,系统时钟可以通过多种方式进行配置,例如使用外部晶体、外部时钟、内部RC振荡器或者PLL(锁相环)等方式。
外部晶体是一种常用的时钟源,可以提供高精度的时钟频率。
在使用外部晶体时,首先需要设置PLL的时钟源为外部晶体,并设置PLL输入除频器的分频系数。
然后,再根据系统所需的时钟频率,设置PLL的倍频系数,以得到最终的系统时钟频率。
外部时钟是从外部提供的时钟信号,一般用于测试和调试。
使用外部时钟时,需要设置PLL的时钟源为外部时钟,并设置PLL的倍频系数,以得到所需的系统时钟频率。
内部RC振荡器是一种低成本的时钟源,但是其频率不如外部晶体稳定和精确。
在使用内部RC振荡器时,需要设置PLL的时钟源为内部RC振荡器,并设置PLL的倍频系数,以得到所需的系统时钟频率。
PLL是一种用于产生稳定高频时钟的电路,可以从一个低频时钟源产生一个高频时钟源。
使用PLL时,需要设置其输入时钟源和倍频系数。
系统时钟的分频系数可以通过RCC_CFGR寄存器进行设置。
RCC_CFGR寄存器的各个位域用于配置系统时钟的分频系数,包括分频因子、APB1的分频系数、APB2的分频系数等。
外设时钟是用于驱动外设的时钟,可以由系统时钟分频得到。
外设时钟的分频系数可以通过RCC_CFGR寄存器及各个外设的控制寄存器进行设置。
内核时钟是用于驱动CPU的运算的时钟。
在STM32微控制器中,CPU 时钟可以由系统时钟分频得到,分频系数可以通过RCC_CFGR寄存器和FLASH_ACR寄存器进行设置。
除了上述方法之外,STM32还可以使用时钟配置工具进行时钟配置。
STM32f407系统定时器时钟配置、计算
![STM32f407系统定时器时钟配置、计算](https://img.taocdn.com/s3/m/c116751cf68a6529647d27284b73f242326c3155.png)
STM32f407系统定时器时钟配置、计算STM32f407系统定时器时钟配置、计算1. 外部晶振的选择##确定自己单片机的外部晶振系统默认配置为25M,即打开官方库文件参数HSE Frequency(Hz) 一般为25000000HSE Frequency(Hz) | 25000000----------#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz */#endif /* HSE_VALUE */... ... ...我自己的单片机外部晶振为8M,将参数改为80000002. 系统时钟确定2.1 改完之后参照stm32f4时钟树2.2 首先明确自己的系统总时钟找到自己程序PLL Parameters部分(工程system_stm32f4xx.c) /************************* PLL Parameters***************************//* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ //锁相环压腔振荡器时钟//PLL_VCO =(HSE_VALUE/PLL_M)* PLL_N=8/ 8* 336 = 336MHz#define PLL_M 8#define PLL_N 336/* SYSCLK = PLL_VCO / PLL_P */// 系统时钟SYSCLK = PLL_VCO / PLL_P=336 / 2 = 168MHz #define PLL_P 2/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ //USB,SD卡时钟= PLL_VCO / PLLQ=336 / 7 = 48MHz#define PLL_Q 7/************************************************************** *****/3. 计算出自己系统时钟为168M##3.1 对应时钟线这里需要计算各个定时器分配所得的计数时钟频率3.2 找到APB1,APB2配置部分3.3 程序位置/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);3.4 位置计算15:13位为 010 ----->AHB2 不分频12:10位为 101 ----->AHB1 4分频e. 原则“非1即2”明确APB1得到时钟84M,APB2计数时钟频率168M 4. 系统默认情况:4.1 定时周期、频率的计算/****************************************************默认配置:外部时钟启动失败,系统会自动使用内部时钟*HCLK = SYSCLK / 1 = 168MHz ,AHB×总线时钟*PCLK2 = HCLK / 2 = 84MHz*PCLK1 = HCLK / 4 = 42MHz* arr:自动重装载值* psc:时钟预分频树* 定时器溢出时间计算方法:T out=((arr+1)*(psc+1))/Ft us.* Ft=定时器工作频率,单位:Mhz*****************************************************/ 4.2 实例验证演示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32系统时钟配置问题
系统从上电复位到72mz 配置好之前,提供时钟的是内如高速rc 振荡器提
供8MZ 的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来
完成的和保证的:RCC->CR |= (uint32_t)0x00000001;
#ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;#elseRCC- >CFGR &= (uint32_t)0xF0FF0000;#endif RCC->CR &= (uint32_t)0xFEF6FFFF; RCC->CR &= (uint32_t)0xFFFBFFFF;
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CLRCC->CR &= (uint32_t)0xEBFFFFFF;
RCC->CIR = 0x00FF0000;
RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)RCC->CIR =
0x009F0000;
RCC->CFGR2 = 0x00000000;#elseRCC->CIR = 0x009F0000;#endif#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef
DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif#endif
接着void SystemInit (void)调用SetSysClock();函数,将系统时钟配置到
72m,将AHB,APB1,APB2 等外设之前的时钟都配置好,然后切换到72mz 下
运行。
所以在使用哪个外设的时候,只需要使能相应的外设时钟就可以了
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。