打印
[STM8]

switch 进入不了

[复制链接]
1900|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--;
        }
这些都是我个人习惯,更加严谨点。。。

使用特权

评论回复
5
grasswolfs| | 2013-6-14 14:20 | 只看该作者
把这句改了 if (s_Cnt == 0)
很多时候出问题的并不是看起来的地方,LS好习惯

使用特权

评论回复
6
hawksabre| | 2013-6-14 19:10 | 只看该作者
在程序编写时    习惯很重要  尽量严谨一点  比较好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝