U8G2库简介

U8g2是嵌入式设备的单色图形库,一句话简单明了。主要应用于嵌入式设备,包括我们常见的单片机;

建议先看这篇博客的介绍,写的比较好u8g2库的使用
这篇博客介绍了对于u8g2的使用,但是是针对arduino平台的,但是使用方法在stm32平台上也是大同小异。

U8G2库的下载及硬件平台

U8G2库是一个开源的github项目,通过github可以直接下载 。下载地址

此次使用的mcu是stm32f407vet6,屏幕是IIC接口的oled12864屏幕,屏幕驱动芯片是ssd1306.,使用的是cubeide进行开发。

移植到stm32

首先我们需要建立一份工程,关于工程的建立,再这里就不在赘述了,记住要初始化一个IIC,不然就没有办法驱动屏幕了。

打卡我们下载的u8g2源码,可以看到里面有许多文件夹。其他的文件夹里面都是一些说明文档,可以不用关注,注意我用红框标注的,csrc文件夹,这里面存放的都是我们所需要的源码。

打开csrc文件夹,可以看到里面有许多.c文件。注意到有许多U8x8_d_*****类型的c文件,这是针对不同的驱动芯片所写的驱动程序,我们只需要选择我们需要的就行了,其他的在移植到自己的工程的时候,可以把删除。我们此次使用的是ssd1306,因此在移植的时候,只保留ssd1306相关的驱动程序就可以了(图中画红线的部分)。

**注意:移植的时候,把不同的驱动芯片的c文件删除即可,不要删除其他的

然后将csrc文件夹下面的文件都复制到cubeide的工程中,建立好的工程如下图。

到这一步就距离成功仅有一步之遥了,接下来编写我们需要的底层函数。

编写一个oled.c和oled.h的文件

oled .c

#include "oled.h"
#include "i2c.h"uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{/* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */static uint8_t buffer[128];static uint8_t buf_idx;uint8_t *data;switch (msg){case U8X8_MSG_BYTE_INIT:{/* add your custom code to init i2c subsystem */MX_I2C1_Init(); //I2C初始化}break;case U8X8_MSG_BYTE_START_TRANSFER:{buf_idx = 0;}break;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_END_TRANSFER:{if (HAL_I2C_Master_Transmit(&hi2c1, (OLED_ADDRESS), buffer, buf_idx, 1000) != HAL_OK)return 0;}break;case U8X8_MSG_BYTE_SET_DC:break;default:return 0;}return 1;
}void delay_us(uint32_t time)
{uint32_t i = 8 * time;while (i--);
}uint8_t u8x8_gpio_and_delay(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__NOP();break;case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro secondsfor (uint16_t n = 0; n < 320; n++){__NOP();}break;case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli secondHAL_Delay(1);break;case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHzdelay_us(5);break;                    // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25uscase U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pinbreak;                    // arg_int=1: Input dir with pullup high for I2C clock pincase U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pinbreak;                    // arg_int=1: Input dir with pullup high for I2C data pincase 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 valuebreak;}return 1;
}
void u8g2Init(u8g2_t *u8g2)
{u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay); // 初始化 u8g2 结构体u8g2_InitDisplay(u8g2);                                                                       // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态u8g2_SetPowerSave(u8g2, 0);                                                                   // 打开显示器u8g2_ClearBuffer(u8g2);
}

oled.h文件

#ifndef __oled_H
#define __oled_H
#ifdef __cplusplusextern "C" {#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "u8g2.h"
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */
#define u8         unsigned char  // ?unsigned char ????
#define MAX_LEN    128  //
#define OLED_ADDRESS  0x78 // oled模块从机地址
#define OLED_CMD   0x00  // 写命令
#define OLED_DATA  0x40  // 写数据/* USER CODE BEGIN Prototypes */uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);void u8g2Init(u8g2_t *u8g2);#ifdef __cplusplus
}
#endif
#endif /*__ i2c_H */
/* USER CODE END Prototypes */

主函数

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "u8g2.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 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_I2C1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */u8g2_t u8g2; // a structure which will contain all the data for one displayu8g2Init(&u8g2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *///u8g2_DrawCircle(&u8g2, 64, 32, 30, U8G2_DRAW_ALL);u8g2_SendBuffer(&u8g2);u8g2_DrawBox(&u8g2,0,0,20,20);u8g2_DrawBox(&u8g2,20,20,20,20);u8g2_SendBuffer(&u8g2);u8g2_DrawFrame(&u8g2,10,40,20,20);u8g2_SendBuffer(&u8g2);u8g2_SetFont(&u8g2,u8g2_font_DigitalDiscoThin_tf);u8g2_DrawStr(&u8g2,30,10,"free");u8g2_SendBuffer(&u8g2);HAL_Delay(1000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 4;RCC_OscInitStruct.PLL.PLLN = 168;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

按照以上进行移植,就可以使用U8G2库了。

成品效果图


到这里 u8g2就顺利的移植到 stm32平台上了,
欢迎观看,
有什么问题留言给我哦。

U8G2库移植到STM32平台上相关推荐

  1. python是开源的.它可以被移植_python是开源的,它可以被移植到许多平台上,是对的吗?...

    python是开源的,它可以被移植到许多平台上,是对的吗? python是开源的,它可以被移植到许多平台上. Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义 ...

  2. python是开源的、它可以被移植到许多平台上_python是开源的,它可以被移植到许多平台上,是对的吗?_后端开发...

    一个c语言源程序是由什么组成_后端开发 一个c语言源程序是由一个或多个源文件组成的,而每个源文件可由一个或多个函数组成,并且一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数. ...

  3. 基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IC-MU磁绝对值编码器的SPI通讯和码盘数据处理 前言 一.硬件连接 二.STM32 cubmx配置模式 三.软件代码及思路 1.寄 ...

  4. STM32使用OLED移植U8g2库

    STM32使用OLED移植U8g2库 STM32CubeMX配置 硬件 STM32F103C8T6 I2C通信OLED 128*64 软件 System Core->RCC->HSE-&g ...

  5. 【华为云技术分享】如何将90%的代码自动迁移到鲲鹏平台上

    主讲人:华为云云享专家  张老师 大家好,今天要讲的主题是关于软件迁移,这是一个久远的话题,因为但凡牵扯到切换平台.CPU架构的变化,甚至一些语言版本的升级,都可能会面临到软件迁移的问题.今天我们就探 ...

  6. android平台上的sprite,tilelayer设计,android平台上的sprite,tilelayer设计

    android平台上的sprite,tilelayer设计 Android 没有提供 javaMe 里面的 Sprite, TileLayer 等,但自己可以设计,为图形处理建立一个基本的框架,同时可 ...

  7. u8g2库stm32移植记录(硬件IIC)

    这是用stm32cubemx,hal库,硬件IIC的方式移植u8g2的教程: 0.移植其实非常简单,文中代码较多只是因为我把官方的模板放上来了,实际上要写的代码只有三部分,代码量非常小的!如果不想看那 ...

  8. [STM32] STM32 移植 U8g2库

    文章目录 前言 1. 准备 2. 移植步骤 2.1 建立有效的通信 2.2 导入U8g2库 2.3 用例测试 总结 前言 开发平台:Keil + 标准库 硬件平台:STM32F103RCT6 显示器件 ...

  9. 海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-朱有鹏-专题视频课程...

    海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-143人已学习 课程介绍         本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块), ...

最新文章

  1. 三星对外发售高性能芯片,华为上升势头或受重击!
  2. 解决SSH连接出现 Software caused connection abort 的问题
  3. Xcode10新变化
  4. github中origin和upstream的区别(转)
  5. linux 块设备驱动 (三)块设备驱动开发
  6. Java学习笔记——面向对象
  7. Java统计文件行数
  8. php5.4连接mysql_PHP5.4+连MySQL数据库
  9. windows下封一些危险的端口
  10. linux系统安装snort,linux下SNORT安装.doc
  11. 【图像处理】基于matlab GUI数字图像处理平台【含Matlab源码 381期】
  12. windows 10和windows server 2016系统AD的administrator密码修改
  13. BCD码:8421码
  14. Oracle表添加时间字段(执行insert、update时,时间字段自动插入当前系统时间)
  15. 基础知识(HTML + CSS)整理
  16. 《Web安全之深度学习实战》笔记:第六章 垃圾邮件识别
  17. LPC1768 PWM单边沿触发
  18. 非递归实现二叉树结点的遍历
  19. 让人无法拒绝的内容种草营销
  20. Java Swing设置图标Icon

热门文章

  1. Educational Codeforces Round 124 (Rated for Div. 2)D. Nearest Excluded Points
  2. 一切都结束了,祝贺曼联夺得联赛冠军
  3. Win7+虚拟机OS X 10.8.5+Xcode4.6.3+越狱iPhone4+iOS5.1.1真机调试及生成ipa包
  4. 【第1170期】如何看待员工跳槽
  5. 利用支付宝Cookie监听订单实现个人支付宝收款实时回调
  6. 论文翻译:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation
  7. Android众多开源项目推荐
  8. linux od 命令16进制,Linux od命令
  9. 029 Rust死灵书之Vec实现Drop
  10. 动手改善Google PageSpeed