MC3172移植U8g2单色图形库
简介
MC3172是厦门感芯科技发布的一款单核硬件64线程MCU,此芯片开发上手难度不高,与其他MCU裸机开发相似(可以把每一个线程当作一个MCU来使用)每个线程运行频率可自行设置。
U8g2是一个嵌入式单色图形库,非常容易移植与使用。
现在就先搬一下U8g2图形库,此次用的P屏幕为很常见的IIC接口SSD1306 0.96OLED,IDE使用官方例程所用MounRiverStudio。
下载U8g2
首先去GitHub下载最新的U8g2库
解压后保留移植必要源码 如图
进入csrc文件夹,保留本次移植屏幕驱动芯片所需驱动,删除其他芯片驱动文件(u8x8_d_*****类型的c文件为屏幕芯片驱动文件),删除完成后剩余文件如下图所示
开始移植
添加U8g2文件
在MC3172工程中新建一个U8g2文件夹,把csrc文件夹中精简后的.h与.c文件添加到u8g2文件夹中,在MounRiverStudio中添加头文件路径 如下图
添加回调函数
新建一个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保留如下,其余代码全部注释或删除
修改u8g2_d_memory.c保留如下,其余代码全部注释或删除
这个是给屏幕分配的显示buf大小*****noname_f为1024字节
MC3172为ramrun运行方式,代码空间与数据空间可以自由分配,线程栈可以分大一点点。
添加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用于点屏
线程内调用测试函数
//I2C OLED测试线程
void thread4_main(void)
{
U8g2Init();
while(1){
U8g2Test();
}
thread_end();
}
测试
点亮
总结
感芯科技推出的这款MC3172芯片可玩性非常高,上手也比较容易,目前有大佬在给他做HAL库,之后移植程序应该会更简单。
如有错误欢迎指出,看到后会及时修改。
完整代码
附几张开发板图片