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

基于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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错