最近买了一款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问题多多,我也是被折磨一阵后回来写这个的。
最后附上我的核心板实物图
关键字:stm32F407 Systick
引用地址:
stm32F407的Systick的问题
推荐阅读最新更新时间:2024-03-16 16:21
STM32F407 外部中断配置步骤
介绍STM32F407外部中断配置步骤,以按键为例,实现外部中断配置,使用按键触发中断进行LED灯控制。 【1】外部中断相关知识介绍 CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32F4 并没有使用 CM4 内核的全部东西,而是只用了它的一部分。 STM32F40xx/STM32F41xx 总共有 92 个中断, STM32F42xx/STM32F43xx 则总共有 96 个中断,以下仅以 STM32F40xx/41xx 为例讲解。 STM32F40xx/STM32F41xx 的 92 个中断里面, 包括 10 个内核中断和 8
[单片机]
STM32F407的ADC之DMA多通道+温度
这里是在上一章中加上了温度 上图是温度计算公式:其中Vsense为采集到温度通道的ADC值 stm32f407温度通道是ADC1的16通道。 Avg_Slope一般取0.0025 和上一张比主要是该了下的内容: 1、增加ADC_TempSensorVrefintCmd(ENABLE);/*使能内部温度传感器*/ 2、修改ADC_InitStructure.ADC_NbrOfConversion = 3;/*只使用1通道 规则通为1*/ 由2改为3 因为之前只用到了PA2和PA3两个通道 现在增加了ADC1的16通道 3、增加ADC_RegularChannelConfig(ADC1,ADC_Channel_16,
[单片机]
STM32F407——串口显示跑马灯状态
#main.c #include sys.h #include delay.h #include usart.h #include led.h //#include beep.h //#include key.h #include exti.h extern u8 onoff,dir,speed,change,flag; extern u16 time; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 delay_init(168); //初始化延时函数 LED_In
[单片机]
轻松搞懂STM32F4SysTick定时器
定时器在单片机中是一个非常重要东西,其中在Cortex系列的芯片中,内核给我们提供了一个定时器,就是滴答定时器SysTick。其功能就是计时。 SysTick定时器的作用 1:用于延时 2:用于产生中断 3:用于单片机系统(这里不做解释) SysTick内部结构 根据这个图,总结下各个的作用 HCLK:系统时钟,不会的话可以看我之前的视频 /8 : 一个8分频的分频器,也可以不分 VAL:倒计时寄存器:只用了低0-23位,高位保留(VAL就是Value意思) LOAD:自动重装载寄存器(load就是本地的意思,本地的寄存器)(英语水平不够,我也不知道他咋就翻译成了自动
[单片机]
STM32-Systick定时器
STM32的定时有很多,主要包括通用定时器和高级定时器,它们的用法和功能也很多,有了高效的定时器,STM32才能实现很多功能。其中Systick定时器算是一种特殊的定时器,它应该不属于STM32,准确的说应该是属于Corte M3内核的一种定时器,详细可以参照Cortex-M3权威指南(中文版详尽版)来仔细研究一下,如果使用RTOS这个定时器应该会经常用到,是来做实时系统的心跳最适合不过了。所以又叫滴答定时器。这里简单的使用它来实现一下us级和ms级的延时函数,来小试一下它的强大功能。 首先看一下相关寄存器 之后看一下控制状态寄存器CTRL用到的几个位 最后在来看一下关于这个定时器的有关函数 下面是用滴答定时器来实现的两个
[单片机]
stm32f407驱动山外鹰眼二值化摄像头
stm32f407芯片主程序: #include main.h uint8_t pic ; bool busy = false; void ov7725_isr(void) { uint8_t *ptr = (uint8_t*)&pic ; if(!busy) { OV7725_GetImg(ptr); busy = true; } } int main(void) { uint16_t i; GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; //GPIO initialize RCC_AHB1
[单片机]
Systick定时器几个简单的函数简介
Systick定时器 Systick定时器是什么? Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作; SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常中断请求(异常号:15); Systick中断的优先级也可以设置。 SysTick的四个寄存器 寄存器对应的位 Systick时钟源选择函数SysTick_CLKSourceConfig() 函数体定义 void SysTick_CLKSourceConfig(uint32
[单片机]
STM32开发笔记3: STM32F407定时器2-5的使用方法
单片机型号:STM32F407 STM32F4有多种定时器,其中TIM2-TIM5称为通用定时器,具有相似的软件设置及使用方法。在这里还需要注意的是TIM3和TIM4为16位定时器,TIM2和TIM5为32位定时器。 使用TIM2-5可以遵循以下步骤: 1、打开config.h文件,对如下图所示的宏进行设置,设置为0表示不启动相应的定时器,设置为1表示当前定时器定时1ms,设置为2表示当前定时器定时10ms,设置为3表示当前定时器定时100ms,设置为4表示当前定时器为1s。 上图所示的设置结果为,启动定时器2设置为1ms定时,启动定时器5设置为1s定时,定时器3和定时器4没有启动。
[单片机]