ST意法半导体
直播中

风尚男人

8年用户 903经验值
私信 关注
[问答]

为什么HAL_UART_Transmit_DMA(&huart2, buffer, n) 在Timer中断回调函数中不能正常工作?

大家好,
我可以在这里帮忙吗?我目前正在使用 STM32F303K8。我在“主 while 循环”和 tiM6_DAC1_IRQHandler(void) 中试验了 HAL_UART_Transmit_DMA 函数,它在时基模式下从 TIM6 调用
我的应用程序是通过 UART 发送当前编码器计数。最好以可确定的速率发送,这就是为什么我更喜欢使用 Timer。

这是我使用轮询模式时的部分代码(main.c)
  • /* USER CODE BEGIN 2 */
  •   HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
  •   HAL_TIM_Base_Start_IT(&htim6);
  •   //HAL_UART_Receive_DMA(&huart2, pData, Size)
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •     char buffer[12];
  •     int n = sprintf(buffer, "%ld
    ", TIM2->CNT);
  •     HAL_UART_Transmit_DMA(&huart2, buffer, n);
  •     HAL_Delay(200);
  •   }
  •   /* USER CODE END 3 */
这是定时器中断模式(stm32f3xx_it.c)
  • void TIM6_DAC1_IRQHandler(void)
  • {
  •   /* USER CODE BEGIN TIM6_DAC1_IRQn 0 */
  •   /* USER CODE END TIM6_DAC1_IRQn 0 */
  •   HAL_TIM_IRQHandler(&htim6);
  •   /* USER CODE BEGIN TIM6_DAC1_IRQn 1 */
  •   char buffer[12];
  •   int n = sprintf(buffer, "%ld
    ", TIM2->CNT);
  •   HAL_UART_Transmit_DMA(&huart2, buffer, n);
  •   /* USER CODE END TIM6_DAC1_IRQn 1 */
  • }
以 64MHz 运行的时钟
TIM6->PSC = 6399 和 TIM6->ARR = 1999
所以,预期的中断率是 5Hz(类似于 delay(200 ms))
2模式之间的结果是从下面

我真的很好奇这个,既然频率很低,应该没问题,还是我遗漏了什么?












回帖(1)

张瑞

2023-2-7 15:08:21
我认为这是因为您在 TIM6_DAC1_IRQHandler 中定义了缓冲区。
尝试使用全局定义的缓冲区。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分