微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32驱动串口屏显示问题

STM32驱动串口屏显示问题

时间:10-02 整理:3721RD 点击:
我使用STM32F103ZET6驱动串口屏幕显示,但是调试很多次均无法显示。屏幕和电脑连接可以显示,说明屏幕完好。求大神帮忙指导一下程序哪里有问题。
#include "stm32f10x.h"
#include "USART.H"
void USART_CONFIG()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        USART_ClockInitTypeDef USART_ClockInitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //GPIOA的第9口设置为复用输出,50MHz
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                        //GPIOA的第10口设置为上拉输入,50MHz
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;;         //☆
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;//   
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;  
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;  
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;   
        USART_ClockInit(USART1,&USART_ClockInitStructure);
       
        USART_InitStructure.USART_BaudRate = 115200;                                                                                //设置串口通信时的波特率115200   
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                        //设置数据位的长度8个位   
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                                //设置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_Init进行初始化  
       
        USART_ClearFlag(USART1, USART_IT_RXNE);                                //清除中断,以防启动中断后立即产生中断
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                                                                //使能串口1接收中断
        USART_ITConfig(USART1, USART_IT_TC, ENABLE);       
        USART_Cmd(USART1, ENABLE);                                                                                                                        //开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别

#include "stm32f10x.h"
#include "USART.H"
#include "stm32f10x_it.h"
#include "stdio.h"
#include "USART.H"
void init(void);
void NVIC_CONFIG(void);
void GpuSend(char * str);
void NVIC_CONFIG()
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
                      
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                   //配置串口中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级设置0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                   //响应优先级设置1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void init()
{
        NVIC_CONFIG();
        USART_CONFIG();
}
void GpuSend(char * buf1)
{  u8 i=0;
   while (1)
   {  if (buf1!=0)
     {  USART_SendData(USART1, buf1);  //发送一个byte到串口
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}; //等待发送结束
        i++;
     }
     else return ;
   }
}

int main(void)
{
//        u8 cn;
        init();
GpuSend("CLS(0);");
GpuSend("DS64(120,2,'Usart-GPU  串口液晶屏 ',2);");
GpuSend("PL(0,90,853,90,15);");
GpuSend("SNF(200,70);");
GpuSend("DS32(40,100,'出品:ApacheCtl',13);");
GpuSend("DS32(410,100,'网站:http://www.A-Diy.cn',13);");
GpuSend("BS24(10,140,810,4,' 本页面可自由由上位机软件定义,具体资料以及程序请去网站下载。',7);");
GpuSend("BS24(10,170,810,4,' 静等10秒,演示开始;此间如有串口命令,则自动进入命令处理状态。',7);");
GpuSend("DS12(0,232,'  串口最早是给超级终端使用的,意思是访问控制,输入一条命令,服',15);");
GpuSend("BS12(0,248,390,4,'务方返回该命令的应答;目前已广泛应用到各个系统中,单片机也普遍支持。',15);");
GpuSend("DS12(0,280,'  如今,我们使用该协议,用单片机通过串口将显示命令发给串口屏,',15);");
GpuSend("DS12(0,296,'即可完成显示;在设计上,我们采用了串口直接传输命令字符串的方式,',15);");
GpuSend("DS12(0,312,'而非16进制编码的方式,非常方便人类阅读,不需要再在单片机中封装相',15);");
GpuSend("DS12(0,328,'应的函数来方便记忆;也就是说,任何单片机只要您可以通过串口输出字',15);");
GpuSend("DS12(0,344,'符串,就可以使用本串口屏。',15);");
GpuSend("DS12(0,360,'    如果您不是用带有触摸屏等反馈屏幕,单纯显示的话,只需要一根线,',15);");
GpuSend("SPG(2);");
GpuSend("\r\n");

}

       
       
}

那你需要看看,用的是RS232还是TTL电平。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top