c - STM32F4 发现的 USART 超时中断
问题描述
我的 STM 和 Raspberry 确实通过 USART 成功通信。Rx 和 Tx 字很好,直到 Raspberry 停止发送。然后 STM 监听并监听新的字符。代码循环被卡住,直到收到一个字符。
我想实现一个超时中断。
这就是我发现的。
STM32H7 文档(第 21 页)
不幸的是,它用于错误的电路板。在 STMF4 的参考手册中找不到接收超时。所以我猜我的板子没有这个功能?
我正在使用 Keil µVision V5.28.0.0 和标准外围设备。
这是一个代码片段
#include "main.h"
#include <stdio.h>
USART_InitTypeDef USART_InitStruct;
volatile uint32_t msTicks=0;
void USART_Initialise(void);
int USART_putchar(char ch);
void USART_puts(char str[]);
char USART_receive(void);
void Delay (int ms);
int main(void)
{
char buffer[20];
string test = "test";
USART_Initialise();
while (1)
{
char mode = USART_receive();
if (mode == '+')
{
sprintf(buffer, "%.2lf",test);
USART_puts(buffer);
}
Delay(300);
}//while
}//main
void USART_Initialise(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART3, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIO Pin 10 & 11
GPIO_Init(GPIOC, &GPIO_InitStruct);
USART_StructInit(&USART_InitStruct);
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART3, &USART_InitStruct);
USART_Cmd(USART3, ENABLE);
}
int USART_putchar(char ch)
{
USART_SendData(USART3, (uint8_t) ch);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
{}
return ch;
}
void USART_puts(char str[])
{
while (*str != 0)
{
USART_putchar(*str);
str++;
}
}
char USART_receive(void)
{
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){};
char rxd_receive = USART_ReceiveData(USART3);
return rxd_receive;
}
void SysTick_Handler(void) //für ISR kein Prototyp erforderlich
{
msTicks--;
}
void Delay (int ms)
{
msTicks = ms;
while (msTicks>0);
}
解决方案
将您的接收功能更改为:
int USART_receive(void)
{
if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
{
return EOF;
}
return USART_ReceiveData(USART3);
}
然后你可以决定在上层接收一个字符时要做什么。
您也可以将超时放在函数中。EOF
如果发生超时,它将返回。由于您说 UART 不包含自己的超时功能,因此您需要使用其中一个计时器。
推荐阅读
- python - KeyError: 'image_url' Traceback (last recent call last) 烧瓶 api 响应错误
- android - 如何检查和使用 Google Play 服务 更新的安全性 在反应原生应用程序中提供以保护应用程序免受 OpenSSL 漏洞的影响
- apache-kafka - Nest.JS CQRS:有没有办法通过在后台使用 Kafka 或 RabbitMQ 使命令总线和队列在外部?谢谢
- mdx - MDX - 显示此 MDX 查询的维度标签/值
- css - Bootstrap(在 Laravel 上) - 标题下拉列表在一页上变得透明
- c - 将 elf32_Word 打印为单词
- java - secLdap 插件发生内部错误。无效的
- angular - 带有管道的 ngFor 标签重复多少次
- vue.js - 使用 Axios 调用后 Cookie 未存储在浏览器中
- javascript - Javascript 和 html:在文档之前更新窗口