目录
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