驱动引脚的修改方式
SDK比较冗杂,如果不能获取原厂支持的话,建议还是使用KEIL开发驱动,.lib进行链接相对更友好一些。

优先讲解一下驱动管脚的修改位置:
①在gh_demo.c里面找到这个初始化函数入口int Gh3x2xDemoInit(void):

②往下翻找到这个hal层SPI注册函数;

③在gh_demo_user.c里面gh_spi_params这个结构体;

④跳转再跳转;

⑤找到这个配置IO的头文件
(middleware\gh3220\3-demo_code\demo_kernel_code\kernel\gh_demo_io_config.h)就快了;

⑥最后一跳;

⑦可以开始按照原理图连接修改了。

配置数组生成方法
①打开GHTool,点击load加载配置;

②推荐V420版本,使用最简单的一个HR_ADT_V4200配置;

③点击Wizard进入配置页面;

④从LED CONFIG开始配置,先把默认的删除,然后按照自己原理图的实际连接设置。

以我的这个为例,LED3控制可见红光,LED0控制IR,LED6和LED2控制可见绿光。

注意LEDx都是GH3220的Pin脚通道。

同一种颜色的灯一起勾选,然后点击ADD。

注意这是逻辑灯,不是物理灯,同一个颜色的灯只需要添加一次。
⑤现在配置PD,我这里使用了两个PD,第一次把第一行的Rx0 Usage从false改为true,然后点击add;第二次把第一行的RX0 Usage改为false,然后把第二行的RX0 Usage(实则为RX1,上位机有UI错误)改为true然后添加。如果你想两个一起用,也可也同时打开TRUE。

⑥下面配置SLOT,前言:心率用绿灯,血氧用红灯和红外,佩戴检测和活体检测都是红外。

注意1个PD在1个SLOT当中只能用1次!
然后右击第一个·SLOT里面的LED方框,选择check config info,

把两个灯的AGC Type都选上。

⑦分配功能到不同的SLOT之上,然后点击CONFIG。

⑧注意先SAVE再LOAD新配置,然后在txt里面拉到最后面找到这两个数组。

⑨修改SDK里面的数组,第一处:

第二处:

驱动代码示例(主控芯片GR5525):
cpp
#include "app_ble.h"
#include "app_flash.h"
#include "app_gsensor.h"
#include "app_log.h"
#include "app_spp.h"
#include "bsp_flash.h"
#include "bsp_icm42607p.h"
#include "bsp_led.h"
#include "bsp_log.h"
#include "bsp_nst117.h"
#include "bsp_rtc.h"
#include "gh_demo.h"
#include "gh_demo_config.h"
#include "gh_demo_inner.h"
#include "gh_drv.h"
STACK_HEAP_INIT(g_ble_heap_table);
static const uint8_t s_bd_addr[SYS_BD_ADDR_LEN] = {0x13, 0x00, 0xcf,
0x3e, 0xcb, 0xea};
extern GU8 g_uchGh3x2xIntCallBackIsCalled;
uint8_t spp_buf[247];
int main(void)
{
int16_t temp;
float accelx, accely, accelz;
uint16_t len;
SYS_SET_BD_ADDR(s_bd_addr);
// BSP_LED_Init();
BSP_Log_Init();
BSP_RTC_Init();
BSP_NST117_Init();
BSP_ICM42607P_I2C_Init();
BSP_Flash_Init();
APP_GSENSOR_Init();
ble_stack_init(APP_BLE_EvtHandler, &g_ble_heap_table);
APP_BLE_SPP_Init();
app_io_init_t io_init = {.mode = APP_IO_MODE_OUTPUT,
.mux = APP_IO_MUX_8,
.pin = APP_IO_PIN_0,
.pull = APP_IO_NOPULL};
app_io_init(APP_IO_TYPE_AON, &io_init);
app_io_write_pin(APP_IO_TYPE_AON, APP_IO_PIN_0, APP_IO_PIN_SET);
int gh3220_ret = Gh3x2xDemoInit();
if (gh3220_ret == GH3X2X_RET_OK)
{
Gh3x2xDemoStartSampling(GH3X2X_FUNCTION_HR);
}
else
{
APP_LOG_ERROR("GH3220 init failed: %d; sampling not started", gh3220_ret);
}
APP_LOG_INFO("Start Loop...");
delay_ms(1000);
while (1)
{
// temp = BSP_NST117_GetTempX100();
// accelx = APP_GSENSOR_ReadAccelX();
// accely = APP_GSENSOR_ReadAccelY();
// accelz = APP_GSENSOR_ReadAccelZ();
// sprintf(spp_buf, "T:%d Accel: %.2f %.2f %.2f\r\n", temp, accelx, accely,
// accelz);
// len = strlen(spp_buf);
// APP_BLE_SPP_Send(spp_buf, len);
// APP_LOG_INFO("%s", spp_buf);
if (g_uchGh3x2xIntCallBackIsCalled == 1)
{
Gh3x2xDemoInterruptProcess();
}
// delay_ms(2000);
}
}