本文章选用参考原子STM32 mini板的例程,在学习中进行笔记记录
首先看看sysick的函数
delay.h
delay.c
链接:http://pan.baidu.com/s/1kUGxzgV 密码:n4s5
接下来,我们看下Systick寄存器,进行程序分析。
知道systick在系统中的地位后,我们来了解systick的实现。这里只是举例说明systick的使用。它有四个寄存器:
SysTick->CTRL, --控制和状态寄存器
SysTick->LOAD, --重装载寄存器
SysTick->VAL, --当前值寄存器
SysTick->CALIB, --校准值寄存器
我们先查看delay_init函数
void delay_init(u8 SYSCLK)
{
//SysTick->CTRL&=0xfffffffb;// HCLK/8
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); /* 时钟选择 HCLK/8 即系统时钟的八分频*/
fac_us=SYSCLK/8;/*us倍成数*/
fac_ms=(u16)fac_us*1000;/*ms倍成数*/
}
void delay_ms(u16 nms) /*本程序只能定时16777216 us ,否则会溢出*/
{
u32 temp; SysTick->LOAD=(u32)nms*fac_ms;/*24位定时器,只能够装载2的24次方的时钟周期,既是16777216*/
SysTick->VAL =0x00;/*清零当前计数值*/
SysTick->CTRL=0x01;/*开启定时器*/
do
{temp=SysTick->CTRL; }
while(temp&0x01&&!(temp&(1<<16)));/*等待定时计数到0,*/
SysTick->CTRL=0x00;/*关闭滴答定时器*
/SysTick->VAL =0X00;/*清零当前值*/
}
void delay_us(u32 nus) /*同理delay_ms*/
{
u32 temp;
SysTick->LOAD=nus*fac_us;
SysTick->VAL=0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
/*大概就到这里了,相应的程序我放在云盘,自行下载测试~*/
链接:http://pan.baidu.com/s/1kUGxzgV 密码:n4s5谢谢。dengweijie