STM32_HAL库—串口通信

(一)CubeMX设置:

1. 晶振配置(72M)在这里插入图片描述

2. 基础配置

STM32_HAL库—串口通信_第1张图片
==>Mode(模式选择):

	Asynchronous:		异步通信
	Synchronous:		同步通信
	Single Wire (Half-Duplex):	单线/半双工
	Multiprocessor Communication:	多处理器
	支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。

STM32_HAL库—串口通信_第2张图片

(二)串口数据模式:

1. 阻塞方式收发模式

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);//将接收的数据再发出
   }
}

2. 中断接收、阻塞发送模式

(1)使能串口中断

STM32_HAL库—串口通信_第3张图片

(2)优先级选择

STM32_HAL库—串口通信_第4张图片

(3)主函数调用函数开启串口中断
uint8_t my_uart1_redata=0;
HAL_UART_Receive_IT(&huart1,&my_uart1_redata,1);//开启串口接收中断
    
(4)串口接收中断回调函数
//串口收到数据回调
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); //再次开启一次中断
    }
}

3. DMA发送、中断接收模式

(1)使能串口中断

STM32_HAL库—串口通信_第5张图片

(2)优先级选择

STM32_HAL库—串口通信_第6张图片

(3)DMA发送设置

STM32_HAL库—串口通信_第7张图片
Dirction : DMA传输方向

外设到内存 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
(4)主函数开启串口接收中断
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);//延时等发送完成
(5)串口接收中断回调函数
//串口收到数据回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    if(huart == &huart1){ //判断串口号
    
        //对redata缓存接收的数据进行处理
  
		HAL_UART_Receive_IT(&huart1,&redata,5);//再次开启一次中断
    }
}

4. DMA发送、DMA接收模式

STM32可用DMA的外设:定时器、ADC、SPI、IIC、USART

使用DMA必须开启中断

串口DMA模式最大为u16个字节,则65535

(1)使能串口中断

STM32_HAL库—串口通信_第8张图片

(2)优先级选择

STM32_HAL库—串口通信_第9张图片

(3)DMA设置

STM32_HAL库—串口通信_第10张图片

(4)主函数开启串口接收中断
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);//延时等发送完成
(5)串口接收中断回调函数
//串口收到数据回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    if(huart == &huart1){ //判断串口号
    
    	//对redata缓存接收的数据进行处理
    	
		HAL_UART_Receive_DMA(&huart1,&redata,5);//再次开启一次DMA接收中断
    }
}

你可能感兴趣的:(STM32与GD32,stm32,单片机,arm)