简单记录一下:
1,uart 串口接收中断函数分析:
/* 接收的数据包以 0x55 开头 ,以0xFF 结尾,长度固定为11个字节*/
下面是 STM8 uart 接收中断函数,是最普通的串口中断,串口接收到一个字节 数据就产生一个中断。
1,每次中断进来 ,就从 USARTx->DR 寄存器中取出一个字节保存至缓存中
2,当收到 0xFF 的字符时 ,判断一下是否是数据包的结尾(只有定长数据包才可以采用这种方式处理)
void irq_uart1()
{
uint8_t temp = USART_ReceiveData8(USART1);
uart_rx_buffer[uart_rx_len] = temp;
if (++uart_rx_len >= UART_BUFFER_SIZE)
uart_rx_len = 0;
if (temp == PACKAGE_END) {
if (uart_rx_len >= sizeof(recv_buffer)) {
if (uart_rx_buffer[uart_rx_len - sizeof(recv_buffer)] == PACKAGE_START) {
memcpy(&recv_buffer, uart_rx_buffer + uart_rx_len - sizeof(recv_buffer),sizeof(recv_buffer));
flag_reply = 1;
}
uart_rx_len = 0;
}
}
}
2,串口发送正常,但是接收数据不进接收中断的问题。
因为uart 初始化之前 ,这 RX ,TX 这两个引脚被 初始化为GPIO 输出口了。
这里我有疑问,uart 初始化的库函数,不应该把把这两个引脚 从新初始化为 串口的功能脚吗?总之,把 RX ,TX 这两个引脚被 初始化为GPIO 输出口的代码屏蔽掉 就能进串口接收中断了。
3,烧录出现概率性烧录不了的问题。
烧录口 的 SWIM 脚 和 RESET 脚(PA0 和PA1 ) 被初始化为 GPIO 输出口导致的。
另外附一个 STM32 muc 的开发资源下载连接的 网页:
MDK5.29,5.30,5.31,5.32,5.33, 5.34,5.35, 5.36, 5.37和各种pack软件包镜像下载(2022-05-04) - 知乎 (zhihu.com)