Asynchronous: 异步通信
Synchronous: 同步通信
Single Wire (Half-Duplex): 单线/半双工
Multiprocessor Communication: 多处理器
支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。
uint8_t data=0;
while (1)
{
//串口uart1接收数据
if(HAL_UART_Receive(&huart1,&data,1,100)==HAL_OK){//接收的数据放入data
HAL_UART_Transmit(&huart1,&data,1,100);//将接收的数据再发出
}
}
uint8_t my_uart1_redata=0;
HAL_UART_Receive_IT(&huart1,&my_uart1_redata,1);//开启串口接收中断
//串口收到数据回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart == &huart1) { //判断串口号
HAL_UART_Transmit(&huart1,&my_uart1_redata,1,100);//把接收到的数据通过串口发送
HAL_UART_Receive_IT(&huart1,&my_uart1_redata,1); //再次开启一次中断
}
}
外设到内存 Peripheral To Memory
内存到外设 Memory To Peripheral
内存到内存 Memory To Memory
外设到外设 Peripheral To Peripheral
Priority: 传输速度
最高优先级 Very Hight
高优先级 Hight
中等优先级 Medium
低优先级 Low
mode:模式
Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止
Increment Address:地址增加
Peripheral:设置传输数据的时候外设地址是不变还是递增。如果设置为递增,那么下一次传输的时候地址加 Data Width个字节,勾选表示递增。
Memory:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,这个Src Memory一样,只不过针对的是内存。,勾选表示递增。
data width:数据宽度
byte:字节,通用8位,与u8相同
word:字长,与硬件的位数相同,STM32是32位,所以对应是u32
Half Word:半个字长,所以对应是u16
uint8_t redata[5]={0};//接收缓存
uint8_t Buffer[5]="yupeng";//发送的数据
//开启一次中断
HAL_UART_Receive_IT(&huart1,&redata,5);
//等待DMA发送状态OK
while(HAL_DMA_GetState(&DMA_HandleTypeDef) == HAL_DMA_STATE_BUSY) HAL_Delay(1);
//DMA发送数据
HAL_UART_Transmit_DMA(&huart1,Buffer,5);//DMA后台直接运行,所以DMA再次发送要等上次完成后再发送下一次
HAL_Delay(300);//延时等发送完成
//串口收到数据回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart == &huart1){ //判断串口号
//对redata缓存接收的数据进行处理
HAL_UART_Receive_IT(&huart1,&redata,5);//再次开启一次中断
}
}
STM32可用DMA的外设:定时器、ADC、SPI、IIC、USART
使用DMA必须开启中断
串口DMA模式最大为u16个字节,则65535
uint8_t redata[5]={0};//接收缓存
uint8_t Buffer[5]="yupeng";//发送的数据
//开启一次DMA接收中断
HAL_UART_Receive_DMA(&huart1,&redata,5);
//等待DMA状态OK
while(HAL_DMA_GetState(&DMA_HandleTypeDef) == HAL_DMA_STATE_BUSY) HAL_Delay(1);
//DMA发送数据
HAL_UART_Transmit_DMA(&huart1,Buffer,5);//DMA后台直接运行,所以DMA再次发送要等上次完成后再发送下一次
HAL_Delay(300);//延时等发送完成
//串口收到数据回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart == &huart1){ //判断串口号
//对redata缓存接收的数据进行处理
HAL_UART_Receive_DMA(&huart1,&redata,5);//再次开启一次DMA接收中断
}
}