GD32或STM32(GD32F103RB)Ymodem串口升级源码分析

本文分析了GD32或STM32(GD32F103RB)使用Ymodem串口升级的过程,重点介绍了串口初始化、DMA接收机制以及Ymodem协议的帧处理逻辑,包括开始帧、数据帧、EOT交互和结束帧的处理。在接收过程中,通过UART_RecvData函数利用DMA接收数据,当接收到USART_FLAG_IDLE空闲标记时触发相应操作。遇到异常情况,如跳转APP失败,会关闭中断后再开启。
摘要由CSDN通过智能技术生成

先看GD32或STM32(GD32F103RB)用Ymodem升级-CSDN博客

结合下代码:(代码进行过删减,主要用来理解每个步骤的目的使用)

串口:

初始化串口,这里没有开启任何关于串口的中断(串口的idle空闲标记也只是用来查询,并不是中断);

DMA:

使能串口的DMA接收同样也没有开DMA中断;

着重介绍一下UART_RecvData函数的使用,该函数是用了DMA接收串口数据,接收完数据就会触发空闲的标记位USART_FLAG_IDLE(否则一直while等待,除非超时)。主要步骤如下:(每次需要调用该函数时,都会执行以下,请结合下面代码看以下文字)

1 设置DMA的帧数据长度dma_transfer_number_config:

如果调用函数传递的len=-1,则USART1_RX_BUF_SIZE为1029,否则设置的长度就是len;(可能会有疑问?每次都有1029数据传递么(3帧头+1024+2CRC),Ymodem不是还有128的帧么);我理解这里帧长度,只是说收完这么长的一帧之后,一定会触发相应的标记或者中断;但是,如果实际上收到的帧长度没有那么长,中断空闲了,也同样会有相应的标记或中断被触发。例如DMA的DMA_FLAG_FTF,传输完成标记;

2 while等待串口的USART_FLAG_IDLE空闲标记:该标记置位的条件是,收完一帧数据,或者收完一段数据后停止了一段时间(根据代码现象,我理解是这样,但是我没有仔细去查阅);UART_RecvData函数超时后,根据调试现象(容易接收失败),UART_SendChar(YMODEM_COM, 0x15, timeout);添加这条NAK 0x15的应答,我理解上位机收到后这条会重发该帧

这里再说下USART_FLAG_IDLE这个标记怎么清除:

软件先读USART_STAT,再读USART_DATA可清除该位。(没有找到有清除它的函数);

3 拷贝DMA的buf的内容。

static void HardwareInit(void) {
    UART_UserInit(YMODEM_COM, 115200);
    UART1_UserDMAInit();
}


void UART_UserInit(uint32_t usartPeriph, uint32_t baud) {
	uint32_t com_id = 0U;

	switch(usartPeriph) {
	case USER_COM0:
		com_id = 0U;
		break;

	case USER_COM1:
		com_id = 1U;
		break;

	case USER_COM2:
		com_id &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值