ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stm32F4/L4 UART学习汇总

2022-01-20 14:30:47  阅读:201  来源: 互联网

标签:DMA HAL huart UART huart1 中断 L4 stm32F4


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

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

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);
}

标签:DMA,HAL,huart,UART,huart1,中断,L4,stm32F4
来源: https://blog.csdn.net/gogyyy/article/details/122511501

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有