STM32时钟配置设计中的常见问题解析

合集下载

STM32常见问题解析(论文资料)

STM32常见问题解析(论文资料)

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中断。

STM32单片机常见的工作异常现象分析及解决方案

STM32单片机常见的工作异常现象分析及解决方案

STM32 单片机常见的工作异常现象分析及解决方案贴了两块样板,烧写同样的固件。

其中一块工作正常,但是另外一块出现了很奇怪的现象:在线调试正常;每次烧写完后工作正常;重新上电有时候工作正常,有时候工作不正常;工作不正常时,按下复位按键,恢复正常。

工作异常现象:main 函数中的系统运行指示灯不闪烁,但是初始化过程中点的一个灯是亮的!说明程序运行一段时间后,不工作了。

由于在线调试模式,板子工作正常,无法通过在线调试的方式判断程序运行的异常状态。

分析可能的原因:1、初始化过程中,程序陷入死循环。

但程序初始化过程中,没有while (1)死循环的代码。

2、板子上电后不断复位,导致无法进入main 函数中的while(1)循环。

问题查找:硬件:1、确认BOOT0 管脚接10kΩ欧电阻下拉到地;2、RC 上电延时复位电路中,R 为10kΩ,C 由0.1uF 改为10uF,现象依旧;3、MCU 3.3V 电源纹波很小,排除电源问题。

好像从硬件上查不出什幺问题。

只能从板子上唯一点亮的灯下手了。

软件:1、好像跟硬件复位没什幺关系,为了确认板子是不是在不停复位,在点亮的那个灯前加了100ms 延时,如果是在复位,那灯就应该不停闪烁。

但那个灯还一直是亮的,说明是程序运行出错,不运行了。

2.不断修改led 灯在初始化代码中的位置,最终定位到导致运行出错的代码:配置一个GPIO 为外部中断,跳变沿触发,上拉。

把上拉改为NOPULL,工作一切正常。

问题定位:配置为外部中断的GPIO 悬空导致。

之前工作正常的样板是一直有连接到那个IO 脚的外接模块,这个工作不正常的没有接,导致IO 管脚电平不确定。

由于电平的不确定,在初始化的瞬间有一个跳变沿,导致程序进入外部中断服务函数。

在中断服务函数中,要读取一个定时器的寄存器的值,但是要读取的定时器可能还没有完成初始化,导致读取失败,程序运行异常。

解决办法:1、PULL 模式有PULLRISING 改为NOPULL;2、timer 在这个外部中断之前进行初始化。

stm32定时器初始化后自动进入一次中断问题

stm32定时器初始化后自动进入一次中断问题

stm32定时器初始化后⾃动进⼊⼀次中断问题今天在调试定时器时,定时器3出现了⾃动停⽌⼯作的问题,中断设置是每过⼀秒,进⼀次中断,相应标志位+1,然后每次都是在标志位=4时停⽌⼯作,但是有时候⼜能正常⼯作,暂时未解决。

在调试时,发现⼀个有趣的现象,本次项⽬我同时配置了定时器4,初始化后是DISABLE未使能状态,但是开始运⾏,定时器还是会进⼀次中断,相应的标志位+1,后⾯不能继续增加。

motor_run_time这个标志位在程序启动后会进⼀次中断导致+1,⽽我的定时器并未使能。

我的相关代码是初始化部分代码:TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允许定时器4更新中断TIM_Cmd(TIM4, DISABLE); //关闭定时器4//定时器4中断服务函数void TIM4_IRQHandler(void){if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //溢出中断{motor_run_time++;}TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除中断标志位}增加部分: TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除中断标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允许定时器4更新中断TIM_Cmd(TIM4, DISABLE); //关闭定时器4//定时器4中断服务函数void TIM4_IRQHandler(void){if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //溢出中断{motor_run_time++;}TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除中断标志位}。

stm32串口时序误差

stm32串口时序误差

stm32串口时序误差
串口通信时序误差是指在STM32微控制器中使用串口通信时,由于时钟偏差、波特率误差、数据传输延迟等原因导致的通信时序不准确的情况。

串口通信时序误差可能会导致数据传输错误、丢失或者干扰,严重影响通信的稳定性和可靠性。

造成串口通信时序误差的原因可能包括:
1. 时钟偏差,由于晶振精度、温度变化等因素导致的系统时钟频率偏差,会影响串口通信的波特率准确性。

2. 波特率误差,设备之间的波特率设置不一致或者波特率发生漂移,导致通信时序不匹配。

3. 数据传输延迟,串口硬件或者软件处理数据的延迟会对通信时序产生影响。

4. 环境干扰,外部环境的电磁干扰、电源干扰等因素也可能对串口通信时序造成影响。

解决串口通信时序误差的方法包括:
1. 确保系统时钟稳定,使用高精度的晶振,并对时钟进行校准
和补偿,以减小时钟偏差。

2. 波特率校准,定期对设备之间的波特率进行校准,确保波特
率的一致性。

3. 优化数据传输,减小串口数据传输的延迟,可以通过硬件加速、DMA传输等方式来提高数据传输效率。

4. 抗干扰措施,在系统设计中考虑到外部干扰因素,采取屏蔽、滤波等措施减小环境干扰对串口通信的影响。

总之,串口通信时序误差对系统稳定性和可靠性有着重要影响,需要在系统设计和调试过程中充分考虑,并采取相应的措施进行优
化和改进。

stm32定时器时钟以及中间对齐模式

stm32定时器时钟以及中间对齐模式

stm32定时器时钟以及中间对齐模式在永磁同步电机的控制中,需要对电机的三相定⼦施加⼀定的电压,才能控制电机转动。

现在⽤的较多的是SVPWM(SVPWM的具体原理会在后⾯另写⼀篇博客说明),要想产⽣SVPWM波形,需要控制的三相电压呈如下形式,即A、B、C三相的电压是中间对齐的,这就需要⽤到stm32定时器的中间对齐模式了。

1、stm32的时钟树stm32的时钟树如下图所⽰,简单介绍⼀下stm32时钟的配置过程。

以外部时钟作为时钟源为例。

HSE代表外部时钟(假设为8M)、SYSCLK为系统时钟,经过倍频器之后变成168M、SYSCLK经过AHB预分频器(假设分频系数为1)后变成HCLK时钟等于系统时钟SYSCLK,HCLK即AHB外部总线时钟,经过APB预分频器分出APB1时钟(分频系数为2,低速设备SYSCLK/4)与APB2时钟(分频系数为1,⾼速设备SYSCLK/2)HSE->SYSCLK->HCLK->APB1、APB2。

针对stm32f427的配置源码如下static void SetSysClock(void){#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/******************************************************************************//* PLL (clocked by HSE) used as System clock source *//******************************************************************************/__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* Enable HSE */RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHB时钟#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2时钟/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1时钟#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx *//* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);/* Enable the main PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till the main PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}#if defined (STM32F427_437xx) || defined (STM32F429_439xx)/* Enable the Over-drive to extend the clock frequency to 180 Mhz */PWR->CR |= PWR_CR_ODEN;while((PWR->CSR & PWR_CSR_ODRDY) == 0){}PWR->CR |= PWR_CR_ODSWEN;while((PWR->CSR & PWR_CSR_ODSWRDY) == 0){}/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; #endif /* STM32F427_437x || STM32F429_439xx *//* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}}2、stm32定时器的时钟stm32定时器分为⾼级定时器(TIM1与TIM8)、通⽤定时器(TIM2-TIM5、TIM9-TIM14)、基本定时器(TIM6、TIM7)。

6.3 STM32F107VCT的时钟深入剖析(32M,40M,72M灵活切换)

6.3 STM32F107VCT的时钟深入剖析(32M,40M,72M灵活切换)
unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟 HSEON while(!(RCC->CR>>17)); //将 RCC_CR 寄存器的值右移 17 位,等待 HSERDY 就绪, 即外部时钟就绪
RCC->CFGR2 |= 4<<4; // 5 分频
6.1.2 STM32的时钟
系统时钟的选择是在启动时进行,复位时内部 8MHZ 的 RC 振荡器被选为默认的 CPU 时钟,随后可以选择外部的、具失效监控的 3-25MHZ 时钟;当检测到外部时钟失效时,它 将被隔离,系统将自动地切换到内部的 RC 振荡器。
在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供 的来源: 1. HSI 是高速内部时钟,RC 振荡器,频率默认为 8MHz,可以从 STM32 时钟树中看到
RCC->CFGR2 |= 6<<8; //8 倍频
RCC->CFGR2 |= 1<<16; //PLL2 作为 PRED2V1 时钟 RCC->CR |= 1<<26; //将 PLL2 使能
while(!(RCC->CR>>27));
RCC->CFGR2 |= 0x00000004; //5 分频 RCC->CFGR |= 1<<16; //PREDIV1 作为 PLL 时钟 RCC->CFGR |= 2<<18; //本例程希望设置成 32MHZ 的工作频率,我们在这里尝试
下表是结合图表明出来的: 标号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

STM32的晶振,时钟稳定性要重视!!!

STM32的晶振,时钟稳定性要重视!!!

STM32 的晶振,时钟稳定性要重视!!!
最近看了不少网上网友的应用案例,在STM32 晶振问题上不少都栽了跟头。

我自己也碰见过一次。

就是电容值搞错了。

ourdev 有网友说:他的设备隔几天系统就出问题,系统时钟变慢。

----------------------------------------有网友说:
国产的晶振,我们用在产品里吃过很多亏。

发出去几百个货(出厂都检验合格),
到客户那里几个有时就不起振了(几个月后),后来改用进口的,从此不出问题了。

哎!
---------------------------------------有网友说:
第一次遇到是忘了焊接22P 的电容,板子可以工作,但是运行速度慢,但是晶振起振了,
示波器看波形有刺,想必是STM32 认为外部晶振信号不好,。

STM32硬件电路设计注意事项

STM32硬件电路设计注意事项

STM32硬件电路设计注意事项在进行STM32硬件电路设计时,有一些重要的注意事项需要考虑。

下面是一些重点:1.使用合适的电源与地线:首先,为STM32选择合适的电源模块,并确保电源满足其最低工作电压要求,并具有足够的电流输出能力。

另外,应该使用低功耗电源管理技术,以最大程度地降低功耗。

在布线时,要确保电源和地线足够宽,以减小电阻和噪声。

2.确定时钟源:根据应用的需求,选择合适的时钟源。

STM32器件通常有内部和外部时钟源,外部时钟可以通过外部晶振或时钟信号引脚提供。

在设计电路时,应该保持时钟信号的稳定性和准确性。

3.考虑ESD和EMI:静电放电(ESD)和电磁干扰(EMI)是STM32电路设计中需要特别关注的问题。

采取措施来防止ESD和EMI是非常重要的,如使用合适的连接器和过滤器,添加适当的保护电路等。

4.确定IO口和外设的连接需求:根据应用的需求,确定所需的各种外设,并将其连接到正确的IO引脚上。

应注意IO口的电平和电流要求,并确保电路设计满足这些要求。

5.外部存储器接口设计:在一些应用中,可能需要连接外部存储器,如闪存、SD卡或EEPROM。

在进行相关设计时,需要考虑外部存储器的接口标准(如SPI、I2C、SDIO等),并确保信号完整性和稳定性。

6.参考原理图和布局建议:ST官方提供了丰富的参考原理图和布局建议,设计者可以参考这些建议来提高设计的可靠性和稳定性。

这些建议包括供电网络设计、地面规划、信号完整性、时钟布线、分层原则等。

7.测试和验证:在完成电路设计后,应进行相关测试和验证以确保STM32正常工作。

这包括对电源、时钟、IO口、外设等的测试。

如果可能,应编写测试代码,以确保所有功能正常,同时对性能进行评估。

需要注意的是,以上只是一些基本的注意事项,具体的STM32硬件电路设计还需要根据具体的应用需求来确定。

在实际设计中,还需要考虑其他方面的因素,如成本、可维护性、扩展性等。

因此,在进行具体的设计时,应综合考虑这些因素,以满足实际需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32时钟配置设计中的常见问题解析
Ⅰ、写在前面
最近有很多朋友问:1.我的USART串口打印出来的数据是乱码?2.我的
TIM定时器延时或定时不准确?
常见可能原因:
1.晶振问题:外部晶振不起振、或频率与配置不匹配。
2.软件问题:分频、倍频、时钟源选择等。
总结来说,主要还在于软件的问题。因为即使没有外部晶振,也可以使用
“startup_stm32fxxxxx.s”这幺一个启动文件。
在线调试的朋友应该知道,你点一下复位按钮,软件会跳转到下图的位
置,其实可以看到复位之后第一个执行的函数就是【SystemInit】。说到这
里,应该明白为什幺我们在main函数开始没有看见时钟配置相关的函数了
吧,程序是在复位后立马配置的时钟。
内部晶振。
其实,软件的问题是容易得到解决的,只要你了解了STM32时钟配置里
面具体内容就知道了。
关于本文的详细内请看下面章节
Ⅱ、本文要点
要了解时钟的配置,就需要知道它在哪里配置,也就是还需要了解软件执
行的流程。
1.软件流程
说软件流程是让大家知道系统时钟配置的位置。不管是使用寄存器开发,
还是使用库(标准库、HAL库)开发STM32,工程中基本上都有
个参考值,一般的开发板都是按照参考值设计的晶振,所以不用修改。但如
果不同,那幺就要修改。位置分别在“stm32fxxx.h”和“system_stm32fxxx.c”文
件下面,如下图(F4系列为例):
4.时钟树
时钟树是很好反应时钟时钟源选择、分频、倍频的一个框图,要深入理
解,请下载相关参考手册查看RCC章节的时钟树,下面截取部分系列芯片时
2.时钟配置位置
使用库库(标准库、HAL库)开发STM32的朋友,在工程中都可能会看
到“system_stm32fxxx.c”这幺一个文件,这个文件里面代码主要的功能就是配
置STM32的系统时钟。
上面启动文件中说到的【SystemInit】函数就是在这个文件里面,
【SystemInit】函数里面就是配置系统时钟的具体内容。配置系统时钟主要就
的。
钟树图:
5.MCO时钟输出
验证时钟配置是否正确的方法可以通过MCO输出时钟,用示波器检测一
下就知道了。我前面提供的软件工程中有一段代码(如下图),主要就是
MCO时钟输出的代码。
Ⅲ、说明
需要深入掌握STM32系统时钟配置的内容,还需要你自己认真阅读以下
源代码(建议看一下注释说明)。官方提供的代码从命名上都是很容易理解
是时钟源选择、分频、倍频等。
注意:STM32有多系列芯片,这里【SystemInit】函数里面代码的内容也
因此不同。
3.外部晶振频率、系统时钟频率
对于初学者,容易受到影响的就是两个参数:HSE_VALUE(外部晶振频
率)、SystemCoreClock(系统时钟)。这个两个参数在ST提供的库中都有一
相关文档
最新文档