if_temp.h
#ifndef __IF_TEMP_H
#define __IF_TEMP_H
#include "./SYSTEM/delay/delay.h"
#include <string.h>
#include "./SYSTEM/sys/sys.h"
void IR_Temp_Init(uint32_t baudrate);
float IR_Temp_Get_Temperature(void);
float get_temp(void);
void USART2_SendData(uint8_t data);
void USART2_SendString(uint8_t *data, uint16_t len);
#endif
if_temp.c
#include "./SYSTEM/sys/sys.h"
#include "./BSP/if_temp/if_temp.h"
#include "./SYSTEM/delay/delay.h"
#include <string.h>
#define USART2_RX_BUFFER_SIZE 256
#define TEMP_DATA_LENGTH 11
UART_HandleTypeDef huart2;
uint8_t rx_Buffer[USART2_RX_BUFFER_SIZE];
uint16_t rxIndex = 0;
float temperature = 0.0f;
uint8_t recv_data[TEMP_DATA_LENGTH];
volatile uint8_t reception_complete = 0;
void IR_Temp_Init(uint32_t baudrate) {
// 使能USART2和GPIOA时钟
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置UART
huart2.Instance = USART2;
huart2.Init.BaudRate = baudrate;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&huart2) != HAL_OK) {
// Error_Handler();
}
// 配置NVIC
HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
// 使能接收中断和空闲中断
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
uint8_t init_cmd[] = {0xAA, 0xA5, 0x04, 0x05, 0x01, 0x0A, 0x55};
USART2_SendString(init_cmd, sizeof(init_cmd));
delay_ms(500);
uint8_t temp_cmd[] = {0xAA, 0xA5, 0x04, 0x02, 0x02, 0x08, 0x55};
USART2_SendString(temp_cmd, sizeof(temp_cmd));
}
void USART2_SendData(uint8_t data)
{
while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) == RESET);
huart2.Instance->DR = data;
}
void USART2_SendString(uint8_t *data, uint16_t len)
{
for(uint16_t i = 0; i < len; i++)
{
USART2_SendData(data[i]);
}
}
float get_temp(void)
{
static float last_valid_temperature = 0.0f; // 静态变量,保存最后一次有效的温度读数
uint8_t send_data[] = {0xAA, 0xA5, 0x03, 0x01, 0x04, 0x55};
// char debug_info[50];
// 清空接收缓冲区和重置接收索引
rxIndex = 0;
memset(rx_Buffer, 0, USART2_RX_BUFFER_SIZE);
reception_complete = 0;
// 发送数据
USART2_SendString(send_data, sizeof(send_data));
// 等待接收完成或超时
uint32_t timeout = HAL_GetTick() + 1000; // 1秒超时
while (!reception_complete && HAL_GetTick() < timeout) {
// 等待接收完成
}
if (reception_complete)
// 解析温度数据
if (rx_Buffer[0] == 0xAA && rx_Buffer[1] == 0xA5)
{
uint16_t temp_raw = (rx_Buffer[5] << 8) | rx_Buffer[6];
float new_temperature = temp_raw / 10.0f;
// 只有当新温度有效(大于0)时才更新 last_valid_temperature
if (new_temperature > 0) {
last_valid_temperature = new_temperature;
}
else
{
}
}
else
{
}
return last_valid_temperature; // 始终返回最后一次有效的温度读数
}
// USART2中断服务函数
void USART2_IRQHandler(void)
{
uint8_t res;
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)
{
res = (uint8_t)(huart2.Instance->DR & 0xFF);
if(rxIndex < USART2_RX_BUFFER_SIZE - 1)
{
rx_Buffer[rxIndex++] = res;
if (rxIndex >= 11) // 假设我们期望接收11个字节
{
reception_complete = 1;
}
}
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
}
// 处理空闲中断
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
reception_complete = 1; // 标记接收完成
}
// 处理溢出错误
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE);
res = huart2.Instance->DR; // 读取DR寄存器清除错误标志
}
}
关注我
GitHub
:https://github.com/PastKing
Gitee
:https://gitee.com/past-dust
公众号:
© 版权声明
THE END
暂无评论内容