适用于正点原子7寸RGB液晶屏资料,包含AD20完整工程
探索正点原子7寸RGB液晶屏:AD20工程实战
最近,我入手了一块正点原子的7寸RGB液晶屏,搭配AD20开发板,想着能折腾出点有意思的东西。折腾的过程虽然有点坎坷,但收获还是挺多的,现在就来分享一下我的经历。
硬件准备:工欲善其事,必先利其器
首先,我需要明确所需的硬件:
- 开发板:AD20开发板,支持丰富的外设接口。
- 显示屏:正点原子7寸RGB液晶屏,分辨率为800x480。
- 电阻:3.3V的电阻,用于匹配显示屏的电压。
- 排线:连接开发板与显示屏的排线,确保信号传输稳定。
硬件准备完毕后,我查阅了正点原子提供的资料,发现显示屏的接口是标准的RGB接口,可以直接与开发板的GPIO和DMA外设连接。
配置:从零开始
接下来是部分,我使用的是AD20的官方IDE,配置工程时需要注意以下几点:
- 工程模板:选择适合RGB显示屏的模板,确保外设配置正确。
- 外设初始化:配置GPIO、DMA、LCD控制器等外设,确保显示屏能正常工作。
在配置过程中,我参考了官方提供的驱动代码,发现LCD控制器的配置比较关键,需要设置正确的时序参数,否则显示屏会出现画面异常。
代码实战:点亮屏幕
首先,我尝试编写一个简单的程序,让屏幕显示一个固定的颜色。以下是关键代码:
// 初始化LCD控制器
void lcd_init(void) {
// 配置GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置LCD控制器
LCD_InitTypeDef LCD_InitStructure;
LCD_InitStructure.PLL = 240;
LCD_InitStructure.PLLSAI = 240;
LCD_InitStructure.PLLSAIR = 240;
LCD_InitStructure.PLLSAIQ = 240;
LCD_InitStructure.PLLSAIP = 240;
LCD_InitStructure.PLLSAIDIV = 240;
LCD_InitStructure.PLLDIV = 240;
LCD_InitStructure.PLLSAIDIV = 240;
LCD_InitStructure.PLLSAIQ = 240;
LCD_InitStructure.PLLSAIP = 240;
LCD_InitStructure.PLLSAIR = 240;
LCD_InitStructure.PLLSAIDIV = 240;
LCD_Init(&LCD_InitStructure);
}
这段代码主要配置了GPIO引脚和LCD控制器的时序参数。通过配置GPIO为复用推挽输出模式,确保信号能够正确传输到显示屏。LCD控制器的配置则需要根据显示屏的规格书来设置时序参数,确保显示屏能够稳定工作。
显示效果:从黑屏到彩色画面
经过一番配置后,我运行程序,显示屏终于亮了起来!不过,画面有点偏色,后来发现是RGB信号线接反了。调整后,画面恢复正常,显示出了一个蓝色的背景。
接下来,我尝试在屏幕上绘制一些简单的图形,比如矩形和文字。以下是绘制矩形的代码:
// 绘制矩形
void draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color) {
uint32_t x, y;
for (x = x1; x <= x2; x++) {
for (y = y1; y <= y2; y++) {
LCD_DrawPixel(x, y, color);
}
}
}
这个函数通过双重循环遍历矩形的每一个像素点,并调用LCD_DrawPixel
函数设置颜色。虽然这个方法效率不高,但对于小面积的图形绘制还是可以接受的。
文字显示:让屏幕更有内容
为了让屏幕显示文字,我需要编写一个简单的文字绘制函数。以下是代码:
// 绘制文字
void draw_text(uint16_t x, uint16_t y, const char *text, uint32_t color) {
uint8_t i = 0;
while (text[i] != '\0') {
LCD_DrawChar(x + i * 16, y, text[i], color, 0x000000);
i++;
}
}
这个函数遍历字符串中的每一个字符,并调用LCD_DrawChar
函数在指定位置绘制字符。每个字符的宽度为16像素,高度为16像素,字体大小可以根据需要调整。
退出与复位:确保程序稳定运行
在程序的最后,我添加了一个退出和复位的函数,确保程序在结束时能够正确复位外设,避免显示屏出现异常。
// 退出并复位
void exit_and_reset(void) {
// 关闭LCD控制器
LCD_Cmd(DISABLE);
// 重置
NVIC_SystemReset();
}
这个函数首先关闭LCD控制器,然后通过NVIC_SystemReset
函数复位,确保程序能够干净地退出。
总结:从零到点亮屏幕
通过这次实战,我成功地在正点原子7寸RGB液晶屏上实现了基本的显示功能。从硬件连接到配置,再到代码编写,每一步都充满了挑战和收获。虽然过程中遇到了一些问题,但通过查阅资料和调试,最终都得到了解决。
如果你也对嵌入式开发感兴趣,不妨尝试一下类似的项目。从零开始,一步步实现自己的想法,那种成就感是无法用语言形容的。
适用于正点原子7寸RGB液晶屏资料,包含AD20完整工程