使用STM32驱动串口屏控制HMI串口屏的指令发送

STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

  • 串口屏
  • 基础指令集
  • 硬件和接线
  • 接线
  • 实验前准备
  • STM32程序
  • 串口程序
  • 主函数
  • 实验现象
  • 总结
  • 串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕,
    本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏

    基础指令集


    上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。

    硬件和接线

    硬件需要一块STM32F103C8T6的开发板,杜邦线诺干,2.4寸串口屏一块

    接线

    串口屏 STM32
    +5V 5V
    TX PA10
    RX PA9
    GND GND

    实验前准备

    准备前需要下载出厂标准样例,一般出厂自带的,不需要下载,需要下载的可以参考以前的文章:51单片机驱动HMI串口屏,串口屏的下载方式

    STM32程序

    串口程序

    串口配置

    void uart_init(u32 bound){
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	 
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
     	USART_DeInit(USART1);  //复位串口1
    	 //USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
       
        //USART1_RX	  PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10
    
       //Usart1 NVIC 配置
    
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
      
       //USART 初始化设置
    
    	USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    
        USART_Init(USART1, &USART_InitStructure); //初始化串口
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
        USART_Cmd(USART1, ENABLE);                    //使能串口 
    
    }
    

    中断服务程序

    void USART1_IRQHandler(void)                	//串口1中断服务程序
    	{
    	u8 Res;
    #ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.
    	OSIntEnter();    
    #endif
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    		{
    		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据	
    		if((USART_RX_STA&0x8000)==0)//接收未完成
    			{
    			if(USART_RX_STA&0x4000)//接收到了0x0d
    				{
    				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    				else USART_RX_STA|=0x8000;	//接收完成了 
    				}
    			else //还没收到0X0D
    				{	
    				if(Res==0x0d)USART_RX_STA|=0x4000;
    				else
    					{
    					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
    					USART_RX_STA++;
    					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
    					}		 
    				}  	
    			}  
    				 
         } 
    

    主函数

    主函数

    int main(void)
     {	   	 
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(9600);	  	 //串口初始化为9600
    	HMISendstart();          //为确保串口HMI正常通信
    	{ 
    		HMISends("cls RED");  //发送串口指令
    		HMISendb(0xff);		  //发送结束符 0XFF 0XFF 0XFF
    		delay_ms(1000);
        	HMISends("cls GREEN");
    		HMISendb(0xff);
        	delay_ms(1000);
        	HMISends("cls BLUE");
    		HMISendb(0xff);
    		delay_ms(1000);
    		HMISends("cls BLACK");
    		HMISendb(0xff); 
    		delay_ms(1000);
    		HMISends("page 4");
    		HMISendb(0xff);
    		HMISends("t0.txt=\"春风不度玉门关\"");
    		HMISendb(0xff);	
    	}
    	while(1);
    }
    

    字符串发送函数

    void HMISends(char *buf1)		  //字符串发送函数
    {
    	u8 i=0;
    	while(1)
    	{
    	 if(buf1[i]!=0)
    	 	{
    			USART_SendData(USART1,buf1[i]);  //发送一个字节
    			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};//等待发送结束
    		 	i++;
    		}
    	 else 
    	 return ;
    
    		}
    	}```
    字节发送函数
    
    ```c
    void HMISendb(u8 k)		         //字节发送函数
    {		 
    	u8 i;
    	 for(i=0;i<3;i++)
    	 {
    	 if(k!=0)
    	 	{
    			USART_SendData(USART1,k);  //发送一个字节
    			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};//等待发送结束
    		}
    	 else 
    	 return ;
    
    	 } 
    } 
    
    

    实验现象

    现象是红绿蓝黑各显示一秒,最后去除原来工程里面春风不度玉门关的背景色
    请添加图片描述

    总结

    串口屏的驱动只需要配置好单片机的串口就行,其他的就是发送函数的代码,还是老样子需要整理好的代码可以在评论区留言或私信邮箱!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32驱动串口屏控制HMI串口屏的指令发送

    发表评论