打印
[STM8]

stm8s003f定时器完全无法起作用

[复制链接]
楼主: jlyuan
手机看帖
扫描二维码
随时随地手机跟帖
21
tian111| | 2021-7-7 21:10 | 只看该作者 回帖奖励 |倒序浏览
不使用 STVD ,所以不知道是什么错误,建议使用 IAR

使用特权

评论回复
22
jiahy| | 2021-7-7 21:12 | 只看该作者
非严格要求时,CNTR初始为不为0无所谓,不为0只是第一次进中断快一点,以后都是按重载值计时

使用特权

评论回复
23
jlyuan|  楼主 | 2021-7-7 21:14 | 只看该作者
在请问一下啊,那个PWM输出的,设计IO口复用,是不是要把IO口设置成推完输出啊?再在option byte修改?

使用特权

评论回复
24
jiaxw| | 2021-7-7 21:16 | 只看该作者
先要改OPBYTE设置成对应的外设模式,再PWM口设置成推挽输出

使用特权

评论回复
25
liliang9554| | 2021-7-7 21:22 | 只看该作者
你初始化时设置PD2为输出,中断里操作的是PA2

使用特权

评论回复
26
huangchui| | 2021-7-7 21:25 | 只看该作者
我的OPBYTE里没有PORT,应该怎么改?

使用特权

评论回复
27
huangchui| | 2021-7-7 21:28 | 只看该作者
STM8SF103 ,仿真器为:STLINK
TIM4 属于8位定时器,最大128分频。
这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz
这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。

使用特权

评论回复
28
heweibig| | 2021-7-7 21:30 | 只看该作者
//main.c
void Init_Tim4(void)
{
        /*很多人都是在这里装填0xFF,其实是为了让PSC尽快生效,对于PSC的设置,需要在下一个更新事件时才会生效*/
        TIM4_CNTR=0; //计数器值
        TIM4_ARR=0xFA; //自动重装寄存器  250,产生125次定时1S
        TIM4_PSCR=0x07; //预分频系数为128
        TIM4_EGR=0x01; //手动产生一个更新事件,用于PSC生效       注意,是手动更新
        
        TIM4_IER=0x01; //更新事件中断 使能
        TIM4_CR1=0x01; //使能计时器,TIM4_CR0停止计时器
}

void main(void)
{
        _asm("rim"); //这是必须的,因为系统重启后,软件中断级别为3级,处于最高级,除了TRAP,TLI,RESET三个中断外不响应其他中断。
        //rim将软件级别更改为0级别,这样其他中断就能得到相应。
        Init_Tim4();
        while(1);
}

//中断向量表必须将TIM4的中断处理函数填写进去
    {0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */

//处理函数如下:
/*定时器4用作看门狗喂狗定时,因为看门狗最大延时510ms,
定时器频率为4MHz/128=31250 = 250 * 125,125 / 5 = 25 (200ms)*/
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
    t4++;
    TIM4_SR=0; //清除中断标志
    //t4==125  //定时1S
    if(t4==25) //25 * 250 定时200ms
    {
        FREE_IWDG; //喂狗,如果单纯定时用,可以拿掉
       //可以尝试点亮LED灯
        t4=0;
    }
    return;
}

使用特权

评论回复
29
lizye| | 2021-7-7 21:31 | 只看该作者
定时器延时计算过程,如主频4MHz,预分频为128,定时器频率等于 4000000 / 128 = 31250 (Hz),周期为32us。4分频时周期为1us。
如:主频8MHz,预分频为128,定时器频率等于 8000000 / 128 = 62500 (Hz),周期为16us。

使用特权

评论回复
30
shimx| | 2021-7-7 21:34 | 只看该作者
整个代码没有使用库函数,诸如TIM4_SR TIM4_CR1之类的定义在stm8s103k.h,其他的头也可以。

使用特权

评论回复
31
liliang9554| | 2021-7-7 21:37 | 只看该作者
定时器2  (16位计时器) 的简单实用与此类似,但需要注意设置初值的方法,如:
void Init_Tim2(void)
{
        TIM2_EGR=0x01; //手动产生更新事件,重新初始化计数器,并允许产生一个更新事件        
        //设置定时器初值
        TIM2_CNTRH=0; //不能使用TIM2_CNTR直接设值,TIM2_CNTRL=0;
        //设定自动重装寄存器值        
        //这里得注意不能使用TIM2_ARR的方式进行设值,TIM2是十六位的。
        //如TIM2_ARR=0xFA,实际上是赋给高字节了,TIM2_ARRH=0xFA,而不是想象中的赋给低字节。
        TIM2_ARRH=0x7A; //31250 4MHz / 128 = 31250Hz  (1S)
        TIM2_ARRL=0x12; //0x7A12 31250   意味着每产生一次中断时间为1S
        TIM2_PSCR=0x07; //分频128

        TIM2_IER=0x01; //中断允许位使能
        TIM2_CR1=0x01; //使能计时器
}

使用特权

评论回复
32
zhaoxqi| | 2021-7-7 21:39 | 只看该作者
总中断的开启 _asm("rim")

使用特权

评论回复
33
zhenykun| | 2021-7-7 21:40 | 只看该作者
中断向量表对应位置的中断处理过程改写

使用特权

评论回复
34
yszong| | 2021-7-7 21:42 | 只看该作者
定时器自身的使能,包括中断使能和计时器使能

使用特权

评论回复
35
zhanghqi| | 2021-7-7 21:44 | 只看该作者
这句  PA_ODR=0x04; 电平都没翻转

使用特权

评论回复
36
dengdc| | 2021-7-7 21:47 | 只看该作者
默认情况下,TIM4的外设时钟是开启的,CLK_PCKENR为0xFF,外设TIM4时钟如果关闭,时钟是运行不起来的。

使用特权

评论回复
37
juventus9554| | 2021-7-7 21:49 | 只看该作者
没有配置好,导致无法正常运行

使用特权

评论回复
38
jlyuan|  楼主 | 2021-7-7 21:50 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
39
paotangsan| | 2021-8-6 14:20 | 只看该作者
是哪一部分的作用没有起来呢

使用特权

评论回复
40
labasi| | 2021-8-6 14:23 | 只看该作者
有可能寄存器的配置有问题

使用特权

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

本版积分规则