移植步骤
一:下载 u8g2 源码
https://github.com/olikraus/u8g2.git
二:精简源码
源码文件夹中,只用了 csrc 文件,cppsrc 貌似是针对 c++工程的,我这边就把 csrc 文件夹复制到自己的 keil 工程中
- *由于使用了 ssd1315 的驱动,我这边就保留了u8x8_d_ssd1315_128x64_noname.c 文件其它的 u8x8d.c 都删除了**
- 然后精简了u8g2_d_setup.c 和 u8g2_d_memory.c 中 U8g2 提供的驱动兼容
- 在u8g2_d_setup.c 中,只需要保留 u8g2_Setup_ssd1315_i2c_128x64_noname_f() 这一个函数即可。注意,该文件内有几个命名类似的函数:命名中无 i2c 的是 SPI 接口驱动的函数,需要根据接口选择;以 1 结尾的函数代表使用的缓存空间为 128 字节,以 2 结尾的函数代表使用的缓存为 256字节,类似以 f 结尾的函数代表使用的缓存为 1024 字节
- u8g2_d_memory.c 文件也是同理,它需要根据 u8g2_d_setup.c 中的调用情况决定用到哪些函数。由于 u8g2_Setup_ssd1315_i2c_128x64_noname_f() 函数只用到 u8g2_m_16_8_f() 这一个函数,因此只需要保留它,其余函数全部删除即可
三:添加源码到工程中
就是把精简后的 csrc 文件加入到 keil 工程中即可
四:编写u8g2_Setup_ssd1315_i2c_128x64_noname_f 所需要的回调函数
//us级别的延时 1-65535us
void mydelay_us(uint32_t us)
{
__HAL_TIM_SET_AUTORELOAD(&htim6, us);
__HAL_TIM_ENABLE(&htim6);
while(!__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE))//!__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE)
{
// Wait for the timer to finish
}
__HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);
}
//延时 由于用硬件IIC所以只提供ms延时就好了
uint8_t u8x8_gpio_and_delay_hw(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
switch (msg) {
case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
break;
case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
break;
case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
mydelay_us(1000);
break;
case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
break; // arg_int=1: Input dir with pullup high for I2C clock pin
case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin
break; // arg_int=1: Input dir with pullup high for I2C data pin
case U8X8_MSG_GPIO_MENU_SELECT:
//u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_NEXT:
//u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_PREV:
//u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
break;
case U8X8_MSG_GPIO_MENU_HOME:
//u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
break;
default:
//u8x8_SetGPIOResult(u8x8, 1); // default return value
break;
}
return 1;
}
unsigned char message_buffer[256];
unsigned int message_index = 0;
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
uint8_t* data = (uint8_t*) arg_ptr;
switch(msg) {
case U8X8_MSG_BYTE_SEND:
#if 1
while( arg_int-- > 0 ) {
message_buffer[message_index++] = *data++;
if(message_buffer>= 255)
{
message_index = 0;
return 0;//超出范围这里不大可能会进来,u8g2库貌似有限制
}
continue;
}
#endif
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:
memset(message_buffer, 0, sizeof(message_buffer));
message_index = 0;
break;
case U8X8_MSG_BYTE_END_TRANSFER:
HAL_I2C_Master_Transmit(&hi2c1, 0x78, message_buffer, message_index, HAL_MAX_DELAY);
break;
default:
return 0;
}
return 1;
}
编写 main 函数
int main(void)
{
/* USER CODE BEGIN 1 */
u8g2_t u8g2;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
MX_I2C1_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
memset(ch, 0, RXBUFFERSIZE);
printf("hello\r\n");
u8g2_Setup_ssd1315_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay_hw);
u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
HAL_Delay(100);
u8g2_SetPowerSave(&u8g2, 0); // wake up display
HAL_Delay(100);
u8g2_FirstPage(&u8g2);
do {
u8g2_SetFontMode(&u8g2, 1);
u8g2_SetFontDirection(&u8g2, 0);
u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
u8g2_DrawStr(&u8g2, 0, 20, "U");
u8g2_SetFontDirection(&u8g2, 1);
u8g2_SetFont(&u8g2, u8g2_font_inb30_mn);
u8g2_DrawStr(&u8g2, 21, 8, "8");
u8g2_SetFontDirection(&u8g2, 0);
u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
u8g2_DrawStr(&u8g2, 51, 30, "g");
u8g2_DrawStr(&u8g2, 67, 30, "\xb2");
u8g2_DrawHLine(&u8g2, 2, 35, 47);
u8g2_DrawHLine(&u8g2, 3, 36, 47);
u8g2_DrawVLine(&u8g2, 45, 32, 12);
u8g2_DrawVLine(&u8g2, 46, 33, 12);
u8g2_SetFont(&u8g2, u8g2_font_5x8_tr);
u8g2_DrawStr(&u8g2, 1, 54, "github.com/olikraus/u8g2");
} while (u8g2_NextPage(&u8g2));
while (1)
{
//查看是否跑飞
mydelay_us(2000);
HAL_GPIO_TogglePin(TEST_LOG_GPIO_Port, TEST_LOG_Pin);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
第五步编译和运行
