SYSTICK嘀嗒定时器延时问题?

2019-08-19 20:29发布

请教,为什么我这样写嘀嗒定时器不能运行呢,死在延时那里,死循环了?
delay.c文件如下 :
#include "delay.h"
static __IO uint32_t TimingDelay;

void delay_us(uint32_t nTime){   TimingDelay = nTime;        SysTick->LOAD=9*nTime; //ê±¼ä¼óÔØ                                   SysTick->VAL=0x00;        //Çå¿Õ¼ÆêyÆ÷        SysTick->CTRL=0x00000003;
  while(TimingDelay != 0);        SysTick->CTRL = 0x00000002;        SysTick->VAL=0x00; }



void delay_ms(uint32_t n){        uint16_t i; for(i=1000;i>1;i--)         delay_us(1000);        }

/**  * @brief  Decrements the TimingDelay variable.  * @param  None  * @retval None  */void TimingDelay_Decrement(void){  if (TimingDelay != 0x00)  {     TimingDelay--;  }        }





delay.h文件如下 :
#ifndef __SYSTICK_H#define __SYSTICK_H
#include "stm32f10x.h"
void Systick_Init(void);void delay_us(uint32_t nTime);void delay_ms(uint32_t nTime); void TimingDelay_Decrement(void);
#endif /* __SYSTICK_H */



中断函数
void SysTick_Handler(void)
{
        TimingDelay_Decrement( );
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lvehe
1楼-- · 2019-08-20 00:30
本帖最后由 lvehe 于 2017-5-3 15:21 编辑

问题就出在这个函数:
[mw_shl_code=c,true]void delay_us(uint32_t nTime)
{
        TimingDelay = nTime;
        SysTick->LOAD=9*nTime;                    
        SysTick->VAL=0x00;
        SysTick->CTRL=0x00000003;

        while(TimingDelay != 0);
        SysTick->CTRL = 0x00000002;
        SysTick->VAL=0x00;
}[/mw_shl_code]SysTick->LOAD = 9 * nTime;
请问你这句是什么意思?
假设你的单片机是72MHz速度运行的,那么如果nTime为1,那么中断频率就是72 000 000/(9+1)=7 200 000Hz!!!
所以你的程序永远处在SysTick中断里面出不来,根本没有办法在中断以外去检测TimingDelay。
SysTick的中断频率建议还是1000Hz,即周期1ms,要想获得微秒级延时,建议仍用摘取法。
归根结底是因为你的程序中断频率过高导致的,不要这样写就行了。
正点原子
2楼-- · 2019-08-20 03:06
仿真找问题了
xyz1015231411
3楼-- · 2019-08-20 07:01
我还用了一种用查询的方法写的可以,就是没有开启嘀嗒中断,去执行TimingDelay_Decrement( )这个函数,也没有这个函数了,但是用中断的方法就是不行,仿真发现程序好像老是跳不出中断函数。
huishun1314
4楼-- · 2019-08-20 10:01
 精彩回答 2  元偷偷看……
xyz1015231411
5楼-- · 2019-08-20 10:39
试了还是不行,感觉好奇葩?
xyz1015231411
6楼-- · 2019-08-20 11:26
仿真调试的时候发现程序停在While那里。while(TimingDelay != 0);

一周热门 更多>