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");
}
}
#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电平。