感芯科技MC3172移植U8g2图形库

MC3172移植U8g2单色图形库

简介

MC3172是厦门感芯科技发布的一款单核硬件64线程MCU,此芯片开发上手难度不高,与其他MCU裸机开发相似(可以把每一个线程当作一个MCU来使用)每个线程运行频率可自行设置。
U8g2是一个嵌入式单色图形库,非常容易移植与使用。
现在就先搬一下U8g2图形库,此次用的P屏幕为很常见的IIC接口SSD1306 0.96OLED,IDE使用官方例程所用MounRiverStudio。

下载U8g2

首先去GitHub下载最新的U8g2
解压后保留移植必要源码 如图
01.png
进入csrc文件夹,保留本次移植屏幕驱动芯片所需驱动,删除其他芯片驱动文件(u8x8_d_*****类型的c文件为屏幕芯片驱动文件),删除完成后剩余文件如下图所示
02.png

开始移植

添加U8g2文件

在MC3172工程中新建一个U8g2文件夹,把csrc文件夹中精简后的.h与.c文件添加到u8g2文件夹中,在MounRiverStudio中添加头文件路径 如下图
03.png

添加回调函数

新建一个oled.c与一个oled.h文件
在oled.c文件中添加U8g2所需的IIC通信与延时回调函数,可参考U8g2官方给出的硬件I2C代码。
代码如下:
I2C通信回调函数

uint8_t u8x8_byte_mc3172_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_START_TRANSFER:
          buf_idx = 0;
        break;

        case U8X8_MSG_BYTE_END_TRANSFER:
            HW_I2cWrite(buffer,buf_idx);//此处添加硬件I2C通信接口,函数实现在本文下面
        break;

        default:
          return 0;
    }
    return 1;
}  

延时回调函数

uint8_t u8g2_gpio_and_delay_mc3172(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:
            delay_ms(arg_int);  //此处添加MC3172的ms延时函数
            break;

        case U8X8_MSG_GPIO_I2C_CLOCK:
            break;

        case U8X8_MSG_GPIO_I2C_DATA:
            break;

        default:
            return 0;
    }
    return 1; // command processed successfully.
}

模拟U8g2硬件I2C通信

因为MC3172并没有硬件I2C,所以用IO模拟一个就好了

初始化软件I2C所用的IO

此处所用的软件i2c是之前写好的,直接拿来用了,详情可参考MC3172论坛
MC3172使用IO模拟I2C来读取AHT10和BH1750

I2C_InitTypeDef OLED_init;
//初始化i2c引脚
void OLED_i2c_init(void){
    OLED_init.SDA_Port=GPIOC_BASE_ADDR;
    OLED_init.SDA_Pin=GPIO_PIN1;
    OLED_init.SCL_Port=GPIOC_BASE_ADDR;
    OLED_init.SCL_Pin=GPIO_PIN0;
    i2c_init(&OLED_init);
}

模拟硬件I2C的通信

void HW_I2cWrite(uint8_t *buf,uint8_t len)
{
    if(len<=0)
        return ;
    i2c_start(&OLED_init);
    i2c_send_byte(&OLED_init, OLED_ADDRESS);
    i2c_wait_ack(&OLED_init);
    for(uint8_t i=0;i<len;i++)
    {
        i2c_send_byte(&OLED_init, buf[i]);
        i2c_wait_ack(&OLED_init);
    }
    i2c_stop(&OLED_init);
}

最后把函数添加到上面回调函数中即可
oled.h头文件中内容如下

#ifndef __OLED_H
#define __OLED_H

#include "MC3172.h"

#define USE_HORIZONTAL 0

#define OLED_ADDRESS 0x78   //7位地址

#define OLED_WriteCom_Addr  0x00    //从机写指令地址
#define OLED_WriteData_Addr 0x40    //从机写数据地址

#define OLED_CMD  0 //写命令
#define OLED_DATA 1 //写数据

void OLED_i2c_init(void);


void U8g2Init(void);
void U8g2Test(void);


#endif  /* __OLED_H */

精简u8g2源码

u8g2源码中包含了许多其它屏幕IC的初始化代码,此处为了节省flash空间需要删除掉。
最后保留如下图所示
修改u8g2_d_setup.c保留如下,其余代码全部注释或删除
04.png
修改u8g2_d_memory.c保留如下,其余代码全部注释或删除
这个是给屏幕分配的显示buf大小*****noname_f为1024字节
MC3172为ramrun运行方式,代码空间与数据空间可以自由分配,线程栈可以分大一点点。
05.png

添加U8g2初始化函数

static u8g2_t u8g2;
void U8g2Init(void)
{

    OLED_i2c_init();
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_mc3172_hw_i2c,u8g2_gpio_and_delay_mc3172);//初始化U8g2分配buf
    u8g2_InitDisplay(&u8g2); // 初始化屏幕驱动芯片
    u8g2_SetPowerSave(&u8g2, 0); // 启动显示
}

添加测试函数

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");
}
void U8g2Test(void)
{
    u8g2_FirstPage(&u8g2);
    do{
        draw(&u8g2);
    } while (u8g2_NextPage(&u8g2));
}

MC3172分配线程

因为我的开发板外挂了有源200M晶振所以我在此选用外部有源晶振。
开发板默认自带48M无源晶振,内部高速RC振荡器为192M,无外部有源晶振可选这两个。
此处分配线程4用于点屏
06.png
线程内调用测试函数

//I2C OLED测试线程
void thread4_main(void)
{
    U8g2Init();
    while(1){
        U8g2Test();
    }
    thread_end();
}

测试

点亮
IMG_20220816_210129.jpg

总结

感芯科技推出的这款MC3172芯片可玩性非常高,上手也比较容易,目前有大佬在给他做HAL库,之后移植程序应该会更简单。
如有错误欢迎指出,看到后会及时修改。
完整代码
附几张开发板图片
QQ图片20220827135034.jpg
IMG_20220825_084238.jpg
IMG_20220801_183540.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kongbai_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值