MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

这篇具有很好参考价值的文章主要介绍了MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2 OLED库的移植

1、U8g2简介

手头正好有一块0.96寸的OLED屏,驱动芯片为ssd1306,心想怎么才能显示更为炫彩的图像。无意间,接触到U8g2图形库,遂决定将其移植到自己的工程中。
U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。
github下载地址

2、准备工作

我这块屏是i2c接口的,u8g2即支持软件模拟i2c,也支持硬件i2c。之前的工程里关于PC6 PC7软硬件i2c都有适配,这里用模拟i2c,因为简单,bug少啊。
软件i2c pc6 pc7gpio的配置代码如下:

void BOARD_I2C1_Init(void)
{
#if I2C_MODE == USE_HARD_I2C    
    GPIO_Init_Type gpio_init;
    /* PC6 - I2C1_SCL. */
    gpio_init.Pins  = GPIO_PIN_6;
    gpio_init.PinMode  = GPIO_PinMode_AF_OpenDrain;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio_init);
    GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);

    /* PC7 - I2C1_SDA. */
    gpio_init.Pins  = GPIO_PIN_7;
    gpio_init.PinMode  = GPIO_PinMode_AF_OpenDrain;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio_init);
    GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);

    /* Setup I2C initialization values. */
    I2C_Master_Init_Type i2c_init;
    i2c_init.ClockFreqHz = CLOCK_APB1_FREQ;
    i2c_init.BaudRate = I2C_BaudRate_100K;

    /* Initialize I2C master. */
    I2C_InitMaster(I2C1, &i2c_init);

    /* The target device address needs to be configured before enabling. */
    I2C_SetTargetAddr(I2C1, MSA311_I2CADDR_DEFAULT_7);

    /* Enable I2C. */
    I2C_Enable(I2C1, true);

#elif I2C_MODE == USER_SW_I2C 
    GPIO_Init_Type gpio_init;
    gpio_init.Pins  = SWI2C1_SCL_PIN;
    gpio_init.PinMode  = GPIO_PinMode_Out_OpenDrain;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(SWI2C1_SCL_PORT, &gpio_init);
    GPIO_PinAFConf(SWI2C1_SCL_PORT, gpio_init.Pins, GPIO_AF_15); /* disable the alternative functions. */

    /* PC7 - I2C1_SDA. */
    gpio_init.Pins  = SWI2C1_SDA_PIN;
    gpio_init.PinMode  = GPIO_PinMode_Out_OpenDrain;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(SWI2C1_SDA_PORT, &gpio_init);
    GPIO_PinAFConf(SWI2C1_SDA_PORT, gpio_init.Pins, GPIO_AF_15); /* disable the alternative functions. */

    SWI2C1_SDA_HIGH; 
	SWI2C1_SCL_HIGH;
#endif    
}

.h文件

#define I2C_MODE        USER_SW_I2C

#if I2C_MODE == USER_SW_I2C
// PC6 scl PC7 sda
#define SWI2C1_SCL_PORT     GPIOC
#define SWI2C1_SCL_PIN      GPIO_PIN_6
#define SWI2C1_SCL_HIGH 	GPIO_WriteBit(SWI2C1_SCL_PORT,SWI2C1_SCL_PIN,1u)
#define SWI2C1_SCL_LOW 		GPIO_WriteBit(SWI2C1_SCL_PORT,SWI2C1_SCL_PIN,0u)

#define SWI2C1_SDA_PORT     GPIOC
#define SWI2C1_SDA_PIN      GPIO_PIN_7
#define SWI2C1_SDA_HIGH 	GPIO_WriteBit(SWI2C1_SDA_PORT,SWI2C1_SDA_PIN,1u)
#define SWI2C1_SDA_LOW		GPIO_WriteBit(SWI2C1_SDA_PORT,SWI2C1_SDA_PIN,0u)
#define SWI2C1_SDA_READ     GPIO_ReadInDataBit(SWI2C1_SDA_PORT,SWI2C1_SDA_PIN)
#define BIT0     0x01
#define BIT7     0x80
#endif

注意将gpio设置为开漏模式。

3、移植u8g2

将下载的u8g2解压,我们只需要csrc文件夹的文件,其余可以先不关注。
由于u8g2支持的驱动种类繁多,所以我们只需要找到我们对应的驱动文件即可。

a、我们的驱动芯片是ssd1306,128*64,所以我们对应的驱动文件为u8x8_d_ssd1306_128x64_noname.c,其余以u8xu8_d_xxx命名的文件都全部是删除掉。

删掉后的代码视图:
MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

b、精剪u8g2_d_setup.c文件,只保留u8g2_Setup_ssd1306_i2c_128x64_noname_f这一个函数。

如图:
MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

c、精剪u8g2_d_memory.c,因为u8g2_Setup_ssd1306_i2c_128x64_noname_f,只调用了u8g2_m_16_8_f函数,所以u8g2_d_memory.c只保留着一个函数。

如图:
MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

d、添加u8x8_gpio_and_delay函数,软件模拟i2c按照下面这样填充这个函数

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 seconds
            for (uint16_t n = 0; n < 320; n++)
                __NOP();
            break;
        case U8X8_MSG_DELAY_MILLI:   // delay arg_int * 1 milli second
            BOARD_Delay1Ms(1);
            break;
        case U8X8_MSG_DELAY_I2C:     // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
            BOARD_Delay1Us(3);
            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
            arg_int ? GPIO_WriteBit(SWI2C1_SCL_PORT,SWI2C1_SCL_PIN,1u) : GPIO_WriteBit(SWI2C1_SCL_PORT,SWI2C1_SCL_PIN,0u);  
            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
            arg_int ? GPIO_WriteBit(SWI2C1_SDA_PORT,SWI2C1_SDA_PIN,1u) : GPIO_WriteBit(SWI2C1_SDA_PORT,SWI2C1_SDA_PIN,0u);  
            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;
}

主要是延时函数,以及scl sda对应的gpio的控制。

e、最后将裁减的文件放到device/u8g2文件下,并在Makefile里添加u8g2的编译选项。

4、u8g2的使用

void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay);  // 初始化 u8g2 结构体
    u8g2_InitDisplay(u8g2); // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态
    u8g2_SetPowerSave(u8g2, 0); // 打开显示器
    u8g2_ClearBuffer(u8g2);
}

void draw(u8g2_t *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");
}

main函数调用:

// BOARD_InitPins();
	u8g2_t u8g2;
    u8g2Init(&u8g2);	

	while(1)
	{
		// Msa311_GetXYZData();
        // BOARD_Delay1Ms(1000);
		u8g2_FirstPage(&u8g2);
		do
		{
				draw(&u8g2);
		} while (u8g2_NextPage(&u8g2));
	}	

烧录后,可以看见u8g2官方的logo了。

5、现象

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

6、代码

移植好的代码文章来源地址https://www.toymoban.com/news/detail-493923.html

到了这里,关于MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F4移植STM32F4

    近期在项目中采用了GD32F407VET6替换原项目中的STM32F407VET6,网传GD的兼容性很好,之前也用F1系统的替换了一下,按照CSND各位大佬的经验一步步改进了代码,测试直接通过,现在也一直在项目中实际应用了,一直没有出问题。 所以这SMT时,嘉立创没有STM的货果断换成了GD,可换时

    2024年02月16日
    浏览(29)
  • [GD32F4]基于GD32固件库移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件库移植cherryusb[STM32F4] 使用开发板是淘宝买的不知名开发板,没什么好说的,具体的型号是GD32F450VET6。 使用的cherryusb版本是0.9.0版本。 使用的GD32官方固件库版本是:GD32F4xx_Firmware_Library_V3.0.4 cherryusb最牛的地方在于抛弃掉所有的依赖,只需要知道芯片的usb中断

    2024年02月06日
    浏览(25)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(29)
  • 【MT32F006】MT32F006之定时器延时

    本文最后修改时间:2023年03月30日 一、本节简介 本文介绍如何使用MT32F006的定时器做us、ms级的延时。 二、实验平台 库版本:V1.0.0 编译软件:MDK5.37 硬件平台:MT32F006开发板(主芯片MT32F006) 仿真器:JLINK 三、版权声明 1)作者:甜甜的大香瓜 2)声明:喝水不忘挖井人,转载

    2024年02月12日
    浏览(20)
  • GD32F470 移植STM32F429工程 Keil调试笔记

    keil版本:5.25 安装 GigaDevice.GD32F4xx_DFP.3.0.4.pack Keil.STM32F4xx_DFP.2.15.0.pack 1、原项目为STM32F429 工程,切换到GD32F470 只需在 Options for Target\\\"“对话框的Device菜单中选中“GD32F470II”,重新编译即可,一般不会有编译错误。 2、将项目工程在切换回STM32F429,在 Options for Target”\\\"对话框的D

    2024年02月09日
    浏览(23)
  • GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

    绘制一个gd32450的pcb板子,结果烧录程序后发生下面事情: 上电程序不能正常启动或者偶尔可以正常启动一次,很随机。 当上电后程序不启动的时候,我再按一下mcu的reset按键,程序就能正常启动了。 当我debug调试的时候,回回都能正常启动,根本定位不到问题 首先在板子里

    2023年04月08日
    浏览(29)
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 2023.12.09修改内容:打板后由于更换学习方向并未进行测试,所给原理图仅供参考,给出PDF下载链接,未设置积分和会员下载:https://download.csdn.net/download/m0_51294753/88611702。 一、前言 先前使用过的是STM32F1系列,只使用和绘制过STM32F103C8T6和STM32F103ZET6的板

    2023年04月24日
    浏览(19)
  • 航顺HK32F030M怎么样 航顺HK32F030M应用领域介绍

    航顺HK32F030M是一款基于ARM Cortex-M0+内核的32位微控制器,具有高性能、低功耗、经济适用等特点。以下是颖特新关于航顺HK32F030M的详细介绍: 一、性能表现 航顺HK32F030M采用ARM Cortex-M0+内核,主频最高可达64MHz,具有出色的计算能力和数据处理能力。其指令集简洁高效,易于编程

    2024年02月13日
    浏览(15)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(21)
  • 初识 STM32和STM32F407简介

    2007 年 6 月,ST 在北京发布了全球第一款基于 ARM Cortex M3 内核的 32 位通用微控制 器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣 惊人,一发不可收拾,截止到 2020 年 6 月,STM32 累计出货量超过 45 亿颗。 战舰开发板使用的 STM32F103ZET6

    2023年04月08日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包