【基于STM32CUBEMX STM32F411CEY6TR单片机实现串口DMA的收发】

基于STM32CUBEMX STM32F411CEY6TR单片机实现串口DMA的收发

利用stm32 cubemx生成基础工程,配置如下

1.配置文件存储位置,生成.c和.h文件

图一
图二

2.时钟配置,选择外部时钟,主频72MHz

图一
图二

3 串口配置和DMA配置

图一
图二

图三

基于基础工程,增加一些处理

1.修改DMA初始化的位置,放于串口初始化后面

图一

2.uart.c和uart.h的修改

1.uart.c 的修改

主要是重写了一个回调函数 USAR_UART_IDLECallback,新增一个函数处理接收到的数据
user_uart1_send()

/* USER CODE BEGIN 1 */
unsigned char uart1_getdata_flag = 0;			//作为串口1收到数据的标志位
static unsigned char send_data[4] = {0xAA,0x55,0x0,0x0a};

void USAR_UART_IDLECallback(UART_HandleTypeDef *huart,uint8_t rxlen)
{
	if(huart == &huart1)  //判断是否为串口1产生中断
	{
//		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
		memcpy(UART1_RX_Data,UART1_RX_BUF,rxlen);  //将UART1_RX_BUF的数据复制到UART1_RX_Data中,最后两位是标志不是数据
		uart1_getdata_flag = 1;
	
//		HAL_UART_Transmit_DMA(&huart1, UART1_RX_BUF,rxlen);//将接收到的不定长数据发送到上位机
	  rxlen = 0;//清除数据长度计数
		HAL_UART_Receive_DMA(&huart1,UART1_RX_BUF,UART1_RX_SIZE);//重新打开DMA接收	        
	}
}

void user_uart1_send(void)
{

	if(uart1_getdata_flag == 1)
	{
		uart1_getdata_flag = 0;

		if(UART1_RX_Data[0] == 0x66)
		{
			if(UART1_RX_Data[5] == 0x01 || UART1_RX_Data[5] == 0x02)
			{
				send_data[2] = UART1_RX_Data[5];				
				HAL_UART_Transmit_DMA(&huart1, send_data,4);
			}						
		}		
	}
	
}

/* USER CODE END 1 */
2.uart.h的修改

声明回调函数和发送函数,并将接收数据的数组外接出来

/* USER CODE BEGIN Private defines */
#define UART1_RX_SIZE 100	

extern uint8_t UART1_RX_BUF[50];  //串口接收缓存
extern uint8_t UART1_RX_LEN;  //接收到的数据量
extern uint8_t UART1_RX_Data[50];  //数据缓存
/* USER CODE END Private defines */

void MX_USART1_UART_Init(void);
void MX_USART2_UART_Init(void);

/* USER CODE BEGIN Prototypes */
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart,uint8_t rxlen);
void user_uart1_send(void);
/* USER CODE END Prototypes */

3.USART1_IRQHandler()需要增加几行代码

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);  //清除空闲状态标志

		HAL_UART_DMAStop(&huart1);  //关闭DMA传输

		UART1_RX_LEN = UART1_RX_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);  //计算接收到的数据长度
		USAR_UART_IDLECallback(&huart1,UART1_RX_LEN);  //调用回调函数
	}

  /* USER CODE END USART1_IRQn 1 */
}

4.主函数增加一个开启DMA接收使能,并将用户发送函数在while(1)调用

图一

文件工程放不了,这个笔记是作为一个笔记,记录如何操作,以及存储基础工程,调试裸机可参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mybatis-Plus是一个基于Mybatis的增强工具,可以简化Mybatis的开发流程。根据提供的引用内容,可以看出Mybatis-Plus的依赖有两个版本,分别是3.5.2和3.3.1。其中,引用\[1\]和引用\[2\]都是使用的3.5.2版本的依赖,而引用\[3\]使用的是3.3.1版本的依赖。具体的依赖配置如下: 引用\[1\]和引用\[2\]的依赖配置: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> ``` 引用\[3\]的依赖配置: ```xml <!--Mybatis-plus的依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <!--mysql的依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--lombok的依赖,为了优化实体类,可以不去实现实体类的set()、get()--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> ``` 所以,根据你的需求,你可以根据自己的项目需要选择使用3.5.2版本的依赖还是3.3.1版本的依赖。 #### 引用[.reference_title] - *1* *2* [[Mybatis-Plus笔记] MybatisPlus-07-代码生成器及相关依赖](https://blog.csdn.net/Cey_Tao/article/details/127012002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MyBatisPlus](https://blog.csdn.net/m0_60213304/article/details/124203155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值