STM32的systick时钟(使用查询实现)

weixin_52131122 2021-04-08 03:07:55
实现功能:让灯一秒亮灭一次
代码:
void SysTick_Work()
{
if((SysTick->CTRL)&(1<<16)
{
count_1ms++;
}
}
int main(void)
{
LCD_Init();
SysTick_Config(72000);//1ms定时时长
while(1)
{
SysTick_Work();
if(count_1ms==50000)//1s到
{
count_1ms=0;//清0
GPIOA_PIN_Set=GPIOA_PIN_Set^(1<<5);

}

}
}

*********************************************************************************************
systick时钟使用比较简单。
我们从SysTick Config()这个函数入手学习systick
首先打开这个函数(在core.cm3.h)可以找到



可以看到它操作了那些寄存器,那这些寄存器有什么用,可以在Cortex—M3权威指南可以看到


调用这个函数,要写一个重载值,然后清0 VAL(VAL的值就是从重载值来的)在控制寄存器CTRL中选择系统时钟源,使能时钟
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);


这里可以看到systick的中断配置不是操作NVIC,而是SCB,因为它是内核的时钟,操作的是内核中断。
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1)
PRIO_BITS是被宏定义4的,所以这里的意思是,1<<4 -1就是16-1=15 就是把它的优先级配置成最低

systick的原理也比较简单,就是给它配置一个初值,然后初值传给计数值,计数值向下开始减,减到0时,会申请一次中断,而且把 SysTick->CTRL的第16位值1(读取该位后,会自动清0)


计时原理:如果你选的是72M,那么他72/1个us计数值会向下减1,如果计数值是72000,减1000us减到0,那就是1ms。



在stm32f10x.it.c里,如果用查询方式一定要有这个空中断函数,如果用中断方式,一定要把这个删了

用查询的好处就是,不用怕高优先级的中断与systick冲突
用中断的好处就是,在计数的时候,可以执行别的程序。


...全文
634 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_52131122 2021-04-21
  • 打赏
  • 举报
回复
卧槽,大佬评论我
hhhh63 2021-04-17
  • 打赏
  • 举报
回复
这个不错,比死循环好

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧