stm32F4/L4 UART学习汇总

删除了一些不重要的东西,寄存器以及配置过程只需要了解,其他的还是快速上手为准

实用内容:模式一 不启动中断方式通讯

1、 HAL_UART_Receive(&huart1, dat, 3, 9000); //接收数据,一般因为有时间限制(例如9000),所以建议在循环中接收
2、 HAL_UART_Transmit(&huart1, dat, 3, 9000); //发送数据,可以再程序中执行一次。

个人感觉不开中断的方式不实用,当然个人经验较少,可能某些情况下比较好用。

实用内容:模式二 启用中断方式通讯

1、main()中接收指令 HAL_UART_Receive_IT(&huart1, buff, 50);//中断接收
2、接收完成中断函数里

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // 自己添加的回调函数
{
   if (huart->Instance==USART1) {
       HAL_UART_Transmit_IT(&huart1, buff, 50);//发送回去
           HAL_UART_Receive_IT(&huart1, buff, 50);//开启接收

}

3、HAL_UART_Transmit_IT(huart, pData, Size)//发送

实用内容:模式三 启用DMA中断方式通讯

HAL_UART_Transmit_DMA(huart, pData, Size) //发送
HAL_UART_Receive_DMA(huart, pData, Size) //接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//同一个回调函数

实用内容:空闲中断

1、单字节接收我觉得挺好用,不知道有什么局限不
2、__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE) //开启空闲中断
3、中断代码,因为空闲中断没有发完,进不了发送完成中断里,所以要在USART1_IRQHandler里写判断

void USART1_IRQHandler(void)
{
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET) //空闲中断判断   __HAL_UART_GET_FLAG获取指定中断
	{
		uint8_t len=0;//定义长度
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除空间中断
		//之后这里可以多次判断以便排除干扰
		HAL_UART_DMAStop(&huart1);//停止DMA
		len=100-__HAL_DMA_GET_COUNTER(huart1.hdmarx);//获取已接收长度
		{//括号内可以到处理函数中
			xxxx(len);//处理函数
			HAL_UART_Receive_DMA(&huart1,rebuff,100);//重新开启接收
		}	
	}
  HAL_UART_IRQHandler(&huart1);
}
上一篇:蓝桥杯嵌入式_cubemx设置方法以及hal库编程思路


下一篇:Stm32CubeMx通过DMA获取多路ADC采集的数据(踩到坑的来看看,我也是一步步踩坑到实现的)