STM32F407是STM32系列中一款功能强大的微控制器,广泛应用于嵌入式领域。本文将基于STM32F407,构建一个串口通信和温度监测的系统,通过串口发送温度数据,并通过简单的命令控制LED状态。
一、项目目标- 使用STM32F407的ADC采集温度传感器数据。
- 通过USART将采集的数据发送到PC端。
- 接收PC端命令控制开发板上的LED。
二、硬件资源- STM32F407开发板
- LM35温度传感器(模拟信号输出)
- USB转TTL模块(用于串口通信)
- LED灯及限流电阻
三、开发环境- STM32CubeIDE
- STM32CubeMX(用于生成初始化代码)
- 串口调试工具(如Docklight或SSCOM)
四、代码实现以下是核心代码部分:
#include "main.h"
#include <stdio.h>
ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart2;
uint16_t adc_value;
char uart_buffer[50];
/* 初始化ADC */
void MX_ADC1_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* 初始化USART */
void MX_USART2_UART_Init(void) {
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart2);
}
/* 读取ADC值并转换为温度 */
float Read_Temperature(void) {
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
adc_value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return (adc_value * 3.3 / 4096) * 100; // 假设LM35输出10mV/°C
}
/* 主函数 */
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();
float temperature;
while (1) {
/* 获取温度值 */
temperature = Read_Temperature();
/* 通过USART发送温度数据 */
sprintf(uart_buffer, "Temperature: %.2f C\r\n", temperature);
HAL_UART_Transmit(&huart2, (uint8_t*)uart_buffer, strlen(uart_buffer), HAL_MAX_DELAY);
/* 接收命令并控制LED */
uint8_t received_char;
if (HAL_UART_Receive(&huart2, &received_char, 1, 100) == HAL_OK) {
if (received_char == '1') {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 打开LED
} else if (received_char == '0') {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭LED
}
}
HAL_Delay(1000);
}
}
五、代码解读- ADC采集温度
使用STM32F407的ADC模块读取LM35的输出电压,并根据电压计算温度。
- USART通信
使用USART2与PC端进行通信,实现数据发送和命令接收。
- LED控制
接收PC端发送的命令,控制LED的开关状态。
- 优化点
可以增加错误处理,例如检测ADC转换失败或串口超时。
六、硬件连接- 将LM35的输出连接到ADC输入通道(如PA0)。
- USB转TTL模块的TX和RX分别连接到USART2的RX和TX。
- LED正极接到GPIO输出引脚(如PA5),负极接地。
七、测试步骤- 配置STM32CubeMX生成基础初始化代码。
- 将代码导入STM32CubeIDE,复制并粘贴上述代码。
- 编译并烧录到STM32F407开发板。
- 打开串口调试工具,设置波特率9600。
- 检查温度数据输出,并尝试发送命令控制LED。
|