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硬件电路设计还需要根据具体的应用需求来确定。

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

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

stm32_RTC时钟校准

stm32_RTC时钟校准

AN2604应用笔记STM32F101xx and STM32F103xx RTC校准总体介绍实时时钟在很多嵌入式应用中是必不可少的,但是由于外部环境温度的改变,驱动RTC的晶体频率会发生变化,因此RTC就没有预想的那么准确了!STM32F101xx and STM32F103xx附带有数字时钟校准电路,因此可以适应与变化的环境,它主要是来补偿晶体由于环境的变化,这篇应用笔记主要讨论了RTC校准的基本原理以及解释了如何利用RTC校准来提高计时精度。

1RTC校准基本原理1.1晶体的准确性在很多计时领域,通常都是用“石英精确度”这么一个术语来描述的,石英晶体振荡器提供了一个远远优于其他类型振荡器的精确度,但是它并不是完美的,石英晶体振荡器对温度十分敏感,Figure1展示了一个32.768HZ晶体的频率精确度(acc)和温度(T)以及曲率(K)的关系,这个曲线可以用下面的公式给出:注:曲率K由于不同的晶体而不同,这里是针对STM3210B-EVAL开发板来说的,关于这部分可以参考相关晶体制造商提供的详细信息。

在很多应用领域需要一个高准确度的时钟,但是在实际中有好多综合因素限制着精度的提高,通常,典型的方法是通过调节晶体的负载电容来调节精度,这一方法,虽然十分有效,但是也存在这一些缺点:1它需要多加一个外部器件(可调电容)。

2其增大了电流消耗(这在电池供电的场合尤为突出)。

取代这种传统的模拟的方法,STM32F10xxx系列提供了一个数字校准器,允许用户用软件控制的方法进行校准,非常的好用!1.2具体方法STM32F10xxx的RTC模块是用一个32768HZ的通常石英晶体驱动的,其实石英晶体是一种能够提供非常固定频率的,但是有以下两种情况导致了其频率的不稳定:1温度变化;2晶体本身的变化。

前面讲述了一般通常的方法都是用一个麻烦的可调电容来补偿误差,这里STM32F10xxx使用的是一个周期计数器来进行校正,这个数字校正器通过从220个时钟周期中减去0到127个周期的方法来校正的,如图所示:究竟有多少个时钟节拍是空白的取决于最近一次向备份寄存区域RTC校准寄存器最后七位加载的值,之所以这个校准寄存器放在备份区域是因为这个寄存器即使在系统掉电情况下仍然可以通过后备电池进行供电(译者注:如果后背电池也掉电,当然这个寄存器的值也会丢失的),注意:从上图中可以看出时钟输出引脚是在校准之前的频率,所以这个值是不会被校准所改变的,尽管已经进行了校准,但是这个输出是在校准之前的频率。

stm32面试题

stm32面试题

stm32面试题在STM32面试中,可能会被问到的一些常见问题如下:1. 什么是STM32?STM32是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的32位微控制器系列。

2. STM32与传统的8位或16位微控制器相比有何优势?与传统的8位或16位微控制器相比,STM32具有更高的计算能力、更多的存储空间、更强大的外设功能和更低的功耗。

此外,STM32还提供了丰富的软件支持与开发工具,方便开发者进行项目开发与调试。

3. 什么是ARM Cortex-M内核?ARM Cortex-M内核是一种32位的处理器内核,具有高性能和低功耗的特点,广泛应用于嵌入式系统中。

Cortex-M系列内核分为Cortex-M0、Cortex-M3和Cortex-M4等不同型号,其中Cortex-M4内核还具备浮点运算单元。

4. STM32的开发环境是什么?STM32的开发环境主要包括开发板、编程器、软件开发工具等。

常用的开发工具包括Keil MDK、IAR Embedded Workbench、STM32CubeIDE等。

5. 如何进行STM32的程序开发?STM32的程序开发可以使用C语言或汇编语言进行,开发者可以使用相应的开发工具编写代码、编译生成二进制文件,再通过编程器将二进制文件下载到开发板中运行。

6.如何配置STM32的时钟系统?配置STM32的时钟系统是进行项目开发的重要一步,可以通过修改相关寄存器的配置来实现。

大部分的时钟配置可以通过STM32提供的库函数进行设置,如使用RCC(Reset and Clock Control)库函数对时钟进行配置。

7. STM32的外设功能有哪些?STM32具有丰富的外设功能,包括通用输入输出(GPIO)、定时器(TIM)、串行通信接口(UART、SPI、I2C)、模数转换器(ADC)等。

开发者可以根据项目需求选择相关外设进行配置与使用。

STM32定时器定时时间配置总结

STM32定时器定时时间配置总结

STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。

在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。

首先,我们需要选择定时器的工作模式。

STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。

基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。

根据具体的应用需求,选择合适的工作模式。

其次,我们需要选择定时器的时钟源。

STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。

内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。

然后,我们需要选择定时器的时钟分频系数。

定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。

我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。

时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。

接着,我们需要配置定时器的计数器重载值。

定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。

通过改变计数器重载值,可以实现不同的定时时间。

计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。

最后,我们需要配置定时器的中断。

定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。

在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。

通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。

需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)1.Error:Flash Download Failed-"Cortex-M3"出现这处问题通常是MDK中的Flash的编程算法没有配置或没有配置正确,通俗的讲,就是我们没有配置好下载的环境,导致程序⽆法下载在这⾥,主要指的是没有添加cpu⽀持的flash错误点击mdk中的对进⾏配置,点击flashdownload,点击add 添加cpu⽀持的flash,根据⾃⼰的stm32来配对,我的是stm32f10x high-density flash 512k,此条错误解决2.程序编译成功,下载成功,但是开发板不显⽰效果mdk没有对j-link进⾏匹配点击mdk中的,点击debug,选择j-link/j-trace cortex,程序下载成功,效果实现3.Error:target dll has been cancelled.debugger aborted表⾯意思⽬标DLL已经cancelled.debugger中⽌可能是硬件仿真未匹配,解决1. 7⽉28⽇,不过奇怪的是昨天我把这⼀栏改了的,但今天重新开程序,它⼜变成了4.7.29学习LCD -FSMC彩屏显⽰的时候出现passing 'char[16]' to parameter of type 'const u8*' (aka 'const unsigned char*') converts between pointers to interger types with different signs 相关的类似报错的原因就是输⼊显⽰屏的字符串变量⼀定要是char,不能是u8,unsigned char我把所有相关的函数变量参数的类型改成char就解决对了问题.5.8.3学习定时APP\瀹氭椂鍣╘time.h(4): warning: #1295-D: Deprecated declaration time_init - give arg types使⽤函数前⼀定要声明APP\瀹氭椂鍣╘time.c(23): warning: #1-D: last line of file ends without a newlineAPP \瀹氭椂鍣╘time.c(23):警告:#⼀维:⽂件的最后⼀⾏没有换⾏符结束。

STM32调试过程中常见的问题及解决方法

STM32调试过程中常见的问题及解决方法

一、在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.”解决办法:Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。

二、编译工程时提示如下信息:main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10 x_nvic.o).main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvi c.o).main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f 10x_nvic.o).main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x _nvic.o).main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x _nvic.o).main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_n vic.o).解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。

三、调试器不能连接到STM32的问题与解决办法很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。

stm32数字时钟课程设计

stm32数字时钟课程设计

stm32数字时钟课程设计一、课程目标知识目标:1. 学生能理解STM32的内部时钟结构和定时器工作原理;2. 学生能掌握利用STM32设计数字时钟的基本步骤和方法;3. 学生能了解数字时钟的显示原理,并掌握与STM32定时器相结合的编程技巧;4. 学生能解释数字时钟在实际应用中的重要性。

技能目标:1. 学生能运用C语言进行STM32定时器的编程;2. 学生能通过调试工具解决数字时钟编程中的问题;3. 学生能设计并实现一个具有基本功能的数字时钟,包括时、分、秒显示和闹钟功能;4. 学生能对所设计的数字时钟进行测试和优化。

情感态度价值观目标:1. 学生培养对电子制作的兴趣,增强实践操作的自信心;2. 学生培养团队协作意识,学会在项目中相互沟通、共同解决问题;3. 学生通过数字时钟设计,认识到技术与生活的紧密联系,激发创新意识;4. 学生培养严谨的科学态度,注重实验数据的准确性和程序的可维护性。

二、教学内容1. STM32内部时钟结构:介绍STM32的时钟树,讲解时钟源、时钟分频、时钟使能等概念,为学生设计数字时钟提供基础理论知识。

2. 定时器工作原理:详细讲解STM32定时器的工作原理,包括计数器、预分频器、自动重装载寄存器等组成部分,使学生了解定时器在数字时钟中的作用。

3. C语言编程:回顾与定时器编程相关的C语言知识,包括数据类型、运算符、控制语句等,为编写数字时钟程序打下基础。

4. 数字时钟设计步骤:按照以下步骤组织教学内容:a. 硬件设计:讲解如何使用STM32最小系统板,选择合适的显示屏和驱动芯片,连接电路;b. 软件设计:介绍定时器初始化、中断处理、时间计算等编程方法;c. 程序调试:指导学生使用调试工具,如Keil、ST-Link等,进行程序调试;d. 测试与优化:要求学生完成数字时钟设计后进行功能测试,并根据测试结果进行优化。

5. 教材章节关联:教学内容与教材第3章“STM32定时器”和第5章“STM32中断与事件”相关,结合实例进行讲解,使学生更好地掌握相关知识。

STM32时钟配置方法详解

STM32时钟配置方法详解

一、在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新手常见的一个错误并给出解决方法

STM32新手常见的一个错误并给出解决方法

STM32新手常见的一个错误并给出解决方法在使用STM32微控制器进行开发时,新手常常会遇到一些常见的错误。

以下是一些常见错误以及对应的解决方法,帮助新手更好地克服这些问题。

1.芯片未正确连接:通常情况下,STM32芯片应与开发板正确连接。

新手可能会出现错误的连接方式,例如将芯片倒置或错位连接。

解决这个问题的方法是仔细查看芯片的引脚图并确保正确地连接所有的引脚。

2.引脚配置错误:STM32微控制器具有多功能引脚,可以根据需要进行不同功能的配置。

新手可能会错误地配置引脚,导致功能无法正常工作。

解决这个问题的方法是仔细阅读芯片的数据手册,以确定正确的引脚功能和配置设置。

3.时钟配置错误:STM32微控制器依赖于准确的时钟源以确保正常运行。

新手可能会忽视时钟配置,导致系统无法启动或无法正常工作。

解决这个问题的方法是仔细配置时钟源,并确保时钟频率与所需的系统时钟频率相匹配。

4.软件驱动错误:在使用STM32微控制器进行开发时,需要正确的软件驱动程序来控制硬件功能。

新手可能会遗漏或错误地使用关键的驱动程序,导致无法实现预期的功能。

解决这个问题的方法是仔细阅读相关的软件库文档,并确保正确使用所有必需的软件驱动程序。

5.中断配置错误:STM32微控制器支持多种中断,并需要正确配置以实现正确的中断处理。

新手可能会忽略或错误地配置中断,导致系统无法正确响应中断事件。

解决这个问题的方法是仔细阅读关于中断配置和处理的文档,并确保正确配置所有中断。

6.电源和电源管理问题:STM32微控制器需要稳定和适当的电源供应以确保正常运行。

新手可能会遇到电源不稳定或不足的问题,导致系统无法正常工作。

解决这个问题的方法是确保提供稳定的电源,并使用适当的电源管理技术,例如使用电容和稳压器等来提供稳定和适当的电源。

7.调试问题:在使用STM32微控制器进行开发时,调试是非常重要的。

新手可能会遇到调试问题,例如无法正确读取或显示调试信息。

STM32f407系统定时器时钟配置计算

STM32f407系统定时器时钟配置计算

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时钟配置方法详解

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存储器的访问延时,以确保正常读写数据。

STM32CubeMX配置SystemTick时钟

STM32CubeMX配置SystemTick时钟

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()函数。

STM32时钟配置方法详解

STM32时钟配置方法详解

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还可以使用时钟配置工具进行时钟配置。

  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提供的库中都有一
相关文档
最新文档