欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 2_stm32定时中断点灯

2_stm32定时中断点灯

2024/10/23 23:32:18 来源:https://blog.csdn.net/ACK_ACK/article/details/140860884  浏览:    关键词:2_stm32定时中断点灯

       定时器是个好东西啊~

       之前搞上层应用时,通过定时器可以以某种频率刷新状态,stm32定时器的一种功能就是如此。此外,stm32的定时器还有很多其他功能,如PWM输出等。定时器具体再细分可以分为高级控制定时器、通用定时器、基本定时器等。

1、定时时间的计算

       基本定时器只具备基本的定时功能,也就是在时钟源的驱动下,从0开始累加脉冲计数,直到超过预定值,然后触发中断或者触发DMA请求。基本定时器和通用定时器的时钟源都是TIMxCLK,TIMxCLK在时钟树中的位置如下:

adc586b6e1209c92b500aff90cd7b63a.png

当APB1的预分频系数为1时,则TIMxCLK就是APB1的频率(也等于AHB的频率);而当APB1的预分频系数不为1时,则TIMxCLK就是APB1的频率的2倍。比如在常见的配置中,AHB=168Mhz,而APB1二分频为84Mhz,那么TIMxCLK就为84Mhz*2=168Mhz。

TIMxCLK的脉冲还会再经过一道分频,然后被TIMx_CNT寄存器累加计数。这个分频器叫做PSC预分频器。PSC预分频器可以设置为任意16位值。当TIMx_CNT的值等于TIMx_ARR寄存器中的值时,产生溢出事件,可用于触发中断。    

根据定时器时钟的频率,比如时钟的频率是168MHZ,可以理解为一秒钟STM32会自己数168M次,预分频系数就是将频率分割,比如分频系数是168,则该时钟的频率会变成168MHZ/168=1MHZ,但是在设置的时候要注意,数值应该是168-1。假定分频系数是168-1,那么频率变成1MHZ,也就意味着STM32在一秒钟会数1M次,即1us数一次。

       接下来就是确定预装载值,比如需要定时1ms,由于1ms=1us*1000,那么预装载值就是1000-1;如此类推,在预分频系数确定的情况下,定时的时长就由预装载值确定了。

       定时1秒设置实例:

//168M/16800=10000Hz
TIM_Prescaler         = 16800-1;
//0.0001s*10000 = 1s
TIM_Period            = 10000-1;

2、定时器与中断的配置

//20240801
void TIM3_Conf(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//168M/16800=10000Hz    TIM_TimeBaseStructure.TIM_Prescaler         = 16800-1;TIM_TimeBaseStructure.TIM_Period            = 10000-1;TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_ClockDivision     = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ARRPreloadConfig(TIM3,ENABLE);TIM_ClearITPendingBit(TIM3,TIM_IT_Update);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);TIM_Cmd(TIM3,ENABLE);
}       void NVIC_Conf()
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;    NVIC_Init(&NVIC_InitStructure);
}void TIM3_IRQHandler(void)
{TIM_ClearITPendingBit(TIM3,TIM_IT_Update);GPIO_WriteBit(GPIOC,GPIO_Pin_9,g_led_state);g_led_state = !g_led_state;
}

       主函数调用:

GPIO_Conf();
TIM3_Conf();
NVIC_Conf();while(1)
{             Delay(10000);
}

       效果如下:

1eb092b2e8143266f4b0568e5edc7b4f.gif

欢迎关注:

a52d78eb1d53de4748f372b9f9baf9d3.png

https://zhou-yuxin.github.io/articles/2016/STM32%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88%E5%AE%9A%E6%97%B6%E5%99%A8%E4%B8%AD%E6%96%AD%E3%80%81PWM%E8%BE%93%E5%87%BA%E5%92%8C%E8%B7%B3%E5%8F%98%E6%8D%95%E8%8E%B7%E3%80%81%E4%B8%BB%E4%BB%8E%E6%A8%A1%E5%BC%8F%EF%BC%89/index.html

https://blog.csdn.net/ZIIllIIll/article/details/118117534

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com