【国民技术车规MCU N32A455开发板】1、开发板测试 - 汽车电子
接上篇,我的作业是需要用到LCD屏的,所以先驱动LCD屏。
【屏与GPIO的选择】
1、屏手头上有多种,前面有大佬写了一个stm7735的,所以就"学习”了一下他的帖子【国民技术车规MCU N32A455开发板】测评 - 4 - 中景园TFT_LCD移植+SPI2测试 - 测评中心专版。在此特别感谢@裴红恩大佬。主要是最近手头上的东西太多了。
2、GPIO的选择,为后期准备硬件SPI来驱动,考虑到速度的选择,我这里选取了SPI1来做接口。具体的引脚选择见下面的宏定义代码:
#define LCD_SPI SPI1
#define LCD_SPI_CLK RCC_APB2_PERIPH_SPI1
#define LCD_SPI_SCK_PIN GPIO_PIN_5 /* PA.05 */
#define LCD_SPI_SCK_GPIO_PORT GPIOA /* GPIOA */
#define LCD_SPI_SCK_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define LCD_SPI_MISO_PIN GPIO_PIN_6 /* PA.06 */
#define LCD_SPI_MISO_GPIO_PORT GPIOA /* GPIOA */
#define LCD_SPI_MISO_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define LCD_SPI_MOSI_PIN GPIO_PIN_7 /* PA.07 */
#define LCD_SPI_MOSI_GPIO_PORT GPIOA /* GPIOA */
#define LCD_SPI_MOSI_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define LCD_CS_PIN GPIO_PIN_10 /* PE.10 */
#define LCD_CS_GPIO_PORT GPIOE /* GPIOE */
#define LCD_CS_GPIO_CLK RCC_APB2_PERIPH_GPIOE
#define LCD_RES_PIN GPIO_PIN_8 /* PE.8 */
#define LCD_RES_GPIO_PORT GPIOE /* GPIOE */
#define LCD_RES_GPIO_CLK RCC_APB2_PERIPH_GPIOE
#define LCD_BL_PIN GPIO_PIN_9 /* PE.9 */
#define LCD_BL_GPIO_PORT GPIOE /* GPIOE */
#define LCD_BL_GPIO_CLK RCC_APB2_PERIPH_GPIOE
3、在屏的驱动中,我使用了软件SPI与硬件SPI兼容的模式,使用宏#define SPI_Soft 来切换使用哪种方式。
4、GPIO的初始化,我目前用到的只是输出接口,所以5个IO全部初始化为输出50MHz的速度:
void LCD_GPIO_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitStructure.Pin = LCD_CS_PIN | LCD_RES_PIN | LCD_BL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
#ifdef SPI_Soft
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.Pin = LCD_SPI_SCK_PIN | LCD_SPI_MISO_PIN | LCD_SPI_MOSI_PIN ;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
#else
RCC_EnableAPB2PeriphClk(LCD_SPI_CLK, ENABLE);
/*!< Configure sFLASH_SPI pins: SCK */
GPIO_InitStructure.Pin = LCD_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MOSI */
GPIO_InitStructure.Pin = LCD_SPI_MOSI_PIN;
GPIO_InitPeripheral(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MISO */
GPIO_InitStructure.Pin = LCD_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
#endif
}
同时修改SPI输出数据的函数:
/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
u8 i;
LCD_CS_Clr();
#ifdef SPI_Soft
for(i=0;i<8;i++)
{
LCD_SCLK_Clr();
if(dat&0x80)
{
LCD_MOSI_Set();
}
else
{
LCD_MOSI_Clr();
}
LCD_SCLK_Set();
dat<<=1;
}
#else
SPI_I2S_TransmitData(LCD_SPI, dat);
while (SPI_I2S_GetStatus(LCD_SPI, SPI_I2S_TE_FLAG) == RESET)
{;}
#endif
LCD_CS_Set();
}
这样就完成了移植代码的工作。其实如果是单个显示屏的话,可以不用初始化CS与BLK,CS直接接地,BLK直接接VCC,这样就可以使用4线就可以驱动好了。
5、字库的制作,打开PCtoLCD,创建24*24的字体:
在设置中选择如下图所示。
最后在如下图所示的地方输入需要的汉字,生成字模,然后把生成的内容复制到字库之中去。
接着在主程序中编写测试代码:
#include "main.h"
#include "log.h"
#include "lcd_init.h"
#include "lcd.h"
int main(void)
{
log_init();
LCD_Init();//LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
LCD_ShowChinese(10,0,"国民技术",RED,WHITE,24,0);
LCD_ShowString(24,30,"N32A455",RED,WHITE,16,0);
while(1)
{
}
}
下载到开发板后,效果如下图所示:
但是我使用spi还没有驱动好屏,后面再试试。附工程源码。