interrupt - 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);
}
它什么也不发送。我没有任何逻辑分析仪,我只使用终端应用程序检查过。
解决方案
您问您的错误在哪里:很难判断您是否使用了通过使外围配置寄存器和标志“可读”来掩盖使用外设配置寄存器和标志的库函数。如果您没有逻辑分析仪,大多数时候引脚调试会有所帮助(例如,在进入 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 的一个例子在这里。
推荐阅读
- vue.js - vuetify 和 vue-router 多个选项卡的活动导航栏
- javascript - 如何在Javascript或C#中下载不同类型的计算机格式的文件而不显示给用户?
- java - 如何在Java中将字符串发送到ffmpeg的输入
- sql - 对表 Animal 进行输入时,如果标价为奇数,则将其加 1,然后将其插入表中
- active-directory - 有没有办法允许标准用户访问远程服务器上的 Active Directory?
- php - 而在while表中,另一个sql结果工作,但父级没有
- java - 当连接在事务中关闭时会发生什么?
- c# - C# MongoDB JOIN 表 outerKeySelector IN innerKeySelector
- php - prestashop 图像存储背后的逻辑
- php - 带有 PEM 证书的 PHP CURL 请求结果不稳定