systick系统定时器
  pbfHt7yP3Hym 2023年11月12日 26 0

M内核都有这定时器(内核自带),比死延时好 不会因为中断导致软件卡死;

具体参考Cortex-M3编程手册。

systick是一个24位的递减定时器。

寄存器:

CRTL是一个32为的寄存器;其中的第0位为定时器使能,第1位是中断开启(0不开 1开) 第2位是时钟源选择(0为 APB时钟的8分屏 72/8=9。1为AHP的总时钟72M)。第16为是递减完成标志位/为1什么意见定时完成了 0不完成/其中时钟源选择可以用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择8分屏。

 //SysTick->CTRL

RELONEWE:重载的值  //SysTick->LOAD

CURRENT:递减的当前值  //SysTick->VAL

其中COER_M3.H有相关变量名称 374行/* SysTick Control / Status Register Definitions */

计算公式:

AHB时钟:RELONEWE/(1/CLK)=72000000*(1/72000000)=1S

APB时钟: RELONEWE/(1/CLK)=9000000*(1/8000000)=1.25S

void systick_ms(u16 ms)

{

//用了系统的标志位

//u32 a;

//SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择8分屏

//SysTick->LOAD=ms*9000; //计算时间,晶振跳9次等于1微秒 9000为1毫秒9000000为1S??

//SysTick->VAL=0x00; //把val寄存器清零

//SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//开启定时。

//do

//{

//a=SysTick->CTRL;//一直检测标志位

//}

//while(!(a&(1<<16)));//标志位1时,取反 出循,或者把结果循环判断是否为0,1&任何数都是任何数

//SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//停止定时

//SysTick->VAL=0x00;//把val寄存器清零

//没有用系统的标志位

u32 time_temp=0;

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

SysTick->LOAD=ms*9000;

SysTick->VAL=0x00;

//SysTick->CTRL=0;

SysTick->CTRL|=0X01;

do

{

time_temp=SysTick->CTRL;

}while(!(time_temp&(0x01<<16)));

SysTick->CTRL=~0X00;

SysTick->VAL=0x00;

}



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  ff1CyeNEm5RT   2023年11月12日   27   0   0 sedv8配置项
pbfHt7yP3Hym