这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【MAX32630FTHR开发板】血氧、心率监测仪

共1条 1/1 1 跳转至

【MAX32630FTHR开发板】血氧、心率监测仪

高工
2025-10-19 13:48:41     打赏

【前言】

最近拿到MAX32630FTHR开发板,结合一个国产的血氧传感器,读取他的血氧、心率。现分享如下。

【硬件】

1、MAX32630FTHR开发板

2、MKS血氧传感器

【开发环境】

MDK 5.41

【硬件连接】

MKS血氧传感器为串口接,因此项目使用到了开发板的两个串口,串口1做为Debug可,是通过DAPLINK外接出来的,串口2与MKS传器进行连接。

image.png

【串口初始化与读取】

debug传感,在官方的示例的SDK已经初始化了,主要描述串口2的初始化。

1、定义串口TX(P3_1)、RX(P3_0)结构体:

const gpio_cfg_t data_uart_rx = { PORT_3, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_INPUT };     
const gpio_cfg_t data_uart_tx = { PORT_3, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_INPUT };

2、对串口进行配置:

		GPIO_Config(&data_uart_tx);
		GPIO_Config(&data_uart_rx);

3、定义串口的结构体并进行配置:

const uart_cfg_t data_uart_cfg = {
    .parity = UART_PARITY_DISABLE,
    .size = UART_DATA_SIZE_8_BITS,
    .extra_stop = 0,
    .cts = 0,
    .rts = 0,
    .baud = 38400,
};
const sys_cfg_uart_t data_sys_cfg = {
    .clk_scale = CLKMAN_SCALE_AUTO,//CLKMAN_SCALE_DIV_4,
    .io_cfg = IOMAN_UART(DATA_UART, IOMAN_MAP_A, IOMAN_MAP_UNUSED, IOMAN_MAP_UNUSED, 1, 1, 1)
};

    if ((err = UART_Init(MXC_UART_GET_UART(2), &data_uart_cfg, &data_sys_cfg)) != E_NO_ERROR) {
        MXC_ASSERT_FAIL();
        return err;
    }		

4、串口2接收代码:

		while(MXC_UART2->rx_fifo_ctrl & MXC_F_UART_RX_FIFO_CTRL_FIFO_ENTRY)
		{
			data[state++] = MXC_UART2_FIFO->rx; 
		}

这个接收就是读取UART2的rxfio_ctrl的接收buff是否为空,如果不为空读取MXC_UART2_FIFO->rx,直到读取不为空为止。

【MKS传感器操作】

1、根据MKS的用户手册,他的串口波特率为38400,因此初始化串口为38440。

2、开始转换的命令为0x8A,串口发送0x8A即可开始传换。

3、停止转换的命令为0x88,串口发送0x88即可停止传换。

4、数据解析

这个传感每1.28秒转换一次数据,发送来的88个字节其意义如下:

image.png

因此我编写简单的解析函数如下:

void task_mks(void *pvParameters)
{
//	setupMksSensor();
	stopMksMeasurement();
	vTaskDelay(500);
	startMksMeasurement();
	LOG("startmks\r\n");
	int num= 0;
	uint8_t data[128] = {0};
	int len=1;
	int state;
	state = 0;
	uint8_t mks_heart_rate;
	while(1)
	{
		while(MXC_UART2->rx_fifo_ctrl & MXC_F_UART_RX_FIFO_CTRL_FIFO_ENTRY)
		{
			data[state++] = MXC_UART2_FIFO->rx; 
		}
		if(state>=88  && (data[0] == MKS_PACKET_HEADER))
		{
					// 心率 (规格书第66字节 -> 缓冲区下标 65) [source: 27]
					mks_heart_rate = data[MKS_HR_INDEX];
					// 血氧 (规格书第67字节 -> 缓冲区下标 66) [source: 27]
					mks_spo2 = data[MKS_SPO2_INDEX];

					// --- 解析完成 ---
					mks_new_data_flag = true;  // 设置新数据标志,通知 UI 更新
					// 可选:打印解析的数据用于调试
					printf("MKS Parsed: HR=%d, SpO2=%d\n", mks_heart_rate, mks_spo2);

					// 每次调用只处理一个完整的数据包,避免长时间阻塞主循环
				 state = 0;
			}
	vTaskDelay(5);
	}
	
}

【效果展示】

image.png

可以看到检测到的数据还是比较稳定的。




关键词: MAX32630FTHR     血氧     心率    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]