分开写详细程序,目标是用STM32F103ZET6来检测信号,拥有4G模块PB10TX ,PB11RX,SD卡模块PC8-PC12,PD2,四针OLED显示模块PG6SCL,PG8SDA,开关量信号检测PD0-PD15,电流电压检测PA1-PA7,PC0-PC2,最后显示屏显示16个开关量与10个电压电流量,PA0为唤醒按钮,pG13与pG14分别为oled向上滚动与向下滚动一行
时间: 2025-06-23 19:19:30 浏览: 15
<think>嗯,用户想用STM32F103ZET6来检测信号,涉及到4G模块、SD卡、OLED显示、开关量和电流电压检测,还有唤醒按钮和滚动控制。首先,我需要理清楚各个外设的连接和配置。
首先,4G模块用的是PB10和PB11,应该是UART3,因为STM32F103的UART3_TX是PB10,RX是PB11,对吧?那这部分需要配置UART3,设置合适的波特率,比如115200,然后初始化GPIO。可能需要用中断或者DMA来接收数据,确保数据不丢失。
然后是SD卡模块,连接在PC8到PC12,还有PD2。SD卡通常使用SDIO接口,但STM32F103的SDIO接口是固定在PC8-PC12和PD2,所以应该用SDIO模式。需要配置SDIO的时钟和GPIO,使用DMA传输提高效率。不过要注意FATFS文件系统的移植,可能需要用到SPI模式,但用户给出的引脚是SDIO的,所以应该按SDIO来配置。
OLED显示模块是四针的,但用户只提到了PG6(SCL)和PG8(SDA),应该是I2C接口。四针的可能还包括电源和地,但这里只需要关注I2C的两个引脚。需要配置I2C的GPIO,可能用软件I2C或者硬件I2C,STM32F103的硬件I2C是I2C1或I2C2,但PG6和PG8可能不是硬件I2C的引脚,所以可能需要模拟I2C。需要确认引脚是否支持开漏输出,并加上上拉电阻。
开关量检测是PD0到PD15,共16个引脚。这些应该配置为输入模式,带上拉或下拉电阻,根据外部电路决定。可能需要去抖动处理,软件滤波或者在中断中处理,比如用外部中断触发,但16个引脚可能只能用轮询方式,因为外部中断的通道有限。
电流电压检测用了PA1-PA7,PC0-PC2,共10个模拟输入。需要配置ADC,STM32F103有多个ADC通道,可以分组扫描。PA0是唤醒按钮,应该配置为EXTI唤醒源,当系统处于低功耗模式时,按下PA0可以唤醒。
OLED的滚动控制是PG13和PG14,作为上下滚动按钮。这两个引脚需要配置为输入,并启用外部中断,当按下时触发中断,修改显示内容的起始行。
接下来是整体程序结构。主函数初始化各个外设,进入低功耗模式,等待PA0唤醒。唤醒后,初始化OLED,开始检测开关量和模拟量,并显示。需要处理OLED的滚动,可能需要一个显示缓冲区和当前显示行的变量,根据PG13和PG14的中断来调整显示的起始行。
需要注意ADC的采样速率,10个通道可能需要多通道扫描,DMA传输。同时,SD卡的数据存储可能需要定时保存,或者当数据达到一定量时写入。4G模块需要定时发送数据,或者响应远程指令,这部分可能需要AT命令的解析和处理。
可能遇到的问题包括GPIO配置冲突,比如某些引脚复用了其他功能,或者中断资源不足。需要仔细检查数据手册,确认每个引脚的功能和复用情况。另外,电源管理部分,如何进入和退出低功耗模式,需要正确配置时钟和唤醒源。
代码结构方面,分模块编写:GPIO配置、ADC处理、UART通信、SD卡存储、OLED显示、按键处理等。使用中断服务函数处理唤醒、滚动按键和开关量变化(如果可行的话)。主循环中轮询检测开关量和ADC,更新显示和存储数据。
最后,测试每个模块的功能,确保数据准确传输和显示,处理可能的竞争条件,比如SD卡写入时的中断处理,或者OLED刷新时的滚动操作。可能需要使用RTOS来管理多任务,但用户没有提到,所以可能用裸机编程,通过状态机处理各个任务。</think>根据需求,我将分步骤为您构建STM32F103ZET6检测系统程序。以下是详细实现方案:
一、硬件配置分析
$$GPIO分配表:$$
| 功能模块 | 引脚分配 | 接口类型 |
|-----------------|---------------------|-----------|
| 4G模块 | PB10(TX), PB11(RX) | USART3 |
| SD卡模块 | PC8~PC12, PD2 | SDIO |
| OLED显示屏 | PG6(SCL), PG8(SDA) | I2C1 |
| 开关量输入 | PD0~PD15 | GPIO输入 |
| 模拟量输入 | PA1~PA7, PC0~PC2 | ADC |
| 唤醒按钮 | PA0 | EXTI |
| OLED滚动控制 | PG13(UP), PG14(DOWN)| GPIO输入 |
二、工程结构设计
1. 主程序框架
```c
int main(void) {
System_Init(); // 系统初始化
Enter_Stop_Mode(); // 进入低功耗模式
while(1) {
if(need_refresh) {
Read_Digital_Inputs();
Read_Analog_Inputs();
Update_OLED_Display();
Save_to_SD();
Send_via_4G();
need_refresh = 0;
}
__WFI(); // 等待中断
}
}
```
三、关键模块配置
1. 4G模块通信(USART3)
```c
void USART3_Init(uint32_t baudrate) {
GPIOB->CRH &= ~(0xFF << 8);
GPIOB->CRH |= (0x0B << 8) | (0x04 << 12); // PB10复用推挽,PB11浮空输入
USART3->BRR = SystemCoreClock / baudrate;
USART3->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
USART3->CR3 |= USART_CR3_DMAT | USART_CR3_DMAR; // 启用DMA
}
```
2. ADC多通道采样(10路模拟量)
```c
void ADC_Config(void) {
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->SMPR2 = 0x3FFFFFFF; // 所有通道采样时间239.5周期
ADC1->SQR1 = (9 << 20); // 10次转换
// 配置通道顺序 PA1(1)~PA7(7), PC0(10), PC1(11), PC2(12)
ADC1->SQR3 = (1<<0)|(2<<5)|(3<<10)|(4<<15)|(5<<20)|(6<<25);
ADC1->SQR2 = (7<<0)|(10<<5)|(11<<10)|(12<<15);
ADC1->CR2 |= ADC_CR2_CONT | ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART; // 启动转换
}
```
3. OLED显示控制(带滚动功能)
```c
// 显示缓存结构体
typedef struct {
uint8_t content[8][16]; // 8页 x 128列
uint8_t start_line;
} OLED_Buffer;
void OLED_Scroll_Handler(void) {
if(EXTI_GetITStatus(EXTI_Line13)) { // PG13向上滚动
if(oled_buffer.start_line > 0) oled_buffer.start_line--;
}
if(EXTI_GetITStatus(EXTI_Line14)) { // PG14向下滚动
if(oled_buffer.start_line < 56) oled_buffer.start_line++;
}
OLED_SetStartLine(oled_buffer.start_line);
}
```
四、中断配置要点
1. 唤醒按钮配置(PA0)
```c
void PA0_EXTI_Config(void) {
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
EXTI->IMR |= EXTI_Line0; // 使能线0中断
EXTI->RTSR |= EXTI_Line0; // 上升沿触发
NVIC_EnableIRQ(EXTI0_IRQn);
}
void EXTI0_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line0)) {
RCC->APB2ENR |= RCC_APB2ENR_IOPDEN; // 重新使能GPIO时钟
need_refresh = 1;
EXTI->PR = EXTI_Line0; // 清除中断标志
}
}
```
五、数据存储方案
1. SD卡数据格式设计
$$数据帧结构:$$
| 字段 | 长度 | 说明 |
|-------------|--------|-----------------------|
| 时间戳 | 4字节 | UNIX时间戳 |
| 开关量状态 | 2字节 | PD0-PD15状态 |
| 模拟量值 | 20字节 | 10个uint16_t类型数值 |
| CRC校验 | 2字节 | CRC16校验码 |
六、系统优化建议
1. 低功耗管理
- 在非采样时段关闭ADC时钟
- 使用停机模式时保留SRAM内容
```c
void Enter_Stop_Mode(void) {
RCC->APB1ENR &= ~RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_LPDS; // 进入低功耗停机模式
__WFI();
}
```
2. 显示刷新策略
- 采用差异刷新机制,仅更新变化部分
- 设置30Hz的定时刷新率
```c
void TIM3_IRQHandler(void) {
static uint8_t counter = 0;
if(TIM3->SR & TIM_SR_UIF) {
if(++counter >= 30) { // 每秒刷新30次
need_refresh = 1;
counter = 0;
}
TIM3->SR = ~TIM_SR_UIF;
}
}
```
本方案实现了:
1. 16路开关量实时检测(PD端口)
2. 10路模拟量采集(ADC多通道扫描)
3. 4G模块数据透传
4. SD卡数据存储
5. OLED多行滚动显示
6. 低功耗唤醒机制
实际开发中需注意:
1. 为PG13/PG14添加硬件消抖电路
2. ADC参考电压需稳定在3.3V±1%
3. SDIO总线走线长度不宜超过10cm
4. 4G模块电源需独立2A以上供电
5. 开关量输入建议添加光耦隔离
阅读全文
相关推荐













