在线时间1072 小时
UID1875914
注册时间2017-11-1
NXP金币4976
TA的每日心情 | 慵懒 4 天前 |
---|
签到天数: 1806 天 连续签到: 1 天 [LV.Master]伴坛终老
金牌会员
 
- 积分
- 9331
- 最后登录
- 2025-8-27
|
本帖最后由 morphlings2014 于 2018-11-16 15:40 编辑
滴答时钟的使用其实和ST芯片是一样的,设置也比较简单
调用SysTick_Config(SystemCoreClock / n);就可以直接配置固定时常的定时中断,比如n = 1000,就是1ms中断
/**
* @brief Handle interrupt from SysTick timer
* @return Nothing
*/
void SysTick_Handler(void)
{
}
中断函数里面可以放一些标志位的设置,就完成了定时中断的功能。
利用systick设置延时函数,也是比较常规的使用。
以下是我的延时函数实现,在不重置systick的情况下达到延时的效果
初始化的时候我还是调用了库函数,开启了100ms的定时中断,设置了us延时时systick需要走过的时钟周期数
void delay_init(uint8_t sysclk)
{
SysTick_Config(SystemCoreClock / 10);
us_ticks = sysclk;
}
us延时函数,ticks表示延时nus,systick需要走过的时钟周期数,start_tick是延时开始时的时钟周期数,cur_tick是当前的时钟周期数,total_tick是延时开始之后总的时钟周期数,当total_tick >= systick,表示延时时间到,ms延时是基于us延时实现的。void delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t start_tick, cur_tick, total_tick = 0;
uint32_t reload_tick = SysTick->LOAD;
ticks = nus * us_ticks;
start_tick = SysTick->VAL;
while (1)
{
cur_tick = SysTick->VAL;
if (cur_tick != start_tick)
{
if (cur_tick < start_tick)
total_tick += start_tick - cur_tick;
else
total_tick += reload_tick - cur_tick + start_tick;
start_tick = cur_tick;
if (total_tick >= ticks)
break;
}
}
}
void delay_ms(uint16_t nms)
{
uint16_t i;
for (i = 0; i < nms; i++)
delay_us(1000);
}
这样写延时就不会影响systick中断的使用,比较理想。
|
|