STM32F103单片机外设驱动与传感器接口实战指南

📅 2026/7/21 11:13:58
STM32F103单片机外设驱动与传感器接口实战指南
1. STM32F103系列单片机核心功能解析STM32F103作为意法半导体Cortex-M3内核的经典产品在工业控制、消费电子等领域已有十余年应用历史。这款72MHz主频的单片机凭借其丰富的外设资源和稳定的性能表现至今仍是许多工程师的首选。我使用STM32F103完成过数十个项目对其功能特性有着深刻理解。该系列最突出的特点是其全能型外设配置多达11个定时器包含2个PWM高级控制定时器3个SPI接口支持I2S协议2个I2C接口支持SMBus/PMBus5个USART支持IrDA/ISO7816USB 2.0全速接口CAN 2.0B控制器3个12位ADC1μs转换时间2个12位DAC实际项目中我常将TIM1用于电机PWM控制TIM2/TIM3作为通用定时器TIM4用于软件看门狗。ADC的规则组和注入组配合使用能实现多通道交替采样而不丢失关键数据。2. 外围传感器典型电路设计2.1 加速度传感器接口方案ADXL345三轴加速度计是运动检测的常用器件通过SPI接口连接时需注意// SPI初始化配置模式3 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_High; SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_32;硬件设计要点VCC引脚需加0.1μF去耦电容SDO线需上拉4.7kΩ电阻中断输出引脚建议串联100Ω电阻2.2 温湿度传感器集成方案DHT22数字传感器采用单总线协议典型驱动代码void DHT22_Start(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin DHT22_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(DHT22_PORT, GPIO_InitStruct); HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_RESET); delay_ms(1); // 保持至少1ms低电平 HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_SET); delay_us(30); // 高电平维持30μs GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DHT22_PORT, GPIO_InitStruct); }3. 外设驱动开发实战3.1 多通道ADC采集优化使用DMA实现6通道交替采样时需配置扫描模式ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // ...其他通道配置 DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ADC1-DR; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)adc_values; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize 6; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular;实测发现当采样周期小于7.5μs时需在ADC引脚加RC滤波100Ω100pF否则采样值会出现毛刺。3.2 定时器PWM输出技巧生成互补PWM时死区时间配置公式死区时间(ns) (DTG[7:0] 1) × Tdts 其中Tdts 2 × TIMxCLK周期例如需要200ns死区时间系统时钟72MHz时TIM_BDTRInitStructure.TIM_DeadTime 5; // (51)*27.7≈200ns TIM_BDTRInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_BDTRInitStructure.TIM_OCNPolarity TIM_OCNPolarity_High; TIM_BDTRInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_BDTRInitStructure.TIM_OutputNState TIM_OutputNState_Enable; TIM_BDTRInitStructure.TIM_Break TIM_Break_Enable; TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure);4. 常见问题排查指南4.1 SPI通信异常处理当SPI通信出现数据错位时按以下步骤排查用示波器检查SCK时钟极性是否符合从设备要求确认NSS信号是否有效硬件NSS需配置为复用输出检查时钟分频是否过高建议初始设为PCLK/256调试测量信号上升时间超过1μs需减小串联电阻值4.2 低功耗模式唤醒失败从STOP模式唤醒失败的典型原因未正确配置唤醒源对应的EXTI线唤醒引脚未设置为浮空输入模式RTC闹钟未使能唤醒功能需设置RTC_CR寄存器ALRAIE位解决方法// 正确配置唤醒引脚 GPIO_InitStruct.Pin WAKEUP_PIN; GPIO_InitStruct.Mode GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull GPIO_NOPULL; HAL_GPIO_Init(WAKEUP_PORT, GPIO_InitStruct); // 使能RTC唤醒 HAL_RTCEx_SetWakeUpTimer_IT(hrtc, 0xFFFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);5. 项目优化建议5.1 代码空间节省技巧对于资源受限的C8T6型号64KB Flash可采取使用-Os优化等级将常量字符串放入ROM区启用链接时优化(LTO)使用位段操作替代布尔数组5.2 实时性提升方案中断响应时间优化方法将关键中断设为最高优先级NVIC_IRQChannelPreemptionPriority0缩短中断服务程序执行时间复杂处理移出中断使用DMA减轻CPU负担禁用未使用的外设时钟节省唤醒时间通过合理配置NVIC可将外部中断响应时间控制在12个时钟周期内72MHz时约167ns。