【问题标题】:stm32f051r8t6 TIM14 interrupt handler not working after resetstm32f051r8t6 TIM14 中断处理程序在复位后不工作
【发布时间】:2019-01-02 12:40:12
【问题描述】:

我正在使用 STM32CubeMX 将代码生成到 IAR,并且我正在使用 stm32f051r8t6 微控制器, 我遇到的问题是,当第一次将代码加载到芯片上时,一切正常,但是在板子或 IAR 调试器上按重新启动后,没有进入 TIM14 中断处理程序,但是一旦我离开调试器和再次输入,它开始工作,直到我按重新启动。有没有人遇到过这个问题?我的代码在下面

static void MX_TIM14_Init(void);

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM14)
  {
    HAL_GPIO_WritePin(GPIOA, USART1_TE_Pin, GPIO_PIN_SET);
  }
}

int main(void)
{
   /* USER CODE BEGIN 1 */

   /* USER CODE END 1 */

   /* MCU Configuration---------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the
  Systick.    */
  HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_TIM14_Init();

  HAL_TIM_Base_Start(&htim14);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 while (1)
{
FslBufferControl();
MimModeCheck();
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
static void MX_TIM14_Init(void)
{

 /* USER CODE BEGIN TIM14_Init 0 */

 /* USER CODE END TIM14_Init 0 */

 /* USER CODE BEGIN TIM14_Init 1 */

 /* USER CODE END TIM14_Init 1 */
 htim14.Instance = TIM14;
 htim14.Init.Prescaler = 47999;
 htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
 htim14.Init.Period = 1;
 htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
 if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
 {
  Error_Handler();
 }
 /* USER CODE BEGIN TIM14_Init 2 */

 /* USER CODE END TIM14_Init 2 */

 }

【问题讨论】:

  • 听起来更像是调试器问题而不是编程问题。
  • 我也是这么想的,但是当我让芯片运行电源并且没有连接到PC时,出现了同样的问题

标签: c embedded stm32 interrupt-handling stm32f0


【解决方案1】:

您需要添加以启用中断。

  MX_TIM14_Init();

  HAL_NVIC_EnableIRQ(TIM14_IRQn);   // <----------------------------

  HAL_TIM_Base_Start(&htim14);

只需检查 IRQn TIM14 UG 事件编号。它们在STM32F___.h 文件中定义的IRQn_Type 枚举类型中定义,其中___ 是您的微型模型(您可以在包含文件夹中找到它)

【讨论】:

  • 非常感谢! TIM14 IRQn 是 19,所以我需要写 'HAL_NVIC_EnableIRQ(TIM14_IRQ19) 吗?
  • 嗨,我已将该行添加到我的代码中,不幸的是,同样的事情正在发生,在调试器的初始加载时它工作正常,但是在按下重新启动后它不会进入 'void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)'函数
  • TIM14_IRQn ----
  • 嗨,我刚刚意识到我的错误,因为我使用的是新的 IDE(从 keil 到 IAR)我没有意识到调试器被自动设置为“软件重置”而不是“硬件休息引脚” ,我已经更改了这个设置,现在它可以在调试器中正常工作,并且没有,谢谢你的帮助
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多