打印
[STM8]

STM8L定时器问题

[复制链接]
984|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
紫气东升|  楼主 | 2016-9-5 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 紫气东升 于 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;   //分频值2MHZ/(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;
    }
}
沙发
xyz549040622| | 2016-9-5 15:08 | 只看该作者
配置都是寄存器,这个没看,自己确认。中断中的count 应该是用static类型的了。

使用特权

评论回复
板凳
xmshao| | 2016-9-5 16:28 | 只看该作者
先用简单地IO翻转操作验证 基本配置及硬件;

如果OK了,在开启中断 验证中断矢量的配置及代码;

使用特权

评论回复
地板
紫气东升|  楼主 | 2016-9-5 17:00 | 只看该作者
xmshao 发表于 2016-9-5 16:28
先用简单地IO翻转操作验证 基本配置及硬件;

如果OK了,在开启中断 验证中断矢量的配置及代码; ...

不会怎么做

使用特权

评论回复
5
紫气东升|  楼主 | 2016-9-5 17:02 | 只看该作者
6
超超呼叫乐乐| | 2016-9-5 17:12 | 只看该作者
在定时器中断中清,中断标志位了么?如果清了,开总中断了么?如果开了,那就只剩下配置定时器的问题了

使用特权

评论回复
7
flyman613| | 2016-9-5 21:11 | 只看该作者
ST8L是定时器是需要开启时钟信号使能的

使用特权

评论回复
8
lilinfei520| | 2016-9-6 09:50 | 只看该作者
把中断里的count定义为全局变量

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3 赞一个!
9
xiaox314| | 2016-9-6 10:58 | 只看该作者
定时器时钟开了吗,

使用特权

评论回复
10
xiaox314| | 2016-9-6 10:58 | 只看该作者
STM8L系列的外设时钟一般默认关闭,用之前需要打开时钟

使用特权

评论回复
11
jekey| | 2016-9-6 11:22 | 只看该作者
st的库有各种外设例程,参考例程吧。

使用特权

评论回复
12
紫气东升|  楼主 | 2016-9-6 13:52 | 只看该作者
经过修改后可以进入中断了,然而问题又来了。进入中断后主函数的LED_HB仍然在不断闪烁,并没有受到中断影响,这又是什么原因?

#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--);
}

使用特权

评论回复
13
紫气东升|  楼主 | 2016-9-9 14:00 | 只看该作者
有哪位大神会的请多多指教

使用特权

评论回复
14
Rangar| | 2016-9-10 21:03 | 只看该作者
中断标志位了么

使用特权

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

本版积分规则

17

主题

97

帖子

0

粉丝