查看: 6938|回复: 4

LPtim32, BStim32,comp 未使能,即使清标志位,仍然能进入中断服务函数

[复制链接]

1

主题

2

帖子

53

积分

中级工程师

Rank: 2

积分
53
发表于 2021-5-8 21:25:26 | 显示全部楼层 |阅读模式
芯片: FM33LCO26N
环境:IAR
一上电,LPtim32 初始化的时候,选择的是外部低速时钟,中断使能,清溢出标志位等一系列操作,但是没有使能计数,这个时候,会自动进一次中断,即使清中断标志位,并且重载值设置很大,还是会马上进中断服务函数。
BSTIM32也有着相同的问题。初始化的时候会自动进一次中断,之后就是正常的计数溢出。进入中断。
比较器也是一样,初始化的时候,设置上升沿触发,之后会自动进一次中断,外部引脚电平没有发生变化。
因为比较器和BSTIM32 我不是一直用的,用的时候开启,不用的时候关闭。
多进一次中断的问题可能在哪,怎么去排查?
下面是BSTIM32 定时器的初始化,时钟源选择的是RCHF, 我没有调用  FL_BSTIM32_Enable(BSTIM32); 并且清除溢出标志位了,但是还是会马上进一次中断。
void bstim32_init(void)
{
    /*IO CONFIG*/
    FL_BSTIM32_InitTypeDef    defaultInitStruct;
    NVIC_ConfigTypeDef    InterruptConfigStruct;

    defaultInitStruct.prescaler = 7;
    defaultInitStruct.autoReload = BSTIM32_TICKS_MS(200);
    defaultInitStruct.autoReloadState = ENABLE;
    defaultInitStruct.clockSource = FL_RCC_BSTIM32_CLK_SOURCE_APB1CLK;
    FL_BSTIM32_Init(BSTIM32, &defaultInitStruct);

   FL_BSTIM32_SetOnePulseMode(BSTIM32, FL_BSTIM32_ONE_PULSE_MODE_SINGLE); //设置单脉冲模式

    FL_BSTIM32_Disable(BSTIM32);
    FL_BSTIM32_DisableIT_Update(BSTIM32);

    FL_BSTIM32_ClearFlag_Update(BSTIM32);
    FL_BSTIM32_EnableIT_Update(BSTIM32);

   FL_BSTIM32_WriteCounter(BSTIM32, 0);

    InterruptConfigStruct.preemptPriority = 0x03;
    NVIC_Init(&InterruptConfigStruct,BSTIM_IRQn);
}

回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-5-11 10:23:36 | 显示全部楼层
首先,进入中断必须是有if标志,仿真看下,标志是不是在。在开启nvic时if是不是在
回复

使用道具 举报

1

主题

2

帖子

53

积分

中级工程师

Rank: 2

积分
53
 楼主| 发表于 2021-5-11 14:08:12 | 显示全部楼层
顾博文 发表于 2021-5-11 10:23
首先,进入中断必须是有if标志,仿真看下,标志是不是在。在开启nvic时if是不是在 ...

现在的问题是调用FL_BSTIM32_EnableIT_Update(BSTIM32); 并且在没有调用FL_BSTIM32_Enable(BSTIM32)的情况下,中断标志位马上置位了。其它外设也这样。
当然我发现相同内核的不同厂商芯片也有这样的情况,那我就不纠结了,当然如果有好的方式规避那就更好了。
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-5-13 08:46:56 | 显示全部楼层
那就在 FL_BSTIM32_EnableIT_Update(BSTIM32); 后去清if 标志  FL_BSTIM32_ClearFlag_Update(BSTIM32);,改下顺序。配置过程不排除if被置起,只要在打开nvic前清掉就好了。
回复

使用道具 举报

35

主题

109

帖子

1518

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1518
发表于 2021-5-19 11:29:23 | 显示全部楼层
LPTIME和BSTIME看了下,在例程中并没有这个问题。
BSTIME有点特殊的地方是初始化时置位了UG,会有中断标志产生,假如在使能中断前成功清除了标志,是不会进入中断的。
在最新的例程中在 FL_BSTIM32_Init函数里,清除了这个标志,在之前比较旧的版本并没有清除。另外清标志需要注意的是有个同步过程,假如系统时钟太快,刚执行完清标志动作,就使能了中断。有可能在使能中断时标志还没有被清除。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表