首页 > 解决方案 > STM8S UART TX 中断启用/禁用问题

问题描述

感谢所有给出答案的人。但问题与编译器有关。我使用了 Cosmos 和 STVD,它没有绑定中断函数。当我将项目迁移到 IAR 时,问题就解决了。

我正在处理 STM8S103F3P6 IC。我尝试使用 TX 中断发送消息,但从未成功。

我已经检查了 UART 中断的示例。另外,我尝试开发相同的代码。但是,我仍然是零。我从 STM8 示例中获取了中断向量函数。我的错误在哪里?我怎么知道?

这是我的 init、main 和中断向量函数;

void init_handler(void){
      CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
      UART1_DeInit();
      UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
      UART1_ITConfig(UART1_IT_TXE,ENABLE);
  enableInterrupts();
      UART1_Cmd(ENABLE);
}


main(){
      init_handler();
      while(1);
}

INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17){
      /* In order to detect unexpected events during development,
      it is recommended to set a breakpoint on the following instruction.
      */
     UART1_SendData8('a');
     while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
 }

它什么也不发送。我没有任何逻辑分析仪,我只使用终端应用程序检查过。

标签: interruptuartinterrupt-handlingstm8

解决方案


您问您的错误在哪里:很难判断您是否使用了通过使外围配置寄存器和标志“可读”来掩盖使用外设配置寄存器和标志的库函数。如果您没有逻辑分析仪,大多数时候引脚调试会有所帮助(例如,在进入 ISR 时切换 GPIO)。

我的建议是查看实际的寄存器操作并将其与 STM8S 参考手册中的描述进行比较(即使它没有提供关于如何初始化、启动、降速和结束传输的简明指导)。

为了让这更容易一些,我想分享一下我对使用 UART ISR 的了解:

使用 UART TXE 和 TC 中断事件发送缓冲区的内容结果不像在 MCS51 中那样工作:大部分必须通过 UART_CR2 中的中断启用标志 TIEN 和 TCIEN 来完成。

这对我有用:

  • 通常应禁用 TIEN 和 TCIEN
  • 设置缓冲区和指针后,使 TIEN 开始传输
  • 在 ISR 中,在传输过程中,写入 UART_DR 会清除中断事件
  • 在 ISR 中,当缓冲区为空时,禁用 TIEN 并启用 TCIEN 以降低 ISR 链
  • 在 ISR 中,读取 UART_SR 以检查是否设置了 TC。如果是这种情况,请清除 TCIEN

此过程的优点是媒体访问控制,例如 RS485,可以在链的最后一步完成。

STM8 eForth 的一个例子在这里


推荐阅读