stm32+cubemx+淘晶驰串口屏+收发通信并应用

通过淘晶驰串口屏利用控件,点击屏幕单片机进行相应的操作,设计单片机的串口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进行界面设置

 点击新建

选择型号

选择方向

 

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

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

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

 点击加号添加界面

 第二个界面

 第三个界面

 全部配置完成,进行联调

 

 

 

 

### 关于晶驰串口STM32 HAL库的应用 #### 晶驰串口简介 晶驰串口是一款专为嵌入式系统设计的显示,支持通过UART接口接收数据显示。该幕配套有UI设计工具,允许开发者轻松创建图形界面,可通过简单的命令集控制幕上的各种元素[^1]。 #### STM32 HAL库概述 STM32硬件抽象层(HAL)库提供了一组API函数来简化外设配置和操作过程。对于USART模块而言,HAL库封装了一系列用于初始化、发送/接收字符以及处理中断等功能的方法,使得开发者可以更专注于应用程序逻辑而非底层细节[^2]。 #### 应用实例:向晶驰串口发送字符串 为了实现将时间信息展示在幕上,在STM32程序中可以通过调用`HAL_UART_Transmit()`函数完成对指定端口的数据传输工作。下面给出一段完整的C语言代码片段作为示范: ```c #include "stm32f1xx_hal.h" // 假定已经完成了必要的初始化设置... void SendTimeToScreen(const char *timeStr){ uint8_t buffer[50]; // 将要发送的时间字符串复制到缓冲区 snprintf((char*)buffer, sizeof(buffer), "%s", timeStr); // 调用HAL库中的发送函数 HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen((const char*)buffer), 1000); if(status != HAL_OK){ Error_Handler(); } } ``` 此段代码展示了如何利用HAL库提供的功能构建一个名为`SendTimeToScreen`的新函数,它接受指向表示当前时间的字符串指针参数,将其转换成适合发送的形式后传送给连接着晶驰串口的第一路UART设备。 #### 获取更多资源和支持 针对上述提到的功能需求和技术要点,建议访问官方文档获取最权威的信息源。具体来说: - **晶驰官网** 提供了详细的用户手册、编程指南及示例项目下载服务; - **STMicroelectronics网站** 则包含了有关STM32系列MCU及其周边产品的技术资料,包括但不限于参考手册、应用笔记等;
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值