之前一直使用keil开发单片机,主要以stm32为主。借着这次活动,想接触一下开源工具链的使用。搜索了下相关博客和视频,最后决定先采用VSCODE进行开发。好在本次活动提供的开发工具例程中就可以直接使用VSCODE,省去了不少学习成本。
首先进行OLED的移植。在移植过程中,遇见了一个大坑,排查了几个小时,把所有代码写完后,发现OLED无论如何都不亮,中间排查了上拉电阻,信号波形,电源供电,导通性等等,最后发现是杜邦线接触不好,太松了。后来把杜邦线的头弄紧了以后就好了。这种接插件的可靠性太差了,还是要买质量好的,或者换一种连接可靠的方式才行。
OLED的移植我是参考【分享开发笔记,赚取电动螺丝刀】移植U8g2到MAX78000开发板,使用模拟i2c-电子产品世界论坛,这篇帖子,不一样的地方我贴在下面,供参考。这里用的是模拟IIC,P2.3和2.4引脚。因为是用3.3V电平驱动OLED,所以这里要改为VDDIOH。
#include "mxc_device.h" #include "mxc_delay.h" #include "gpio.h" #include "u8g2.h" #include "u8x8.h" #include "asc.h" #include "max78000_u8g2.h" void IIC_Init(void) { mxc_gpio_cfg_t gpio_out; /* Setup output pin. */ gpio_out.port = MXC_GPIO_PORT_SDA; gpio_out.mask = MXC_GPIO_PIN_SDA; gpio_out.pad = MXC_GPIO_PAD_NONE; gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH; gpio_out.drvstr=MXC_GPIO_DRVSTR_0; gpio_out.func = MXC_GPIO_FUNC_OUT; MXC_GPIO_Config(&gpio_out); gpio_out.port = MXC_GPIO_PORT_SCL; gpio_out.mask = MXC_GPIO_PIN_SCL; gpio_out.pad = MXC_GPIO_PAD_NONE; gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH; gpio_out.drvstr=MXC_GPIO_DRVSTR_0; gpio_out.func = MXC_GPIO_FUNC_OUT; MXC_GPIO_Config(&gpio_out); } 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 MXC_Delay(10); break; case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second break; case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz /* arg_int is 1 or 4: 100KHz (5us) or 400KHz (1.25us) */ MXC_Delay(5); //微秒延时 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 if(arg_int == 0) { //MXC_GPIO_OutSet(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL); // 高电平 MXC_GPIO_OutClr(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL); // 低电平 } else if(arg_int == 1){ MXC_GPIO_OutSet(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL); // 高电平 //MXC_GPIO_OutClr(MXC_GPIO_PORT_SCL, MXC_GPIO_PIN_SCL); // 低电平 } 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 if(arg_int == 0) { //MXC_GPIO_OutSet(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA); // 高电平 MXC_GPIO_OutClr(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA); // 低电平 } else if(arg_int == 1){ MXC_GPIO_OutSet(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA); // 高电平 //MXC_GPIO_OutClr(MXC_GPIO_PORT_SDA, MXC_GPIO_PIN_SDA); // 低电平 } 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; } void u8g2Init(u8g2_t *u8g2) { u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay); u8g2_InitDisplay(u8g2); u8g2_SetPowerSave(u8g2, 0); u8g2_ClearBuffer(u8g2); u8g2_SetFontMode(u8g2, 1); u8g2_SetFontDirection(u8g2, 0); u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf); } /***** Includes *****/ #include <stdio.h> #include <stdint.h> #include <string.h> #include "board.h" #include "mxc_device.h" #include "mxc_delay.h" #include "max7800_u8g2.h" #include "nvic_table.h" #include "pb.h" #include "gpio.h" #include "u8g2.h" /***** Definitions *****/ #define MXC_GPIO_PORT_OUT MXC_GPIO2 #define MXC_GPIO_PIN_OUT MXC_GPIO_PIN_0 /***** Globals *****/ /***** Functions *****/ u8g2_t u8g2; int main(void) { mxc_gpio_cfg_t gpio_out; MXC_Delay(1000000); IIC_Init(); //Init I2C pins u8g2Init(&u8g2); draw(&u8g2); /* Setup output pin. */ gpio_out.port = MXC_GPIO_PORT_OUT; gpio_out.mask = MXC_GPIO_PIN_OUT; gpio_out.pad = MXC_GPIO_PAD_NONE; gpio_out.func = MXC_GPIO_FUNC_OUT; MXC_GPIO_Config(&gpio_out); //u8g2_SetFont(&u8g2, u8g2_font_smart_patrol_nbp_tr); u8g2_ClearBuffer(&u8g2); u8g2_SetFontRefHeightText(&u8g2); u8g2_SetFontPosTop(&u8g2); u8g2_DrawStr(&u8g2, 0, 30, "u8g2 Soft I2C"); u8g2_SendBuffer(&u8g2); //draw(&u8g2); while (1) { MXC_GPIO_OutSet(gpio_out.port, gpio_out.mask); MXC_Delay(5000000); MXC_GPIO_OutClr(gpio_out.port, gpio_out.mask); MXC_Delay(5000000); } return 0; }
max30102驱动资源比较多,这里就不在展示了。这里做了一个转接板,手指放上去后实现了原始数据的读取。
后面就是算法的处理和后续OLED数据显示的工作了,期待成果贴吧!