当前位置: 代码迷 >> 单片机 >> stm8s根据定时器写延时函数始终不成功,定时无有关问题
  详细解决方案

stm8s根据定时器写延时函数始终不成功,定时无有关问题

热度:214   发布时间:2016-04-28 14:47:35.0
stm8s根据定时器写延时函数始终不成功,定时无问题
测试时候发现。
全局时钟初始化,定时器初始化,中断处理函数,中断向量结构,全局中断都没问题。
下面是定时中断处理函数。

@far @interrupt void irq_10ms_flag(void)
 {
TIM5_SR1 = 0X0; //置位中断
freq =~freq;
 //PF_ODR = ~PF_ODR;   -----------------问题一
count_10ms--;
if (count_10ms <= 0)
  count_10ms = 0;
time_freq++;
if (time_freq > 100) //修改time_freq为int
{
//PF_ODR = ~PF_ODR;           --------------问题二
time_freq = 0; //为1000时处理时间,一秒处理一次
}
 }

这个函数是没有问题的,但是我考虑到通用性,想通过在定时器中断处理函数中设置flag的方法,来延时。
于是,我屏蔽上面的问题一,问题二。
重新写了几个个函数。
函数一。

void delay_10ms(void)
{
  unsigned char temp = freq;
  while (temp == freq)
_asm("nop");
}

函数二。

void delay_10ms(unsigned char ten_ms)
{
  count_10ms = ten_ms;
  while (count_10ms)
_asm("nop");
}

再在主函数中写入

while(1)
{
PF_ODR = ~PF_ODR;
delay_10ms();
//delay_10ms(100);
}


这两个函数,不论哪一个都没有起到延时的作用。无论是上面的10ms还是下面的1秒,示波器显示全是稳定高电平。
如果将延时函数提到前面,就稳定低电平,也就是说delay_10ms这个函数死循环了。
------解决思路----------------------
/**虽然怪怪的,但程序逻辑没有问题,不确认楼主开启中断后再去初始化行不行,但正常是这样的初始化**/
main()
{   
    _asm("sim" );           //禁止中断
    init();                           
    _asm("rim" );     
    while (1)
    {   
      delay_10ms(100);
      PF_ODR = ~PF_ODR;
    }
}
    
------解决思路----------------------
//我这么写一点问题都没有。
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_OVR_UIF_IRQHandler(void)
{
TIM4_SR=0x00;
count_250us++; 
if(count_250us%4==0){
ms_count++;
}
if(count_250us==4000){
System_Time++;          //+1/s
count_250us=0;
}
}
void delay_ms(unsigned int time)
{
ms_count=0;
while(ms_count<time);
}