当前位置:   article > 正文

stm32+cubemx+淘晶驰串口屏+收发通信并应用_stm32驱动陶晶驰x系列串口屏

stm32驱动陶晶驰x系列串口屏

通过淘晶驰串口屏利用控件,点击屏幕单片机进行相应的操作,设计单片机的串口dma模式,串口屏的界面显示。

cubemx配置:

rcc时钟配置

 一定注意时钟树要进行修改

 sys下载方式选择sw

 配置usart1的通信方式为asy异步收发模式

打开dma  设置为normal模式

 

打开串口1中断

 生成代码配置

 

代码编写及配置:

将输出配置好下载及运行; 

 在usart.h中添加

  1. /* USER CODE BEGIN Private defines */
  2. #define BUFFER_SIZE 100
  3. extern volatile uint8_t rx_len ; //接收一帧数据的长度
  4. extern volatile uint8_t recv_end_flag; //一帧数据接收完成标志
  5. extern uint8_t rx_buffer[100]; //接收数据缓存数组
  6. /* USER CODE END Private defines */

在#stm32f4xx_it.c中添加#include "usart.h"头文件

 添加

  1. void USART1_IRQHandler(void)
  2. {
  3. /* USER CODE BEGIN USART1_IRQn 0 */
  4. uint32_t tmp_flag = 0;
  5. uint32_t temp;
  6. tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
  7. if((tmp_flag != RESET))//idle标志被置位
  8. {
  9. __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
  10. //temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
  11. //temp = huart1.Instance->DR; //读取数据寄存器中的数据
  12. //这两句和上面那句等效
  13. HAL_UART_DMAStop(&huart1); //
  14. temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数
  15. //temp = hdma_usart1_rx.Instance->NDTR;//读取NDTR寄存器 获取DMA中未传输的数据个数,
  16. //这句和上面那句等效
  17. rx_len = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
  18. recv_end_flag = 1; // 接受完成标志位置1
  19. }
  20. /* USER CODE END USART1_IRQn 0 */
  21. HAL_UART_IRQHandler(&huart1);
  22. /* USER CODE BEGIN USART1_IRQn 1 */
  23. /* USER CODE END USART1_IRQn 1 */
  24. }

 在主函数中添加

  1. /* USER CODE BEGIN 4 */
  2. /*
  3. *********************************************************************************************************
  4. * 函 数 名: DMA_Usart_Send
  5. * 功能说明: 串口发送功能函数
  6. * 形 参: buf,len
  7. * 返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void DMA_Usart_Send(uint8_t *buf,uint8_t len)//串口发送封装
  11. {
  12. if(HAL_UART_Transmit_DMA(&huart1, buf,len)!= HAL_OK) //判断是否发送正常,如果出现异常则进入异常中断函数
  13. {
  14. Error_Handler();
  15. }
  16. }
  17. /*
  18. *********************************************************************************************************
  19. * 函 数 名: DMA_Usart1_Read
  20. * 功能说明: 串口接收功能函数
  21. * 形 参: Data,len
  22. * 返 回 值: 无
  23. *********************************************************************************************************
  24. */
  25. void DMA_Usart1_Read(uint8_t *Data,uint8_t len)//串口接收封装
  26. {
  27. HAL_UART_Receive_DMA(&huart1,Data,len);//重新打开DMA接收
  28. }
  29. /**
  30. * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  31. * 输入参数: 无
  32. * 返 回 值: 无
  33. * 说 明:无
  34. */
  35. int fputc(int ch, FILE *f)
  36. {
  37. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  38. return ch;
  39. }
  40. /* USER CODE END 4 */

 初始化后添加

  1. /* USER CODE BEGIN 2 */
  2. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
  3. //DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
  4. HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
  5. /* USER CODE END 2 */

主函数while中添加

  1. if(recv_end_flag == 1) //接收完成标志
  2. {
  3. if(rx_buffer[0]==2){
  4. a=1-a;b=1-b;c=1-c;
  5. // printf ("t0.txt=\"1%d\"\xff\xff\xff",a);
  6. // printf ("t0.txt=\"1%d\"\xff\xff\xff",a);
  7. // printf ("t0.txt=\"1%d\"\xff\xff\xff",a);
  8. // printf ("t1.txt=\"1%d\"\xff\xff\xff",b);
  9. //
  10. printf ("t2.txt=\"1%d\"\xff\xff\xff",c);
  11. }
  12. if(rx_buffer[0]==1){
  13. a=1-a;b=1-b;c=1-c;
  14. printf ("t1.txt=\"1%d\"\xff\xff\xff",b);
  15. }
  16. // DMA_Usart_Send( rx_buffer, sizeof (rx_buffer));
  17. rx_len = 0;//清除计数
  18. recv_end_flag = 0;//清除接收结束标志位
  19. for(uint8_t i=0;i<rx_len;i++)
  20. {
  21. rx_buffer[i]=0;//清接收缓存
  22. }
  23. }
  24. HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收

 单片机配置完成接下来利用USART HMI进行界面设置

 点击新建

选择型号

选择方向

 

 加入按钮及文本框,右侧进行参数配置

 设置按下事件第一页字样的按键

  设置按下事件第二页字样的按键

 点击加号添加界面

 第二个界面

 第三个界面

 全部配置完成,进行联调

 

 

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号