9DHans 发表于 2023-10-26 15:27:18

STC8H官方库定时器问题


(问题可能是层窗户纸)
如题,最近在下载完STC8H的官方库函数后,卡在了定时器这一示例代码中。

想要实现的功能:定时器4计时1ms,然后进入中断函数过后控制接在P24口的LED以1S的周期闪烁。
#include <STC8H.H>
#include <config.h>
#include <STC8G_H_GPIO.h>
#include <STC8G_H_Delay.h>
#include <STC8G_H_Timer.h>
#include <STC8G_H_NVIC.h>

void GPIO_Config()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.Mode=GPIO_PullUp;    //初始化IO口为准双向口模式
    GPIO_InitStructure.Pin=GPIO_Pin_All;    //指定初始化的IO口(0~7)
    GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);
}

void Timer_Config()
{
    TIM_InitTypeDef        TIM_InitStructure;                                                //结构体定义
    TIM_InitStructure.TIM_ClkOut=DISABLE;       //是否输出高速脉冲, ENABLE或DISABLE
    TIM_InitStructure.TIM_ClkSource=TIM_CLOCK_1T;      //指定时钟源,TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
    TIM_InitStructure.TIM_Mode=TIM_16BitAutoReload;   //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
    //TIM_InitStructure.TIM_PS=;                  //8位预分频器(n+1), 0~255, (注意:并非所有系列都有此寄存器)
    TIM_InitStructure.TIM_Run=ENABLE;             //是否初始化后启动定时器, ENABLE或DISABLE
    TIM_InitStructure.TIM_Value=65536UL - (MAIN_Fosc / (100*12));                //初值;
    Timer_Inilize(Timer4,&TIM_InitStructure);            //初始化结构体
    NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
void Timer4_Isr(void) interrupt 20
{
        static unsigned char cnt=0;
        cnt++;
        if(cnt>100)
        {
                cnt=0;
                P24=~P24;
        }
}


void main(void)
{
        EAXSFR();                /* 扩展寄存器访问使能 */
        GPIO_Config();
        Timer_Config();
        P24=0;
       
        EA=1;
        while(1)
        {
               
        }
               
}
很荣幸,再次没有进入中断
但在翻看官方的库函数时却发现中断函数控制P6口??
(以下是官方库函数)
/************************ 定时器配置 ****************************/
void        Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义

        //定时器0做16位自动重装, 中断频率为100000HZ,中断函数从P6.7取反输出50KHZ方波信号.
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,   TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL - (MAIN_Fosc / 100000UL);                //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        //定时器1做16位自动重装, 中断频率为10000HZ,中断函数从P6.6取反输出5KHZ方波信号.
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_T1Stop
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL - (MAIN_Fosc / 10000);                        //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer1,&TIM_InitStructure);                                //初始化Timer1          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer1_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        //定时器2做16位自动重装, 中断频率为1000HZ,中断函数从P6.5取反输出500HZ方波信号.
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,   TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL - (MAIN_Fosc / 1000);                                //初值
        TIM_InitStructure.TIM_PS      = 0;                                        //8位预分频器(n+1), 0~255, (注意:并非所有系列都有此寄存器,详情请查看数据手册)
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer2,&TIM_InitStructure);                                //初始化Timer2          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer2_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级

        //定时器3做16位自动重装, 中断频率为100HZ,中断函数从P6.4取反输出50HZ方波信号.
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;        //指定时钟源,   TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL - (MAIN_Fosc / (100*12));                //初值
        TIM_InitStructure.TIM_PS      = 0;                                        //8位预分频器(n+1), 0~255, (注意:并非所有系列都有此寄存器,详情请查看数据手册)
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer3,&TIM_InitStructure);                                //初始化Timer3          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer3_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级

        //定时器4做16位自动重装, 中断频率为50HZ,中断函数从P6.3取反输出25HZ方波信号.
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;        //指定时钟源,   TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL - (MAIN_Fosc / (50*12));                //初值
        TIM_InitStructure.TIM_PS      = 0;                                        //8位预分频器(n+1), 0~255, (注意:并非所有系列都有此寄存器,详情请查看数据手册)
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer4,&TIM_InitStructure);                                //初始化Timer4          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer4_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级
}如果想要控制其他IO口(使用定时器作中断),在基于官方库函数的基础上我应该作啥修改?
望各位大佬指教~~~~
谢谢大家!

9DHans 发表于 2023-10-26 15:42:21

另外如果要是使用官方库函数的话,还需要写那些带中断号的中断程序吗?

乌漆嘛黑 发表于 2024-10-24 14:49:59

zhang32568 发表于 2024-10-25 08:48:57

static unsigned char cnt=0;这里不能指定cnt=0吧。每次进入中断都会重新定义为0
如果是全局变量可以指定=0.

_奶咖君_ 发表于 2024-10-25 08:58:46

zhang32568 发表于 2024-10-25 08:48
static unsigned char cnt=0;这里不能指定cnt=0吧。每次进入中断都会重新定义为0
如果是全局变量可以指定 ...

加了static就已经变成静态变量了啊{:4_200:}
页: [1]
查看完整版本: STC8H官方库定时器问题