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
//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
SysTick->CTRL=~0X00;
SysTick->VAL=0x00;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: Gopher进阶神器:拥抱刻意练习,从新手到大师。
发现一个非常友好的工具,帮助我们回顾练习过程,设定目标,并提供丰富多样的Gopher主题练习题。 刻意练习:从新手到大师。 Carol 心理学家 Carol Dweck 做过一个实验,她找了一些十岁的孩子,随机分成两组,让他们做道题。 之后,对第一组那些完成题…