HC32F030进不了TIMER定时中断。
我在HC32F030上运行TIMER3定时中断,也不行。进不了中断,为什么。注:使用驱动库中的DEMO, keil 中有 --keep=*Handler。 这是它的源代码,程序运行正常,就是无中断响应。
int32_t main(void)
{
uint16_t u16ArrValue;
uint16_t u16CntValue;
stc_tim3_mode0_config_t stcTim3BaseCfg;
stc_gpio_config_t stcTIM3A0Port;
stc_gpio_config_t stcTIM3B0Port;
DDL_ZERO_STRUCT(stcTim3BaseCfg);
DDL_ZERO_STRUCT(stcTIM3A0Port);
DDL_ZERO_STRUCT(stcTIM3B0Port);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //GPIO 外设时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能
//PA08设置为TIM3_CH0A
//Gpio_ClrAnalogMode(GpioPortA, GpioPin8);
stcTIM3A0Port.enDir= GpioDirOut;
Gpio_Init(GpioPortA, GpioPin8, &stcTIM3A0Port);
Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2);
//PA07设置为TIM3_CH0B
//Gpio_ClrAnalogMode(GpioPortA, GpioPin7);
stcTIM3B0Port.enDir= GpioDirOut;
Gpio_Init(GpioPortA, GpioPin7, &stcTIM3B0Port);
Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4);
stcTim3BaseCfg.enWorkMode = Tim3WorkMode0; //定时器模式
stcTim3BaseCfg.enCT = Tim3Timer; //定时器功能,计数时钟为内部PCLK
stcTim3BaseCfg.enPRS = Tim3PCLKDiv16; //PCLK/16
stcTim3BaseCfg.enCntMode= Tim316bitArrMode; //自动重载16位计数器/定时器
stcTim3BaseCfg.bEnTog = TRUE;
stcTim3BaseCfg.bEnGate = FALSE;
stcTim3BaseCfg.enGateP = Tim3GatePositive;
stcTim3BaseCfg.pfnTim3Cb= Tim3Int; //中断函数入口
Tim3_Mode0_Init(&stcTim3BaseCfg); //TIM3 的模式0功能初始化
u16ArrValue = 0x9000;
Tim3_M0_ARRSet(u16ArrValue); //设置重载值
u16CntValue = 0x9000;
Tim3_M0_Cnt16Set(u16CntValue); //设置计数初值
Tim3_ClearIntFlag(Tim3UevIrq); //清中断标志
EnableNvic(TIM3_IRQn, 3, TRUE); //TIM3 开中断
Tim3_Mode0_EnableIrq(); //使能TIM3中断(模式0时只有一个中断)
Tim3_M0_EnTOG_Output(TRUE); //TIM3 端口输出使能
Tim3_M0_Run(); //TIM3 运行。
while (1);
} /*******************************************************************************
*中断服务函数
******************************************************************************/
void Tim3Int(void)
{
if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
{
Tim3_ClearIntFlag(Tim3UevIrq);
}
}
驱动库是“ HC32F030_DDL_Rev1.3.1” 什么啊,直接在驱动库的例子程序中,打开项目,正常运行,进入中断。
复制出来,拷贝到工程模板中运行,则中断不行,其余正常。keil时也没有报错。 本帖最后由 凡人8000 于 2021-3-22 11:57 编辑
这是因为启动文件中定义的中断服务函数不一致导致的,,你必须把ddl.h中的这段定义屏蔽掉才行。
这就可以进入中断了:
凡人8000 发表于 2021-3-22 11:48
这是因为启动文件中定义的中断服务函数不一致导致的,,你必须把ddl.h中的这段定义屏蔽掉才行。
楼上正解,驱动库的启动文件和模板启动文件的中断名定义不一样,所以造成楼主的异常现象 谢谢楼上二位,结帖 我用HC32F030的定时器的编码器功能,设置计数上溢出和下溢出中断,寄存器设置是正常的,中断也会出现,但调试过程中发现,上溢出或下溢出时都能进中断,下溢出时,中断标志是正常的,
调用库函数获得其中断标志位true,Adt_GetIrqFlag(pCounter, AdtUDFIrq, &flag), flag = true、正常的执行下溢出部分程序,
而上溢出的时候,同样调用函数Adt_GetIrqFlag(pCounter, AdtUDFIrq, &flag),得到的flag不为true,上溢出中断标志没有置位,因而无法正常执行上溢出部分程序,
查看代码也没看出什么问题
先看初始化代码
DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
Adt_DeInit(pEncoder);
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE); //ADT外设时钟使能
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //Sawtooth Mode
stcAdtBaseCntCfg.enCntDir = AdtCntUp; // Cnt up
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0; // PCLK0/4
Adt_Init(pEncoder, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置
uint16_tu16Period = 0xFFFF;
Adt_SetPeriod(pEncoder, u16Period); //周期设置
// 端口配置捕获输入
stcAdtACfg.enCap = AdtCHxCompareInput; //Channel A 作为捕获输入(used as capture input)
stcAdtACfg.bFltEn = TRUE; //FALSE;
stcAdtACfg.enFltClk = AdtFltClkPclk0Div4; // AdtFltClkPclk0Div16
Adt_CHxXPortConfig(pEncoder, AdtCHxA, &stcAdtACfg); //Channel A配置 & GPIO CHA 输入滤波使能
stcAdtBCfg.enCap = AdtCHxCompareInput; //Channel B 作为捕获输入(used as capture input)
stcAdtBCfg.bFltEn = TRUE;
stcAdtBCfg.enFltClk = AdtFltClkPclk0Div4;
Adt_CHxXPortConfig(pEncoder, AdtCHxB, &stcAdtBCfg);
Adt_ClearIrqFlag(pEncoder,AdtOVFIrq );
Adt_ClearIrqFlag(pEncoder,AdtUDFIrq );
Adt_ConfigIrq(pEncoder, AdtOVFIrq, TRUE, NULL); //捕获上溢中断
Adt_ConfigIrq(pEncoder, AdtUDFIrq, TRUE, NULL); //捕获下溢出中断
EnableNvic(encCountIrqN, IrqLevel1, TRUE); //AdvTimer中断使能
Adt_StartCount(pEncoder);
中断代码如下
if(Ok == Adt_GetIrqFlag(pCounter, AdtOVFIrq, &flag))
{ // 上溢出中断
if(flag == TRUE)
{
axisOverCount++;
Adt_ClearIrqFlag(pCounter, AdtOVFIrq);
}
}
if(Ok == Adt_GetIrqFlag(pCounter, AdtUDFIrq, &flag))
{ //下溢出中断
if(flag == TRUE)
{
axisOverCount--;
Adt_ClearIrqFlag(pCounter, AdtUDFIrq);
}
}
请大咖们帮忙分析一下是什么原因造成的,谢谢先 lesheng002 发表于 2021-4-2 07:44
我用HC32F030的定时器的编码器功能,设置计数上溢出和下溢出中断,寄存器设置是正常的,中断也会出现,但调 ...
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //Sawtooth Mode
stcAdtBaseCntCfg.enCntDir = AdtCntUp; // Cnt up
你这个设置的是锯齿波的向上计数模式,所以只有上溢中断有效吧,下溢中断理论上是无效的。
如果同时使能上下溢,因为间隔只有1个cnt值,没有这样试过。
楼主如果需要上下溢中断,建议CntMode换成三角波模式。 开启中断使能了吗 不要忘记总中断也要使能 设置的模式问题 --keep=*Handler 这个是什么意思啊 溢出还分方向啊? 感谢楼主的分享
页:
[1]
2