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

串口屏基础指令集

硬件和接线接线实验前准备

STM32程序串口程序主函数

实验现象总结

串口屏

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

基础指令集

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

硬件和接线

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

接线

串口屏STM32+5V5VTXPA10RXPA9GNDGND

实验前准备

准备前需要下载出厂标准样例,一般出厂自带的,不需要下载,需要下载的可以参考以前的文章: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 ;

}

}

实验现象

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

总结

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

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: