历史上的今天
今天是:2024年12月24日(星期二)
2018年12月24日 | stm32F407的Systick的问题
2018-12-24 来源:eefocus
最近买了一款stm32f407zgt6的核心板,毫不犹豫地写了一个用定时器点亮led灯的程序(由于程序比较简单就不贴上来了)。在进行1秒闪烁功能实现时,明显发现了led的闪烁时间不对,刚开始是拿手机进行简单的计时,结果显示的是大约3秒的延时(测了10秒亮了两次),在仔细检查代码后,确定不是代码问题(因为代码是用的野火的示例代码)

SystemCoreClock是系统预设的系统时钟,在System_stm32f4xx.c文件中查的,f407对应的系统时钟是168mhz


由SysTick_Init()函数,通过计算处理肯定能得到精确的定时,后通过定时器控制GPIO引脚连接至示波器检测,在高电平延时1ms的情况下,测得实际值为3.1ms。再次检查程序,确定没有问题后。意识到可能是系统时钟配置的问题。期间使用了网上推荐的获得系统时钟频率的函数来检测的方法,但是没有实际进展,这里略过。按着思路,我找到了时钟配置的原理图由上图,我们使用的是systick,其时钟源是HSE。也就是说systick的频率 f=(HSE/M)*N/P 由本帖第三幅图上可得参数

M = 25 N=336 P=2 在System_stm32f4xx.c文件中,找到了如下配置


这下确认没有问题了,把频率参数 168000000hz代入公式反算,得到HSE=25000000,也就是说hse的输入频率应该是25Mhz,这明显符合图一上面的参数。由此确定,该问题并不是程序上的问题。于是问题集中到硬件上,那可能性就比较多了,先从时钟源入手,上面的系统时钟原理图可以看出,hse的时钟源由OSC_OUT与OSC_IN接入,找到核心板电路图,如图

本来是按着25MHZ的晶振去找,怎么都找不到,接着查引脚,找到了这个8MHZ的外部晶振,问题根源终于找到了,这块板子的时钟源用的是8MHZ,但是系统配置里面默认是按照25MHZ的,将HSE=8MHZ带入计算公式,得到Systick=53760000HZ,大约是理想值的三分之一,到此终于确定了问题所在,为了后面工程的良好实施,系统频率还是用规定的168MHZ,为好。接着修改就比较简单了。
由公式反算,如果M=8的话,能得到理想频率(为什么不是其他参数,请参考一下中文手册,其他参数是有范围的)
接下来是在系统配置里修改M参数,先将system_stm32f4xx.c文件的只读属性去掉(找到该文件,右键属性去掉只读),在kile5中重新打开该文件,将代码翻到371行

将 25 改为 8,保存文件。将文件的只读属性加上,就可以完工了。到此时钟终于正常了。事实证明这里不改的话,后面的串口通信,spi,i2c问题多多,我也是被折磨一阵后回来写这个的。
最后附上我的核心板实物图

上一篇:STM32 定时器中断函数
史海拾趣
|
无疑,火热的便携式市场吸引了众多商家的目光。姑且不论新推出的iphone ,且看我们面前的手机:显示屏,GPS ,RF芯片,电源管理芯片,已经足以形成一个庞大完善的产业链。如果算上同样火热的军用、汽车、工业以及愈来愈炙手可热的医疗电子,怪不得能 ...… 查看全部问答> |
|
最近这段时间正在学习单片机,看的是李光地老师的单片机基础,里面用到的都是汇编语言,但没用讲开发环境之类的东西,所以我想问问学习单片机汇编用什么编译器好… 查看全部问答> |
|
折腾了两天,还没弄明白这个C8051F的开发环境是如何使用。 现在的情况是这样子: 刚开始时我安装了KEIL C+C8051F的Keil µVision 调试驱动 v3.40 。 然后可以在KEIL C里找到C8051F320这个芯片了,可是去看了一下它的头文件,发现定义的东西 ...… 查看全部问答> |
|
打算应用于低功耗的LED声光产品中,看了TI的介绍被TI的低功耗和节能吸引,在全球倡导绿色环保的大背景下,相信节能,减排,绿色,环保的产品更能深入人心。… 查看全部问答> |
|
各位高手,有2个大麻烦: 1、下好程序后,串口有接收到数据可以跳中断,但是,第二次下程序后,就不能跳到中断处理函数了,必须重新上电后才可以重新跳中断,这是为什么尼? 2、我想用串口接收中断来接收一个字符串,以目前来看只能接收到 ...… 查看全部问答> |
|
学习自动化、电子等电控类专业的人士都应该且能够记住的二十个基本模拟电路。初级层次是熟练记住这二十个电路;中级层次是能分析这二十个电路中的关键元器件的作用;高级层次是能定量计算这二十个电路的输入输出阻抗、输出信号与输入信号的比值、电 ...… 查看全部问答> |
|
用keil 4在调试时总是出现这样的语法错误,请问该怎么解决! MAIN.C(1): warning C500: LICENSE ERROR (R208: RENEW LICENSE ID CODE (LIC)) 这是提示的错误,但是不知道哪里错了,请各位帮帮小弟!谢谢!… 查看全部问答> |




