完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
通过淘晶驰串口屏利用控件,点击屏幕单片机进行相应的操作,设计单片机的串口dma模式,串口屏的界面显示。
cubemx配置: rcc时钟配置 一定注意时钟树要进行修改 sys下载方式选择sw 配置usart1的通信方式为asy异步收发模式 打开dma 设置为normal模式 打开串口1中断 生成代码配置 代码编写及配置: 将输出配置好下载及运行; /* USER CODE BEGIN Private defines */ #define BUFFER_SIZE 100 extern volatile uint8_t rx_len ; //接收一帧数据的长度 extern volatile uint8_t recv_end_flag; //一帧数据接收完成标志 extern uint8_t rx_buffer[100]; //接收数据缓存数组 /* USER CODE END Private defines */ 在#stm32f4xx_it.c中添加#include "usart.h"头文件 添加 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位 if((tmp_flag != RESET))//idle标志被置位 { __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位 //temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能 //temp = huart1.Instance->DR; //读取数据寄存器中的数据 //这两句和上面那句等效 HAL_UART_DMAStop(&huart1); // temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数 //temp = hdma_usart1_rx.Instance->NDTR;//读取NDTR寄存器 获取DMA中未传输的数据个数, //这句和上面那句等效 rx_len = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数 recv_end_flag = 1; // 接受完成标志位置1 } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } 在主函数中添加 /* USER CODE BEGIN 4 */ /* ********************************************************************************************************* * 函 数 名: DMA_Usart_Send * 功能说明: 串口发送功能函数 * 形 参: buf,len * 返 回 值: 无 ********************************************************************************************************* */ void DMA_Usart_Send(uint8_t *buf,uint8_t len)//串口发送封装 { if(HAL_UART_Transmit_DMA(&huart1, buf,len)!= HAL_OK) //判断是否发送正常,如果出现异常则进入异常中断函数 { Error_Handler(); } } /* ********************************************************************************************************* * 函 数 名: DMA_Usart1_Read * 功能说明: 串口接收功能函数 * 形 参: Data,len * 返 回 值: 无 ********************************************************************************************************* */ void DMA_Usart1_Read(uint8_t *Data,uint8_t len)//串口接收封装 { HAL_UART_Receive_DMA(&huart1,Data,len);//重新打开DMA接收 } /** * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; } /* USER CODE END 4 */ 初始化后添加 /* USER CODE BEGIN 2 */ __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断 //DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度 HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE); /* USER CODE END 2 */ 主函数while中添加 if(recv_end_flag == 1) //接收完成标志 { if(rx_buffer[0]==2){ a=1-a;b=1-b;c=1-c; // printf ("t0.txt="1%d"xffxffxff",a); // printf ("t0.txt="1%d"xffxffxff",a); // printf ("t0.txt="1%d"xffxffxff",a); // printf ("t1.txt="1%d"xffxffxff",b); // printf ("t2.txt="1%d"xffxffxff",c); } if(rx_buffer[0]==1){ a=1-a;b=1-b;c=1-c; printf ("t1.txt="1%d"xffxffxff",b); } // DMA_Usart_Send( rx_buffer, sizeof (rx_buffer)); rx_len = 0;//清除计数 recv_end_flag = 0;//清除接收结束标志位 for(uint8_t i=0;i rx_buffer=0;//清接收缓存 } } HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收 点击新建 选择型号 选择方向 加入按钮及文本框,右侧进行参数配置 设置按下事件第一页字样的按键 设置按下事件第二页字样的按键 点击加号添加界面 第二个界面 第三个界面 全部配置完成,进行联调。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
1886 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4771 浏览 0 评论
4253 浏览 9 评论
3842 浏览 16 评论
4416 浏览 1 评论
4237浏览 3评论
2401浏览 0评论
3420浏览 0评论
1179浏览 0评论
2869浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 12:42 , Processed in 0.943910 second(s), Total 74, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2539