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口(使用定时器作中断),在基于官方库函数的基础上我应该作啥修改?
望各位大佬指教~~~~
谢谢大家!
另外如果要是使用官方库函数的话,还需要写那些带中断号的中断程序吗? 蹲 static unsigned char cnt=0;这里不能指定cnt=0吧。每次进入中断都会重新定义为0
如果是全局变量可以指定=0. zhang32568 发表于 2024-10-25 08:48
static unsigned char cnt=0;这里不能指定cnt=0吧。每次进入中断都会重新定义为0
如果是全局变量可以指定 ...
加了static就已经变成静态变量了啊{:4_200:}
页:
[1]