本帖最后由 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;
- }
上述过程完成后基本上我们就完成了移植工作,烧写样例即可;
下面是我的显示效果
最后附上例程:
|