f1 SysTick定时器用作延时 程序 一直卡在循环里是怎么回事啊

2019-08-14 07:05发布

本帖最后由 sszl 于 2017-8-19 22:03 编辑

void delay_ms(uint16_t ms)
{
               
         uint16_t temp;
         uint16_t cnt = 0;
         uint8_t number=0;
         cnt = ms;
         if(ms > 100)
         {
                 number = ms/100;
                 cnt = 100;
                 
         }
         do
         {
                 temp = SysTick->LOAD = cnt * (SystemCoreClock /1000);
                 SysTick->VAL = 0x00;
                 SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE|SysTick_CTRL_TICKINT);
                 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//¿aÆô¶¨ê±Æ÷
                 do
                 {
                        temp = SysTick->CTRL; //程序一直卡在这
                 }while((temp&0x01)&&!(temp&(1<<16)));
                 
                        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
                 SysTick->VAL = 0x00;
                 ms-=100;
                 if(ms<=100)
                 {
                        cnt = ms;
                 }
        }while(number--);
}
我调试过 SysTick->VAL的值在 更新 是正常的 就是 那个 标志(SysTick->CTRL(16)) 一直检测不到


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
taizonglai
1楼-- · 2019-08-14 12:45
检查systick有没有初始化
sszl
2楼-- · 2019-08-14 10:59
我知道了 函数中的 变量 uint16_t temp; 应该 设置为 uint32_t 因为 SysTick->CTRL 是 32 位寄存器 并且 我们 需要 的是 他的 16 位 数据
如果使用uint16_t 就读不到 那个数据
哎 我 太马虎 了
sszl
3楼-- · 2019-08-14 14:54
zuozhongkai 发表于 2017-8-19 21:54
检查systick有没有初始化

这个函数 就自己实现了 初始化啊
不需要初始化

一周热门 更多>