OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4645|回复: 5

STM8L定时器TIM3中断问题(STVD环境)

[复制链接]

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
发表于 2016-9-5 14:37:18 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 紫气东升 于 2016-9-5 16:02 编辑

定时100ms让LED_Er亮起来,然而并没有实现功能。请各位大侠帮看看是什么问题。
#include<stm8l052c6.h>

#define LED_HB 0x01 << 1
#define LED_Er 0x01 << 0

void IO_Init(void)
{
    PD_ODR=0x00;    //刚开始LED全灭
    PD_DDR=0xff;     //输出模式
    PD_CR1=0xff;     //推挽输出
    PD_CR2=0x00;    //低速输出
}
void TIM3_Init(void)
{
   TIM3_PSCR=0x03;   //分频值16MHZ/(2^3)=250KHZ
   TIM3_IER=0x01;     //open timer interrupt
   TIM3_ARR=250;     //自动重载值,1/250Kx200=1ms
   TIM3_CNTR=250;   //计数器初始值200
}
void main(void)
{
    IO_Init();
    TIM3_Init();
    _asm("rim");
    TIM3_CR1|=0x01;      //Start time
    while(1)
    {
        PD_ODR^=LED_HB;
    }
}

@far @interrupt void TIM3_IRQ(void)
{
    unsigned int count = 0;
    count++;
    TIM3_SR1=0x00;
    if(count==100)//计时100次则100ms到
    {
        PD_ODR^=LED_Er;
        count=0;
    }
}


天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-5 15:21:49 | 显示全部楼层
先debug看看有没有进中断
while 里这个表达式去掉PD_ODR^=LED_HB;随便放个delay什么的
中断里的表达式改成取反操作试试。建议刚开始学程序搞简单点,别把自己绕进去了。
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-9-5 15:36:49 | 显示全部楼层
liarlaker 发表于 2016-9-5 15:21
先debug看看有没有进中断
while 里这个表达式去掉PD_ODR^=LED_HB;随便放个delay什么的
中断里的表达式改 ...

“错误:在调试阶段开始之前,请选择一个目标” 这是什么意思
捕获2.PNG
天道酬勤
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-5 15:42:54 | 显示全部楼层
紫气东升 发表于 2016-9-5 15:36
“错误:在调试阶段开始之前,请选择一个目标” 这是什么意思

需要设置一下下载器型号,例如:ST-LINK
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-9-5 16:17:43 | 显示全部楼层
liarlaker 发表于 2016-9-5 15:21
先debug看看有没有进中断
while 里这个表达式去掉PD_ODR^=LED_HB;随便放个delay什么的
中断里的表达式改 ...

还是不得,这个程序够简单的了。这是老板的要求,在这几天之内要做出来
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-9-6 13:45:04 | 显示全部楼层
经过修改后可以进中断 了,但是问题又来了,主函数的LED_HB仍然在不断闪烁,不受中断影响。我所设置的定时100ms进入中断好像没有用了,不知道是不是真的定时100ms才进入的中断。哪位大神会的请帮解决下,谢谢!

#include <stm8l052c6.h>

#define LED_HB 0x01 << 1
#define LED_Er 0x01 << 0
#define UIE 1 << 0
#define CEN 1 << 0

void delay(unsigned int time);
void IO_Init(void)
{
        PD_ODR=0x00;
        PD_DDR=(LED_HB)|(LED_Er);
        PD_CR1=(LED_HB)|(LED_Er);
        PD_CR2=0x03;
}
void TIM4_Init(void)
{
        TIM4_PSCR=0x0f;   //The prescaler value of 250KHZ
        TIM4_IER=(UIE);    //open timer interrupt
        TIM4_ARR=0xff;
        TIM4_CNTR=0xff;
        TIM4_CR1=(CEN);      //Start time
}
void main(void)
{
        CLK_PCKENR1=0x0f;
        IO_Init();
        TIM4_Init();
        _asm("rim");
        while(1)
        {       
                        PD_ODR^=LED_HB;
                        delay(50000);
        }
}

@far @interrupt void TIM4_IRQ(void)
{
        TIM4_SR1=0x00;
        PD_ODR^=LED_Er;
}

// This function is very roughly 1ms delay IT IS not precise
// max input is 65500
void delay(unsigned int time)
{       
        while(time--);
}

天道酬勤
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-9-29 05:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表