SysTick_Config()函数的配置
2023-12-18 12:15:55
一、Systick介绍
????????从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从功能上来说,Systick定时器主要是用来用来进行延时的,而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能,则是考虑到节省MCU的资源来做更重要的事。
二、SysTick_Config(X)的作用
void systick_config(void)
{
/* setup systick timer for 1000Hz interrupts */
if (SysTick_Config(SystemCoreClock / 1000U)){
/* capture error */
while (1){
}
}
/* configure the systick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
?SysTick_Config的参数,其实就是一个时钟次数,叫systick重装定时器的值。已知预装载值和时钟频率,那么可以求出进入一次中断的时间
预装载值/时钟频率
(SystemCoreClock / 1000U)/ (SystemCoreClock) S 进入一次中断,也就是1ms进入一次
三、使用systick中断延时1ms
void delay_1ms(uint32_t count)
{
delay = count;
while(0U != delay){
}
}
void delay_decrement(void)
{
if (0U != delay){
delay--;
}
}
void SysTick_Handler(void)
{
delay_decrement();
}
四、使用systick计时功能延时1ms(主要用于FreeRTOS系统)
void delay_1ms(uint32_t count)
{
uint32_t ticks;
uint32_t told,tnow,reload,tcnt=0;
reload = SysTick->LOAD; //获取重装载寄存器值
ticks = count * (SystemCoreClock / 1000); //计算定时1ms滴答定时器要计数的时间值
told=SysTick->VAL; //获取当前数值寄存器值
while(1)
{
tnow = SysTick->VAL; //获取当前数值寄存器值
if(tnow!=told) //当前值不等于开始值说明已在计数。切记:滴答定时器是倒计数
{
if(tnow<told) //当前值小于开始数值,说明未计到0
tcnt += told - tnow; //计数值=开始值-当前值
else //当前值大于开始数值,说明已计到0并重新计数
tcnt += reload-( tnow - told ); //told tnow reload (相当于整段事件中只有told到tnow这段时间没有计时
told = tnow; //更新开始值
if(tcnt >= ticks)break; //计数值大于等于要延迟的计数值,则计数完毕
}
}
}
文章来源:https://blog.csdn.net/m0_61973119/article/details/135057291
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!