Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager
  • 硬件环境:TLE9879 EvalKit
  • 软件环境:Keil MDK 5.93
  • 主要配置:UART2配置为TX输出,且有发送完成的中断和回调函数
  • 奇怪现象(上电或PIN复位后可观察到):只要uart2中断回调函数中的循环总数SUM_LIMIT大于某值(详见程序),件硬似乎周期复位(好像是wdt1的复位)。
  • 注意:SUM_LIMIT=1000 or 2000时,驱动LED1上的方波周期分别为2ms or 4ms,中断回调函数执行时间并不久。

 

  • 两个求助:
    1. 分析以上现象的原因.
    2. uart2发送完成的中断回调函数中需不需要软件清零相应标志位呢?

-------------------------以下为代码,所有文件打包于附件------------------------------------

 

 

 

#include 
#include 

volatile bool tx_empty_flag = true; // 发送缓冲空的标志
int main(void)
{  
  TLE_Init(); // Initialization of hardware modules based on Config Wizard configuration

  // UART2_Init();               //! Config Wizard configuration配置好了, 不需要再次初始化
  // UART2_TX_Int_En();          //! Config Wizard configuration配置好了, 不需要再次使能发送中断
  // UART2_BaudRate_Set(115200); //! Config Wizard configuration配置好了, 不需要再次设置波特率

  for (;;)
  {
    for (uint8 i = '0'; i <= '9'; i++)
    {
      while (tx_empty_flag == false); //! 等待发送缓冲区空闲(1个字节传输完成)

      tx_empty_flag = false; //! 即将发送, 发送缓冲区不空闲
      UART2_Buffer_Set(i);   // or UART2_Send_Byte(i);

      (void)WDT1_Service();
    }
  }
}

void uart2_Transmit_int_cb(void)
{
  tx_empty_flag = true; //! 已经完成发送, 发送缓冲区空闲
  
  // UART2_TX_Int_Clr();//? 不需要在中断回调函数中清除发送中断标志位

  PORT_ChangePin(LED1, PORT_ACTION_TOGGLE);

#define SUM_LIMIT 2000 //! all ok if SUM_LIMIT <= 1500, not ok if it >= 2000
  for (uint32 i = 0; i < SUM_LIMIT; i++);
}

 

 

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/MOTIX-MCU/%E5%8F%AA%E8%A6%81uart2%E4%B8%AD%E6%96%AD%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%E5%BE%AA%E7%8E%AF%E6%80%BB%E6%95%B0%E5%A4%A7%E4%BA%8E%E6%9F%90%E5%80%BC-%E7%A1%AC%E4%BB%B6%E4%BC%BC%E4%B9%8E%E5%91%A8%E6%9C%9F%E5%A4%8D%E4%BD%8D/td-p/673369

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,

你这个程序写的有问题啊,UART2的发送中断几乎占用了全部的资源。每发送1个Byte,系统就进入UART TX中断。如下图,系统还有很多内核的中断,这些中断可能被TX中断抢占资源,造成无法响应。

LinGuohui_0-1704875610718.png

如果任然按照你的程序执行,你需要将TX中断优先级下调,现在是最高优先级(0)。

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/MOTIX-MCU/%E5%8F%AA%E8%A6%81uart2%E4%B8%AD%E6%96%AD%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%E5%BE%AA%E7%8E%AF%E6%80%BB%E6%95%B0%E5%A4%A7%E4%BA%8E%E6%9F%90%E5%80%BC-%E7%A1%AC%E4%BB%B6%E4%BC%BC%E4%B9%8E%E5%91%A8%E6%9C%9F%E5%A4%8D%E4%BD%8D/m-p/673906

元の投稿で解決策を見る

0 件の賞賛
2 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,

你这个程序写的有问题啊,UART2的发送中断几乎占用了全部的资源。每发送1个Byte,系统就进入UART TX中断。如下图,系统还有很多内核的中断,这些中断可能被TX中断抢占资源,造成无法响应。

LinGuohui_0-1704875610718.png

如果任然按照你的程序执行,你需要将TX中断优先级下调,现在是最高优先级(0)。

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/MOTIX-MCU/%E5%8F%AA%E8%A6%81uart2%E4%B8%AD%E6%96%AD%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%E5%BE%AA%E7%8E%AF%E6%80%BB%E6%95%B0%E5%A4%A7%E4%BA%8E%E6%9F%90%E5%80%BC-%E7%A1%AC%E4%BB%B6%E4%BC%BC%E4%B9%8E%E5%91%A8%E6%9C%9F%E5%A4%8D%E4%BD%8D/m-p/673906

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

🤝 是的,调整中断优先级后 all ok

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/MOTIX-MCU/%E5%8F%AA%E8%A6%81uart2%E4%B8%AD%E6%96%AD%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%E5%BE%AA%E7%8E%AF%E6%80%BB%E6%95%B0%E5%A4%A7%E4%BA%8E%E6%9F%90%E5%80%BC-%E7%A1%AC%E4%BB%B6%E4%BC%BC%E4%B9%8E%E5%91%A8%E6%9C%9F%E5%A4%8D%E4%BD%8D/m-p/673969

0 件の賞賛