之前一直使用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数据显示的工作了,期待成果贴吧!
我要赚赏金
