本帖最后由 hayden0 于 2020-10-26 14:50 编辑
看见论坛里都发了OLED驱动的帖子,我也跃跃欲试,终于在不懈的努力下完成了U8g2的移植工作,难点在于HC32的硬件IIC与u8g2对应的接口理解。
先发一个u8g2的开源链接:https://github.com/olikraus/u8g2
1、复制CSRC文件夹文件到工程,然后把他们加入Keil工程
2、加入keil工程时u8x8_d_开头的文件之加入与你使用的显示器对应的文件即可,例如我们本次开发板自带的显示器是SSD1306驱动128*32像素大小的OLED,所以我加入了u8x8_d_ssd1306_128x32.c
3、定义回调函数和延时函数
我们使用的是HC32F460的硬件IIC,所以添加下面函数
uint8_t u8x8_byte_hc32_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
static uint8_t buffer[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
static uint8_t buf_idx;
uint8_t *data;
switch(msg)
{
case U8X8_MSG_BYTE_SEND:
data = (uint8_t *)arg_ptr;
while( arg_int > 0 )
{
buffer[buf_idx++] = *data;
data++;
arg_int--;
}
break;
case U8X8_MSG_BYTE_INIT:
/* add your custom code to init i2c subsystem */
break;
case U8X8_MSG_BYTE_SET_DC:
/* ignored for i2c */
break;
case U8X8_MSG_BYTE_START_TRANSFER:
buf_idx = 0;
break;
case U8X8_MSG_BYTE_END_TRANSFER:
i2c_transfer(OLED_ADDRESS, buf_idx, buffer);
break;
default:
return 0;
}
return 1;
}
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
/* STM32 supports HW SPI, Remove unused cases like U8X8_MSG_DELAY_XXX & U8X8_MSG_GPIO_XXX */
switch(msg)
{
case U8X8_MSG_GPIO_AND_DELAY_INIT:
/* Insert codes for initialization */
break;
case U8X8_MSG_DELAY_MILLI:
/* ms Delay */
Ddl_Delay1ms(arg_int);
break;
// case U8X8_MSG_GPIO_CS:
// /* Insert codes for SS pin control */
// HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, arg_int);
// break;
// case U8X8_MSG_GPIO_DC:
// /* Insert codes for DC pin control */
// HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, arg_int);
// break;
// case U8X8_MSG_GPIO_RESET:
// /* Insert codes for RST pin control */
// HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, arg_int);
// break;
}
return 1;
}
上述过程完成后基本上我们就完成了移植工作,烧写样例即可;
下面是我的显示效果
最后附上例程:
|
例程怎么获得?一直回复我只有特定用户可以下载