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

2.配置DMA

3.开启中断

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;
}
#endif5.串口通信
//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))


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


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

4.软件设计

5.实物演示

我要赚赏金
