选择板子进入工程,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; } #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))
2.指令数据。指令数据里面的指令可分为三类:采集指令、体检指令和休眠指令。采集指令用来控制模块采集并回传人体的健康信息,可以打开或者关闭采集功能。模块需要首先发采集指 令才可以工作休眠指令可让模块进入低功耗的状态,减少电量的消耗。退出休眠的指令为0x00(注意:发送其他指令也 可以唤醒休眠的模块,但是可能会导致模块工作异常)。
3.数据包分析,模块收到采集开指令后,每64个采样点(1.28s)传输一次,每包88个字节。实时包以0xFF打头,数据包 中不会出现其他0xFF数据。数据acdata[64]可用于绘制心律波形
4.软件设计
5.实物演示