这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【STM32Nucleo-64开发板】-完成帖---生命体征检测系统

共6条 1/1 1 跳转至

【STM32Nucleo-64开发板】-完成帖---生命体征检测系统

工程师
2023-03-14 10:34:17     打赏
串口通信

选择板子进入工程,LPUART1  是连接link的串口,不用管,直接默认就配置好了,可以用来打印调试信息。本次使用的是串口3(USART3) mode选择Asynchronous,默认波特率115200,可以不进行更改。

image-20230313212006982.png

2.配置DMA

image-20230314090520880.png

3.开启中断

image-20230314090710533.png


4.生成keil工程,打开工程,打开usart.c对printf充定向

#include <stdio.h>


//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  
	return ch;
}
#endif

5.串口通信

//UART结构体定义
UART_HandleTypeDef huart1;
//串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收
//串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

    
/*******中断回调函数************/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}

6.main.c函数配置

// main函数外部 添加以下代码
#define LENGTH 8     //接受缓冲区大小
uint8_t	RxBuffer[LENGTH];   //接受缓冲区 
uint8_t RxFlag = 0;       //接收完成标志;0表示接受未完成,1表示接收完成

//在main函数内部,while循环外部添加以下代码
//发送提示信息
uint8_t message1[]="****UART commucition using IDLE IT DMA****\n";
uint8_t message2[]="Please enter 8 characters: \n";
HAL_UART_Transmit(&huart1,(uint8_t *)message1,sizeof(message1),HAL_MAX_DELAY);
HAL_UART_Transmit(&huart1,(uint8_t *)message2,sizeof(message2),HAL_MAX_DELAY);
//使能DMA接收中断
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);
//在while循环内部添加一下代码
while (1)
  {
    /* USER CODE END WHILE */
   
    /* USER CODE BEGIN 3 */
     //添加下面代码
   HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"hello windows!\n", 15 );
	HAL_Delay(1000);  //延时1s
	if(RxFlag == 1)  //如果接受完成,不在发送数据
	{
			HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Recevie Success!\n",17);  //提示接受成功
			break;  //退出循环,不在发送数据
	}
  }
//在main函数后面,添加中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //串口接收中断回调函数
{
	if(huart->Instance == USART1)   //判断发生接收中断的串口
	{
		RxFlag=1;   //置为接收完成标志
        //DMA使能接收中断  这个必须添加,否则不能再使用DMA进行发送接受
		HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);
	}
}

编译,将程序烧录或下载进核心板,打开串口助手查看接收到的数据。


生命体征检测系统

实时检测血压、血氧、心率、微循环、生命体征监测模块具有脉搏波形,可直接输出心率值、血氧值、血压值、微循环、疲劳值等7项数据。一体化集成红光红外光双LED可用于血氧测量。宽光谱高灵敏度的光传感器。11.18*8.13mm超小体积。超低工作功耗。模块特有的信号调理技术和算法,直接输出脉搏波形、心率值等参数,大大降低了系统复杂程度。

淘宝链接(生命体征监测模块,实时检测血压、血氧、心率、微循环,手环可用-淘宝网 (taobao.com))

1678760469837541.pngimage-20230313234215523.png

2.指令数据。指令数据里面的指令可分为三类:采集指令、体检指令和休眠指令。采集指令用来控制模块采集并回传人体的健康信息,可以打开或者关闭采集功能。模块需要首先发采集指 令才可以工作休眠指令可让模块进入低功耗的状态,减少电量的消耗。退出休眠的指令为0x00(注意:发送其他指令也 可以唤醒休眠的模块,但是可能会导致模块工作异常)。

image-20230313234305482.pngimage-20230313234314842.png

3.数据包分析,模块收到采集开指令后,每64个采样点(1.28s)传输一次,每包88个字节。实时包以0xFF打头,数据包 中不会出现其他0xFF数据。数据acdata[64]可用于绘制心律波形

image-20230313234350540.png


4.软件设计

image-20230314091534017.png

5.实物演示

image-20230314091805926.png






高工
2023-03-14 12:37:39     打赏
2楼

感谢楼主的分享,很实用了。


高工
2023-03-14 13:04:51     打赏
3楼

感谢楼主的分享


高工
2023-03-14 16:17:47     打赏
4楼
【STM32Nucleo-64开发板】-完成帖---生命体征检测系统



助工
2023-03-17 14:20:08     打赏
5楼

感谢楼主的分享,很实用了。


工程师
2023-04-07 18:02:33     打赏
6楼

妙啊,兄弟,感谢分享


共6条 1/1 1 跳转至

回复

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