【小华HC32F448测评】+GPIO口及其使用
[复制链接]
在小华HC32F448开发板上,配有TFT显示屏的接口,但这种接口并非SPI接口,而是MCU接口。该接口是一种并行传输数据的接口。
据介绍它支持ATK-4.3'TFT显示屏,恰好手头有一块这种开发板的显示屏,于是就插上试了一下,但却没有一点反应。
原来开发板所支持的显示屏是以NT 35510为控制芯片,两者随接口相同但控制芯片却不一致,之所以能在原开发板上显示是因为该开发板采用了一种自动识别技术,可按控制芯片类型来自主更换驱动。
无奈之下,还是先借助GPIO口来驱动一款I2C接口的显示屏。
1.外观LED模块测试
要以GPIO口来驱动显示屏,就要先对使用的GPIO口加以测试,所用的测试工具就是一个LED模块,测试的引脚为PE0和PE1,这是开发板特意留给I2C接口的。
对所用引脚的配置函数为:
static void LED_Init(void)
{
stc_gpio_init_tstcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(LED_G_PORT, LED_G_PIN, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_00, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_01, &stcGpioInit);
}
供测试的主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
LED_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
for (;;) {
LED_G_TOGGLE();
GPIO_TogglePins(GPIO_PORT_E, GPIO_PIN_00);
GPIO_TogglePins(GPIO_PORT_E, GPIO_PIN_01);
DDL_DelayMS(DLY_MS);
}
}
经程序的编译和下载,其测试结果如图1和图2所示,说明这2个GPIO口可控。
图1 点亮LED模块
图2 熄灭LED模块
2.OLED屏显示驱动
有了前面的基础,即可以进行OLED屏的驱动。
OLED屏与开发板的连接关系为:
SCL---PE0
SDA---PE1
输出高低电平的语句定义为:
#define SCL_highGPIO_SetPins(GPIO_PORT_E, GPIO_PIN_00)
#define SCL_lowGPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_00)
#define SDA_highGPIO_SetPins(GPIO_PORT_E, GPIO_PIN_01)
#define SDA_lowGPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_01)
配置引脚工作模式的函数为:
static void LED_Init(void)
{
stc_gpio_init_tstcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_00, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_01, &stcGpioInit);
}
用于I2C发送起始、停止与等待的函数为:
void IIC_Start()
{
SCL_high;
SDA_high;
SDA_low;
SCL_low;
}
void IIC_Stop()
{
SCL_low;
SDA_low;
SCL_high;
SDA_high;
}
void IIC_Wait_Ack()
{
SCL_high;
SCL_low;
}
以GPIO口模拟I2C发送字节数据的函数为:
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
SCL_low;
for(i=0;i<8;i++)
{
m=da;
m=m&0x80;
if(m==0x80)
{
SDA_high;
}
else SDA_low;
da=da<<1;
SCL_high;
SCL_low;
}
}
实现清屏处理的函数是:
void OLED_Clear(void)
{
uint8_t i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD);
OLED_WR_Byte (0x00,OLED_CMD);
OLED_WR_Byte (0x10,OLED_CMD);
for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
}
}
进行字符串显示的函数为:
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
unsigned char j=0;
while (chr[j]!='\0')
{
OLED_ShowChar(x,y,chr[j],Char_Size);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
实现驱动测试的主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
LED_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"HC32F448",16);
OLED_ShowString(20,2,"OLED Test",16);
OLED_ShowString(20,5,"jinglixixi",16);
for (;;) {
LED_G_TOGGLE();
DDL_DelayMS(DLY_MS);
}
}
经程序的编译和下载,其测试结果如图3所示,说明对OLED屏的驱动有效且可行。
图3 OLED屏显示效果
|