移植 u8g2
2026-07-23
u8g2 对于资源的要求远远低于 LVGL 很适合在STM32F103C8T6上运行。 本次移植采用FreeRTOS移植章节为基础,即stm32f103c8t6展示添加u8g2UI库的移植。
下载源码
下载 u8g2 主分支master
移植
复制源文件
这里为了方便,并没有移除文档等不需要的文件。有些文档说明移除了非目标之外的其他驱动,以减小体积。本工程在连接时已填加编译器优化参数,即未调用的代码,在最终镜像生成时已被移除。所以即使不移除也没有影响
复制该目录到工程目录如下所示:
project# 工程根目录
.vscode# vscode配置目录
…
CMSIS# 架构库目录
…
STM32F10x_StdPeriph_Driver# 标准外设库 目录
…
FreeRTOS-Kernel# FREEROTS 内核目录
…
u8g2-master# u8g2 库
…
build# 编译输出目录
…
main.c# LED点亮示例代码
CMakeLists.txt# CMAKE编译配置文件
stlink-dap.cfg# 仿真器配置文件
stm32f1x.cfg# 目标芯片配置文件
STM32F103xx_FLASH.ld# 链接脚本文件
STM32F103xx.svd# 目标芯片寄存器
stm32f10x_conf.h# 标准外设库配置文件
添加代码补全和智能提示
.vscode/c_cpp_properties
{
"configurations": [
{
"name": "Win32",
// includePath 实现代码补全和智能提示的头文件搜索路径
"includePath": [
"${workspaceFolder}/CMSIS/CM3/CoreSupport",
"${workspaceFolder}/CMSIS/CM3/DeviceSupport/ST/STM32F10x",
"${workspaceFolder}/STM32F10x_StdPeriph_Driver/inc",
"${workspaceFolder}/FreeRTOS-Kernel",
"${workspaceFolder}/FreeRTOS-Kernel/include",
"${workspaceFolder}/FreeRTOS-Kernel/examples/template_configuration",
"${workspaceFolder}/FreeRTOS-Kernel/portable/GCC/ARM_CM3",
"${workspaceFolder}/u8g2-master/csrc",
"${workspaceFolder}/"
],
// defines 实现代码补全和智能提示的宏定义
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"STM32",
"STM32F10X_MD",
"USE_STDPERIPH_DRIVER"
],
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "windows-gcc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}添加头文件、源文件路径配置
- 添加
u8g2相关的源文件、头文件
CMakeLists.txt
# 设置 CMake 最低支持版本
cmake_minimum_required(VERSION 3.17)
# Cmake 交叉编译配置
set(CMAKE_SYSTEM_NAME Generic)
# 定义工程名称
project("demo")
# 指定编译工具
set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++")
set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc")
set(CMAKE_AR "arm-none-eabi-ar")
set(CMAKE_OBJCOPY "arm-none-eabi-objcopy")
set(CMAKE_OBJDUMP "arm-none-eabi-objdump")
set(CMAKE_SIZE "arm-none-eabi-size")
# 编译相关选项
set(MCU_FLAGS "-mcpu=cortex-m3 -mthumb -mfloat-abi=soft")
set(CMAKE_C_FLAGS_DEBUG "-g -ggdb -Og")
set(CMAKE_C_FLAGS_RELEASE "-O3")
# set(CMAKE_C_FLAGS "${MCU_FLAGS} -ffunction-sections -fdata-sections -fno-builtin -fno-common -Wextra -Werror -Wno-unknown-pragmas -Wl,-u,_printf_float") #-w -Wall
set(CMAKE_C_FLAGS "${MCU_FLAGS} -ffunction-sections -fdata-sections -fno-builtin -fno-common ") # -Wall -Wno-unknown-pragmas
set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp")
if(RELEASE)
message("build for release!")
set(CMAKE_BUILD_TYPE "Release")
add_definitions(-DRELEASE)
else()
message("build for debug!")
set(CMAKE_BUILD_TYPE "Debug")
add_definitions(-DDEBUG)
endif()
# 设置编译器选项
add_definitions(-DUSE_STDPERIPH_DRIVER)
add_definitions(-DSTM32F10X_MD)
# 添加头文件搜索路径
include_directories(
${PROJECT_SOURCE_DIR}/CMSIS/CM3/CoreSupport
${PROJECT_SOURCE_DIR}/CMSIS/CM3/DeviceSupport/ST/STM32F10x
${PROJECT_SOURCE_DIR}/STM32F10x_StdPeriph_Driver/inc
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/include
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/examples/template_configuration
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/portable/GCC/ARM_CM3
${PROJECT_SOURCE_DIR}/u8g2-master/csrc/
${PROJECT_SOURCE_DIR}/
)
# 添加源文件
file(GLOB CMSIS_LIST
${PROJECT_SOURCE_DIR}/CMSIS/CM3/CoreSupport/core_cm3.c
${PROJECT_SOURCE_DIR}/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/portable/GCC/ARM_CM3/port.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/portable/MemMang/heap_4.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/croutine.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/event_groups.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/list.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/queue.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/stream_buffer.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/tasks.c
${PROJECT_SOURCE_DIR}/FreeRTOS-Kernel/timers.c
${PROJECT_SOURCE_DIR}/u8g2-master/csrc/*.c
)
aux_source_directory(${PROJECT_SOURCE_DIR}/STM32F10x_StdPeriph_Driver/src STD_LIST)
# 设置启动文件路径
set(START_UP_ASM ${PROJECT_SOURCE_DIR}/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s)
#设置支持 ASM
enable_language(ASM)
#设置启动文件 C 属性
set_property(SOURCE ${START_UP_ASM} PROPERTY LANGUAGE C)
# 设置链接脚本路径
set(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/STM32F103C8T6.ld)
# 设置链接器选项
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage -specs=rdimon.specs --specs=nano.specs -specs=nosys.specs -T${LINKER_SCRIPT} -Wl,-Map=${PROJECT_BINARY_DIR}/${DEVICE_TYPE}.map,--cref -Wl,--gc-sections")
#生成目标文件
add_executable(app.elf main.c ${START_UP_ASM} ${CMSIS_LIST} ${STD_LIST})
#设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
#设置 ELF 转换路径
set(ELF_FILE ${PROJECT_BINARY_DIR}/app.elf)
set(HEX_FILE ${PROJECT_BINARY_DIR}/app.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/app.bin)
add_custom_command(TARGET "app.elf" POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -Obinary ${ELF_FILE} ${BIN_FILE}
COMMAND ${CMAKE_OBJCOPY} -Oihex ${ELF_FILE} ${HEX_FILE}
COMMAND ${CMAKE_COMMAND} -E copy ${HEX_FILE} "${PROJECT_BINARY_DIR}/bin/${PROJECT_NAME}.hex"
COMMAND ${CMAKE_COMMAND} -E copy ${BIN_FILE} "${PROJECT_BINARY_DIR}/bin/${PROJECT_NAME}.bin"
COMMAND ${CMAKE_COMMAND} -E copy ${ELF_FILE} "${PROJECT_BINARY_DIR}/bin/${PROJECT_NAME}.elf"
COMMAND ${CMAKE_SIZE} --format=berkeley ${ELF_FILE} ${HEX_FILE}
COMMENT "Building ${PROJECT_NAME} (bin, hex, elf) and print size")模拟I2C移植
屏幕驱动为ssd1315 i2c接口
u8g2_Setup_ssd1315_128x64_noname_1spi接口 单页缓冲u8g2_Setup_ssd1315_128x64_noname_2spi接口 双页缓冲u8g2_Setup_ssd1315_128x64_noname_fspi接口 全帧缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_1I2C 单页缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_2I2C 双页缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_fI2C 全帧缓冲 所以选择注册函
GPIO 模拟软件I2C参考如下:
main.c
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "mui_u8g2.h"
static TaskHandle_t xHandle1 = NULL;
static u8g2_t u8g2;
void SOFT_I2C_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {
.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11,
.GPIO_Mode = GPIO_Mode_Out_OD,
.GPIO_Speed = GPIO_Speed_50MHz};
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
}
uint8_t sw_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
switch (msg)
{
case U8X8_MSG_DELAY_MILLI:
for (uint32_t i = 0; i < (arg_int * 7200); i++)
__NOP();
break;
case U8X8_MSG_DELAY_10MICRO:
for (uint32_t i = 0; i < (10 * 72); i++)
__NOP();
break;
case U8X8_MSG_DELAY_100NANO:
__NOP();
break;
case U8X8_MSG_GPIO_I2C_CLOCK:
if (arg_int)
GPIO_SetBits(GPIOB, GPIO_Pin_10);
else
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
break;
case U8X8_MSG_GPIO_I2C_DATA:
if (arg_int)
GPIO_SetBits(GPIOB, GPIO_Pin_11);
else
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
break;
default:
return 0;
}
return 1;
}
void vTask1(void *param)
{
while (1)
{
vTaskDelay(pdMS_TO_TICKS(300));
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(pdMS_TO_TICKS(300));
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {
.GPIO_Pin = GPIO_Pin_13,
.GPIO_Mode = GPIO_Mode_Out_PP,
.GPIO_Speed = GPIO_Speed_50MHz};
GPIO_Init(GPIOC, &GPIO_InitStruct);
SOFT_I2C_Init();
u8g2_Setup_ssd1315_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, sw_gpio_and_delay);
u8g2_InitDisplay(&u8g2); // 初始化
u8g2_SetPowerSave(&u8g2, 0);
u8g2_ClearBuffer(&u8g2); // 清屏
u8g2_SendBuffer(&u8g2);
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_4x6_tr);
u8g2_DrawStr(&u8g2, 1, 54, "github.com/olikraus/u8g2");
u8g2_SendBuffer(&u8g2);
xTaskCreate(vTask1, "vTask1", 64, NULL, 2, &xHandle1);
vTaskStartScheduler();
}硬件I2C移植
屏幕驱动为ssd1315 i2c接口
u8g2_Setup_ssd1315_128x64_noname_1spi接口 单页缓冲u8g2_Setup_ssd1315_128x64_noname_2spi接口 双页缓冲u8g2_Setup_ssd1315_128x64_noname_fspi接口 全帧缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_1I2C 单页缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_2I2C 双页缓冲u8g2_Setup_ssd1315_i2c_128x64_noname_fI2C 全帧缓冲 所以选择注册函
main.c
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "mui_u8g2.h"
static TaskHandle_t xHandle1 = NULL;
static u8g2_t u8g2;
void HARD_I2C_Init() {
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
}
uint8_t SSD1315_WriteMultiByte(uint8_t *pData, uint16_t len)
{
while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY))
;
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT))
;
I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
;
for (uint16_t i = 0; i < len; i++)
{
I2C_SendData(I2C2, pData[i]);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
;
}
I2C_GenerateSTOP(I2C2, ENABLE);
return 0;
}
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
static uint8_t buffer[32];
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_START_TRANSFER:
buf_idx = 0;
break;
case U8X8_MSG_BYTE_END_TRANSFER:
SSD1315_WriteMultiByte(buffer , buf_idx);
break;
default:
return 0;
}
return 1;
}
uint8_t hw_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
switch(msg)
{
case U8X8_MSG_GPIO_AND_DELAY_INIT:
break;
case U8X8_MSG_DELAY_MILLI:
for (uint32_t i = 0; i < (arg_int * 7200); i++)
__NOP();
break;
case U8X8_MSG_GPIO_I2C_CLOCK:
break;
case U8X8_MSG_GPIO_I2C_DATA:
break;
default:
return 0;
}
return 1; // command processed successfully.
}
void vTask1(void *param)
{
while (1)
{
vTaskDelay(pdMS_TO_TICKS(300));
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(pdMS_TO_TICKS(300));
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {
.GPIO_Pin = GPIO_Pin_13,
.GPIO_Mode = GPIO_Mode_Out_PP,
.GPIO_Speed = GPIO_Speed_50MHz};
GPIO_Init(GPIOC, &GPIO_InitStruct);
HARD_I2C_Init();
u8g2_Setup_ssd1315_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, hw_gpio_and_delay);
u8g2_InitDisplay(&u8g2); // 初始化
u8g2_SetPowerSave(&u8g2, 0);
u8g2_ClearBuffer(&u8g2); // 清屏
u8g2_SendBuffer(&u8g2);
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_4x6_tr);
u8g2_DrawStr(&u8g2, 1, 54, "github.com/olikraus/u8g2");
u8g2_SendBuffer(&u8g2);
xTaskCreate(vTask1, "vTask1", 64, NULL, 2, &xHandle1);
vTaskStartScheduler();
}镜像输出
编译成功后完整日志如下
* 正在执行任务: rm * -r
* 终端将被任务重用,按任意键关闭。
* 正在执行任务: cmake -G 'MinGW Makefiles' ..
-- The C compiler identification is GNU 16.1.0
-- The CXX compiler identification is GNU 16.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: C:/Program Files/mingw64/bin/cc.exe
-- Check for working C compiler: C:/Program Files/mingw64/bin/cc.exe - works
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Check for working CXX compiler: C:/Program Files/mingw64/bin/cc.exe
-- Check for working CXX compiler: C:/Program Files/mingw64/bin/cc.exe - works
-- Detecting CXX compile features
-- Detecting CXX compile features - done
build for debug!
-- The ASM compiler identification is GNU
-- Found assembler: C:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.10/bin/arm-none-eabi-gcc.exe
-- Configuring done (6.1s)
-- Generating done (0.2s)
-- Build files have been written to: C:/Users/user/Desktop/project-rtos/build
* 终端将被任务重用,按任意键关闭。
* 正在执行任务: make
[ 0%] Building C object CMakeFiles/app.elf.dir/main.c.obj
[ 1%] Building C object CMakeFiles/app.elf.dir/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s.obj
[ 1%] Building C object CMakeFiles/app.elf.dir/CMSIS/CM3/CoreSupport/core_cm3.c.obj
[ 2%] Building C object CMakeFiles/app.elf.dir/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c.obj
[ 2%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/croutine.c.obj
[ 3%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/event_groups.c.obj
[ 4%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/list.c.obj
[ 4%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/portable/GCC/ARM_CM3/port.c.obj
[ 5%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/portable/MemMang/heap_4.c.obj
[ 5%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/queue.c.obj
[ 6%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/stream_buffer.c.obj
[ 7%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/tasks.c.obj
[ 7%] Building C object CMakeFiles/app.elf.dir/FreeRTOS-Kernel/timers.c.obj
[ 8%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/mui.c.obj
[ 8%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/mui_u8g2.c.obj
[ 9%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_arc.c.obj
[ 10%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_bitmap.c.obj
[ 10%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_box.c.obj
[ 11%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_buffer.c.obj
[ 11%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_button.c.obj
[ 12%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_circle.c.obj
[ 13%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_cleardisplay.c.obj
[ 13%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_d_memory.c.obj
[ 14%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_d_setup.c.obj
[ 14%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_font.c.obj
[ 15%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_fonts.c.obj
[ 15%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_hvline.c.obj
[ 16%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_input_value.c.obj
[ 17%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_intersection.c.obj
[ 17%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_kerning.c.obj
[ 18%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_line.c.obj
[ 18%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_ll_hvline.c.obj
[ 19%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_message.c.obj
[ 20%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_polygon.c.obj
[ 20%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_selection_list.c.obj
[ 21%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8g2_setup.c.obj
[ 21%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8log.c.obj
[ 22%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8log_u8g2.c.obj
[ 23%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8log_u8x8.c.obj
[ 23%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_8x8.c.obj
[ 24%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_byte.c.obj
[ 24%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_cad.c.obj
[ 25%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_capture.c.obj
[ 26%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_a2printer.c.obj
[ 26%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ch1120.c.obj
[ 27%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_gp1247ai.c.obj
[ 27%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_gp1287ai.c.obj
[ 28%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_gp1294ai.c.obj
[ 28%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_gu800.c.obj
[ 29%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_hd44102.c.obj
[ 30%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_il3820_296x128.c.obj
[ 30%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ist3020.c.obj
[ 31%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ist3088.c.obj
[ 31%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ist7920.c.obj
[ 32%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ks0108.c.obj
[ 33%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_lc7981.c.obj
[ 33%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ld7032_60x32.c.obj
[ 34%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ls013b7dh03.c.obj
[ 34%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_max7219.c.obj
[ 35%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_pcd8544_84x48.c.obj
[ 36%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_pcf8812.c.obj
[ 36%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_pcf8814_hx1230.c.obj
[ 37%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_s1d15300.c.obj
[ 37%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_s1d15721.c.obj
[ 38%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_s1d15e06.c.obj
[ 39%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sbn1661.c.obj
[ 39%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sed1330.c.obj
[ 40%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sh1106_64x32.c.obj
[ 40%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sh1106_72x40.c.obj
[ 41%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sh1107.c.obj
[ 42%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sh1108.c.obj
[ 42%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_sh1122.c.obj
[ 43%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1305.c.obj
[ 43%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_128x32.c.obj
[ 44%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_128x64_noname.c.obj
[ 44%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_2040x16.c.obj
[ 45%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_48x64.c.obj
[ 46%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_64x32.c.obj
[ 46%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_64x48.c.obj
[ 47%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_72x40.c.obj
[ 47%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_96x16.c.obj
[ 48%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1306_96x40.c.obj
[ 49%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1309.c.obj
[ 49%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1312.c.obj
[ 50%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1315_128x64_noname.c.obj
[ 50%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1316.c.obj
[ 51%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1317.c.obj
[ 52%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1318.c.obj
[ 52%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1320.c.obj
[ 53%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1322.c.obj
[ 53%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1325.c.obj
[ 54%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1326.c.obj
[ 55%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1327.c.obj
[ 55%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1329.c.obj
[ 56%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1362.c.obj
[ 56%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1362z.c.obj
[ 57%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1363.c.obj
[ 57%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1606_172x72.c.obj
[ 58%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_ssd1607_200x200.c.obj
[ 59%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7302.c.obj
[ 59%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7305.c.obj
[ 60%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7511.c.obj
[ 60%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st75160.c.obj
[ 61%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st75161.c.obj
[ 62%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st75256.c.obj
[ 62%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7528.c.obj
[ 63%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st75320.c.obj
[ 63%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7539.c.obj
[ 64%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7565.c.obj
[ 65%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7567.c.obj
[ 65%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7571.c.obj
[ 66%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_erc240160.c.obj
[ 66%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_jlx320160.c.obj
[ 67%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_jlx384160.c.obj
[ 68%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_md240128.c.obj
[ 68%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_pe24064.c.obj
[ 69%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_s028hn118a.c.obj
[ 69%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7586s_ymc240160.c.obj
[ 70%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7588.c.obj
[ 71%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_st7920.c.obj
[ 71%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_stdio.c.obj
[ 72%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_t6963.c.obj
[ 72%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1601.c.obj
[ 73%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1604.c.obj
[ 73%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1608.c.obj
[ 74%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1609.c.obj
[ 75%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1610.c.obj
[ 75%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1611.c.obj
[ 76%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1617.c.obj
[ 76%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1628.c.obj
[ 77%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1638.c.obj
[ 78%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1698.c.obj
[ 78%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1701_dogs102.c.obj
[ 79%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_d_uc1701_mini12864.c.obj
[ 79%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_debounce.c.obj
[ 80%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_display.c.obj
[ 81%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_fonts.c.obj
[ 81%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_gpio.c.obj
[ 82%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_input_value.c.obj
[ 82%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_message.c.obj
[ 83%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_selection_list.c.obj
[ 84%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_setup.c.obj
[ 84%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_string.c.obj
[ 85%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_u16toa.c.obj
[ 85%] Building C object CMakeFiles/app.elf.dir/u8g2-master/csrc/u8x8_u8toa.c.obj
[ 86%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/misc.c.obj
[ 86%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c.obj
[ 87%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c.obj
[ 88%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c.obj
[ 88%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c.obj
[ 89%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c.obj
[ 89%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c.obj
[ 90%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c.obj
[ 91%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c.obj
[ 91%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c.obj
[ 92%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c.obj
[ 92%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c.obj
[ 93%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c.obj
[ 94%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c.obj
[ 94%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c.obj
[ 95%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c.obj
[ 95%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c.obj
[ 96%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c.obj
[ 97%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c.obj
[ 97%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c.obj
[ 98%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c.obj
[ 98%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c.obj
[ 99%] Building C object CMakeFiles/app.elf.dir/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c.obj
[100%] Linking C executable app.elf
Memory region Used Size Region Size %age Used
RAM: 8592 B 20 KB 41.95%
FLASH: 22844 B 64 KB 34.86%
Building demo (bin, hex, elf) and print size
text data bss dec hex filename
22828 16 8584 31428 7ac4 C:/Users/user/Desktop/project-rtos/build/app.elf
0 22844 0 22844 593c C:/Users/user/Desktop/project-rtos/build/app.hex
[100%] Built target app.elf
* 终端将被任务重用,按任意键关闭。
u8g2 显示效果
u8g2 显示效果