qq_39260484 2021-12-07 11:21 采纳率: 100%
浏览 684
已结题

基于STM32hal库定时中断出现的问题

问题遇到的现象和发生背景

基于HAL库配置TIM2定时器,配置为每1分钟进入中断,编写中断回调函数,在程序初始化运行的时候就进入了TIM2中断

问题相关代码,请勿粘贴截图

MX_GPIO_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_I2C3_Init();
MX_SPI2_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();

HAL_TIM_Base_Start_IT(&htim2);

这里GPIO初始化为
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);

重写定时中断回调函数(实现对PC8引脚的翻转)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时中断函数
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);

  }

}

在while函数里进行串口输出观察实验现象
while (1)
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==GPIO_PIN_RESET)
printf("%d\r\n",0);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==GPIO_PIN_SET)
printf("%d\r\n",1);
HAL_Delay(1000);
}
/PC8引脚为低则输出0,PC8引脚为低则输出1/

那么问题来了
按正常初始化后,程序运行PC8应该是低电平,输出应该是0,但是程序初始化之后,PC8为高电平,输出为1(就好像程序刚运行就进入了TIM2中断,进行了电平反转)

不过定时器后续工作仍正常,依然能实现1分钟进入中断反转一次

运行结果及报错内容

img


程序初始化之后,PC8好像进入中断了一样,被翻转为高,

我的解答思路和尝试过的方法

尝试过改变终端回调函数的位置,无济于事

我想要达到的结果

程序初始化运行时,PC8不应该被翻转,输出应该为低电平为0.而不是1

  • 写回答

1条回答 默认 最新

  • qq_39260484 2021-12-07 16:09
    关注

    我自己已经解决这个问题了,原因是32上电之后会默认进一次定时中断
    在HAL_TIM_Base_Start_IT(&htim2);这句话前加一个这个__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 MATLAB动图问题
  • ¥15 有段代码不知道怎么理解,const isToken = (config.headers || {}).isToken === false
  • ¥100 采用栈和深度优先算法对我的代码进行修改显示路径
  • ¥15 pointnet2包安装
  • ¥20 射频功率问题,解答者有酬谢!
  • ¥80 构建降雨和积水的预测模型
  • ¥15 #Qt Transform setTransform()在鼠标拖动移动视角是一致在原地不动,无法变换视角(细微观察似乎视图有在原地抖动),无法变换视角(细微观察似乎视图有在原地抖动)
  • ¥50 如何利用无人机拍摄的数码照片测量鸟卵的长短径
  • ¥100 github贡献者给与奖励
  • ¥15 使用DS18B20+ESP8266获取温度数据返回-127.00