【YModemIAP】YModemIAP程序

目录

 

DMA空闲中断

YModem传输格式实例分析

程序代码


DMA空闲中断

main函数中代码, 开启串口空闲中断检测,开启串口DMA空闲中断接收。

关于空闲中断的理解:当无数据传输到串口,空闲中断不会触发,有数据传输过来并且接收完成时才会触发空闲中断。

__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);	
	
	/*Enable DMA IRQ*/
	
HAL_UART_Receive_DMA(&huart2, Rx_Buf, Rx_Max);
        uint32_t temp;
	空闲中断触发
	if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET))  
	{   
		清除空闲中断状态寄存器
		__HAL_UART_CLEAR_IDLEFLAG(&huart2); 

		失能DMA接收
		HAL_UART_DMAStop(&huart2);  

		读取接收长度,总大小-剩余大小
		temp = huart2.hdmarx->Instance->CNDTR; 
		
		DMA传输数量寄存器CNDTR可以显示剩余空间
		Rx_Len = Rx_Max - temp; 

		接收标志位置1
		Rx_Flag=1;  

	        使能接收DMA接收
		HAL_UART_Receive_DMA(&huart2,Rx_Buf,Rx_Max);  
	}

失能DMA接收目的:

a.防止后面又有数据接收到,产生干扰。

b.便于DMA的重新配置赋值和处理数据。

  • 置位接收完成标志位。
  • 处理接收buffer中数据。
  • 开启DMA通道,等待下一次的数据接收。注意,对DMA的相关寄存器配置写入,必须要在关闭DMA的条件进行,否则操作无效。

例如:重新设置DMA下次要接收的数据字节数。注意,这里是给DMA寄存器重新设置接收的计数值,这个数量只能大于或者等于可能接收的字节数,否则当DMA接收计数器递减到0的时候,又会重载这个计数值,重新循环递减计数,所以接收缓冲区的数据则会被覆盖丢失。

YModem传输格式实例分析

基础概念:

#define SOH		0x01
#define STX		0x02
#define ACK		0x06
#define NACK	        0x15
#define EOT		0x04
#define CCC		0x43
符号	 数值	     含义
 SOH	 0x01	 128字节数据包
 STX	 0x02	 1024字节数据包
 EOT	 0x04	 结束传输
 ACK	 0x06	 回应
 NAK	 0x15	 不回应
 CA	 0x18	 传输中止
 C	 0x43	 求数据包

1、 

发送端                                        接收端 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    C
send_command(CCC);//"CCC"请求数据包
这个“发送端”是指升级程序发送端

2、

传输端          >>>>>>>>>              接收端
/*SOH 00 FF "Y.bin" "1064" NUL[118] CRC CRC 
					"Y.bin":要传输的二进制文件
					"1064"十六进制表示二进制文件大小
					开始传输格式。
					*/
if((Get_state()==TO_START)&&
(temp_buf[1] == 0x00)&&
(temp_buf[2] == (unsigned char)(~temp_buf[1]))){
}

3、

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     C
send_command(ACK);
send_command(CCC);

4、

STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>   
此时data_state = 0x01;
else if((Get_state()==TO_RECEIVE_DATA)&&
(temp_buf[1] == data_state)&&
(temp_buf[2] == (unsigned char)(~temp_buf[1])))///< 接收数据
					{

}

程序代码

YModem传输完整格式参考【YModem】YModem串口IAP升级例程+YModem串口工具

发送端                                        接收端 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    C
SOH 00 FF "Y.bin" "1064'' NUL[118] CRC CRC >>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<     C
STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>      
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
SOH 05 FA data[100]  1A[28] CRC CRC>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    NAK
EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    C
SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    ACK
代码
注意stm32l4xx_it.c文件
链接:https://pan.baidu.com/s/1MEVYp0shXa3m6DDTygA5_w 
提取码:a220

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值