stm8s根据定时器写延时函数始终不成功,定时无有关问题
stm8s根据定时器写延时函数始终不成功,定时无问题
测试时候发现。
全局时钟初始化,定时器初始化,中断处理函数,中断向量结构,全局中断都没问题。
下面是定时中断处理函数。
这个函数是没有问题的,但是我考虑到通用性,想通过在定时器中断处理函数中设置flag的方法,来延时。
于是,我屏蔽上面的问题一,问题二。
重新写了几个个函数。
函数一。
函数二。
再在主函数中写入
这两个函数,不论哪一个都没有起到延时的作用。无论是上面的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);
}
测试时候发现。
全局时钟初始化,定时器初始化,中断处理函数,中断向量结构,全局中断都没问题。
下面是定时中断处理函数。
@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);
}