赞
踩
通过淘晶驰串口屏利用控件,点击屏幕单片机进行相应的操作,设计单片机的串口dma模式,串口屏的界面显示。
cubemx配置:
rcc时钟配置
一定注意时钟树要进行修改
sys下载方式选择sw
配置usart1的通信方式为asy异步收发模式
打开dma 设置为normal模式
打开串口1中断
生成代码配置
代码编写及配置:
将输出配置好下载及运行;
在usart.h中添加
- /* 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\"\xff\xff\xff",a);
- // printf ("t0.txt=\"1%d\"\xff\xff\xff",a);
- // printf ("t0.txt=\"1%d\"\xff\xff\xff",a);
- // printf ("t1.txt=\"1%d\"\xff\xff\xff",b);
- //
- printf ("t2.txt=\"1%d\"\xff\xff\xff",c);
-
- }
- if(rx_buffer[0]==1){
- a=1-a;b=1-b;c=1-c;
-
- printf ("t1.txt=\"1%d\"\xff\xff\xff",b);
-
-
- }
- // DMA_Usart_Send( rx_buffer, sizeof (rx_buffer));
- rx_len = 0;//清除计数
- recv_end_flag = 0;//清除接收结束标志位
- for(uint8_t i=0;i<rx_len;i++)
- {
- rx_buffer[i]=0;//清接收缓存
- }
- }
- HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收

单片机配置完成接下来利用USART HMI进行界面设置
点击新建
选择型号
选择方向
加入按钮及文本框,右侧进行参数配置
设置按下事件第一页字样的按键
设置按下事件第二页字样的按键
点击加号添加界面
第二个界面
第三个界面
全部配置完成,进行联调
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。