/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "i2c.h" #include "tim.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "oled.h" #incl
时间: 2025-05-26 20:24:52 浏览: 40
### STM32 Main.c 中 ADC、I2C、TIM、USART、GPIO 和 OLED 的常见配置问题
在开发基于 STM32 的嵌入式项目时,`main.c` 文件通常是程序的核心部分。以下是关于 `ADC`、`I2C`、`TIM`、`USART`、`GPIO` 和 `OLED` 常见的配置问题及其可能的原因分析。
#### 1. **ADC 配置问题**
- 如果未正确初始化 ADC 或者未使能相应的时钟,则可能导致无法读取正确的数据。
- 可能忘记设置通道数或者采样时间不足,影响精度。
- 使用外部触发模式时,如果触发源配置错误,可能会导致 ADC 不启动转换。
```c
Adc_Init(); // 初始化函数调用前需确认是否已包含必要的头文件并声明全局变量[^1]
u16 adc_value = Get_Adc(CHANNEL_NUMBER); // 获取指定通道的 ADC 值
```
#### 2. **I2C 配置问题**
- I2C 外设时钟未开启或 SCL/SDA 引脚未正确配置为开漏输出模式。
- ACK 模式未启用,这会影响从设备地址匹配失败的情况。
- 数据传输速率过高,超出目标外设支持的最大频率。
```c
void I2C_Config() {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SDA/SCL pins
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_ClockSpeed = 100000; // 设置波特率
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = 0x00;
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &I2C_InitStruct);
}
```
#### 3. **TIM 定时器配置问题**
- 定时器计数值 (`ARR`) 和分频系数 (`PSC`) 计算有误,导致实际定时周期不符合预期。
- 更新事件中断未使能,从而无法响应定时完成信号。
```c
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Period = ARR_VALUE; // 自动重装载寄存器值
TIM_InitStruct.TIM_Prescaler = PSC_VALUE; // 分频系数
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_Cmd(TIM2, ENABLE);
```
#### 4. **USART 配置问题**
- 波特率计算不准确,通信双方不同步。
- USART 发送接收缓冲区未清零即重复操作,造成数据覆盖或丢失。
```c
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = BAUD_RATE; // 设定波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStruct);
```
#### 5. **GPIO 配置问题**
- 错误地选择了输入输出模式 (推挽 vs 开漏),导致电平逻辑不符设计需求。
- 忽视了上下拉电阻的作用,在浮空状态下容易引入干扰噪声。
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_PIN_X;
GPIO_InitStruct.GPIO_Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init(GPIO_PORTX, &GPIO_InitStruct);
```
#### 6. **OLED 显示屏驱动问题**
- SSD1306 控制指令序列发送顺序不当,屏幕显示异常甚至全黑。
- 缓冲区大小设定不合理,越界访问引发不可预测行为。
```c
// 刷新整个显示屏内容至硬件帧缓存
for(int y=0;y<SCREEN_HEIGHT;y++) {
for(int x=0;x<(SCREEN_WIDTH/8);x++) {
SendDataToSSD1306(buffer[x][y]);
}
}
```
---
###
阅读全文
相关推荐
















