[STM8] switch 进入不了

[复制链接]
2269|5
 楼主| lonky888 发表于 2013-6-13 19:46 | 显示全部楼层 |阅读模式
#include <STM8L151K4.h>

static unsigned short s_Cnt = 10000;

_Bool LED @PB_ODR:4;
_Bool LED1 @PB_ODR:3;

void PortInit(void)
{
        PB_CR1 = (1<<4)|(1<<3);
        PB_CR2 &= ~((1<<4)|(1<<3));
        PB_DDR = (1<<4)|(1<<3);
        LED = 1;
        LED1 = 0;
}

void Timer1Init(void)
{
        TIM1_IER = 0x00;
        TIM1_CR1 = (1<<7);        //自动重载使能
        TIM1_EGR = 0x01;        //产生更新事件
        TIM1_PSCRH = 0x1F;        //分频
        TIM1_PSCRL = 0x3F;
        TIM1_ARRH = 0x00;        //最大限度
        TIM1_ARRL = 0x00;
        TIM1_CR1 |=0x01;        //使能计数
        TIM1_IER = 0x01;        //
}

@far @interrupt void Timer1OverISR(void)        //0.5ms
{
        TIM1_SR1 = 0x00;
        LED1 = ~LED1;
       
        if (s_Cnt != 0)
        {
                s_Cnt--;
        }
}

main(void)
{
        static unsigned char num = 0;
       
        _asm("sim");
       
        PortInit();
       
        CLK_CKDIVR = 0x00;        //不分频
        CLK_ICKCR = (1<<0) | (1<<4);
        while ((CLK_ICKCR&(1<<1)) == 0);
        CLK_PCKENR1 = 0xFF;
        CLK_PCKENR2 = 0x3F;       
       
        //CLK_ICKCR |= (1<<2);
        //while ((CLK_ICKCR&(1<<3)) == 0);
       
        _asm("rim");
       
        while(1)
        {
                switch (num)
                {
                case 0:
                        num++;
                       
                        s_Cnt = 10000;
                       
                        LED = 0;
                       
                        TIM1_IER = 0x00;
                        //TIM1_CR1 = (1<<7);        //自动重载使能
                        TIM1_EGR = 0x01;        //产生更新事件
                        TIM1_PSCRH = 0x00;        //
                        TIM1_PSCRL = 0x00;
                        TIM1_ARRH = 0x1F;        //最大限度
                        TIM1_ARRL = 0x40;
                        TIM1_CR1 |=0x01;        //使能计数
                        TIM1_IER = 0x01;        //       
                        break;
                case 1:
                        if (s_Cnt == 0)
                        {
                                num = 2;
                        }
                        break;
                case 2:
                        num++;
               
                        s_Cnt = 52000;
               
                        TIM1_IER = 0x00;
                        //TIM1_CR1 = (1<<7);        //自动重载使能
                        TIM1_EGR = 0x01;        //产生更新事件
                        TIM1_PSCRH = 0x00;        //分频
                        TIM1_PSCRL = 0x00;
                        TIM1_ARRH = 0x00;        //最大限度
                        TIM1_ARRL = 10;
                        TIM1_CR1 |=0x01;        //使能计数
                        TIM1_IER = 0x01;
                        break;
                case 3:
                        LED = 1;
               
                        if (s_Cnt == 0)
                        {
                                num = 0;
                        }
                        break;
                }
        }
}
 楼主| lonky888 发表于 2013-6-13 19:48 | 显示全部楼层
switch 0 1 2 都可以运行 一旦执行到2 再也进不去3 求指导。。why   产生波形是对的
cjhk 发表于 2013-6-13 22:00 | 显示全部楼层
标志位没有及时清除吧  个人的理解   你再看看别人的意见吧   
ComeONic 发表于 2013-6-14 11:04 | 显示全部楼层
你如何判断没有进入3 ?
其实已经进去了,只是没有根据3中的语句再进入0 !
if (s_Cnt == 0)
                        {
                                num = 0;
                        }
检查几个方面:
1。 中断是否执行?(这个是让s_Cnt =0的关键)
2。 变量s_Cnt 最好定义为 volatile 类型,这个我就不解释了。。
3。 无符号数最好不要判读是否等于0, 你可以将变量设为 volatile static int s_Cnt  = 10000 ;
        在num=2的case 2中,将s_Cnt = 52000(溢出)改为32767以内的任何数,通过更改定时器初值达到你的目的。
然后在中断函数中将:
if (s_Cnt != 0)
        {
                s_Cnt--;
        }
改为:
if (s_Cnt > 0)
        {
                s_Cnt--;
        }
这些都是我个人习惯,更加严谨点。。。
grasswolfs 发表于 2013-6-14 14:20 | 显示全部楼层
把这句改了 if (s_Cnt == 0)
很多时候出问题的并不是看起来的地方,LS好习惯
hawksabre 发表于 2013-6-14 19:10 | 显示全部楼层
在程序编写时    习惯很重要  尽量严谨一点  比较好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部