别再死记硬背了!用STM32F103标准库函数速查表,5分钟搞定GPIO、TIM、ADC配置

别再死记硬背了!用STM32F103标准库函数速查表,5分钟搞定GPIO、TIM、ADC配置 STM32F103标准库实战速查手册5分钟精准定位关键函数刚接触STM32开发时最让人头疼的不是写代码而是每次配置外设都要翻手册查函数名。GPIO_Init的第4个参数到底填什么TIM_TimeBaseInit结构体里哪个字段对应分频系数这些问题会打断开发节奏降低效率。本文将用场景化的方式整理STM32F103最常用的标准库函数配合典型配置代码让你快速找到需要的函数并正确使用。1. GPIO配置速查GPIO是STM32开发中最基础的外设从点亮LED到驱动复杂外设都离不开它。标准库提供了丰富的GPIO操作函数但实际项目中常用的集中在几个核心场景。1.1 初始化GPIO引脚配置一个GPIO引脚需要三个步骤使能时钟、设置参数、初始化。以下是点亮LED的典型配置假设LED接在PA5// 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // 配置PA5为推挽输出速度50MHz GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 点亮LED GPIO_SetBits(GPIOA, GPIO_Pin_5);常用模式对照表GPIO_Mode参数适用场景GPIO_Mode_Out_PP推挽输出驱动LED等GPIO_Mode_Out_OD开漏输出I2C等GPIO_Mode_IN_FLOATING浮空输入按键检测等GPIO_Mode_IPU上拉输入GPIO_Mode_IPD下拉输入1.2 复用功能配置使用USART、SPI等外设时需要配置GPIO的复用功能// 配置PA9为USART1_TX GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure);关键点复用功能必须配合GPIO_PinRemapConfig使用例如// 重映射USART1到PB6/PB7 GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);2. 定时器PWM生成实战TIM定时器是STM32最复杂的外设之一但PWM输出是电机控制、LED调光等场景的必备功能。2.1 基础PWM配置以下代码配置TIM3的通道1产生1kHz PWM假设系统时钟72MHz// 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 时基配置1kHz PWM TIM_TimeBaseStructure.TIM_Period 999; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler 71; // 分频系数 TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // PWM模式配置通道1 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 500; // 初始占空比50% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, TIM_OCInitStructure); // 使能预装载寄存器 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); // 启动定时器 TIM_Cmd(TIM3, ENABLE);2.2 动态调整占空比运行时修改PWM占空比只需更新CCR寄存器// 修改TIM3通道1占空比为75% TIM_SetCompare1(TIM3, 750);注意高级定时器TIM1/TIM8还需要额外使能主输出TIM_CtrlPWMOutputs(TIM1, ENABLE);3. ADC采样配置指南STM32的ADC支持单次、连续、扫描等多种模式以下是单通道采样典型配置3.1 单通道ADC初始化// 使能ADC1和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置PA1为模拟输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode DISABLE; // 单通道 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; // 单次转换 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_Init(ADC1, ADC_InitStructure); // 配置通道1采样时间55.5周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 开启ADC并校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1));3.2 触发采样并读取结果// 启动转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 等待转换完成 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 读取转换值 uint16_t adcValue ADC_GetConversionValue(ADC1);多通道采样技巧启用扫描模式并设置DMA传输// 启用扫描模式 ADC_InitStructure.ADC_ScanConvMode ENABLE; // 配置DMA需先初始化DMA通道 ADC_DMACmd(ADC1, ENABLE);4. 中断与NVIC配置精要合理使用中断能大幅提高系统响应效率STM32的中断配置分为外设级和NVIC级两步。4.1 外设中断使能以配置USART1接收中断为例// 使能USART1接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);常用中断标志外设中断标志触发条件USARTUSART_IT_RXNE接收寄存器非空USARTUSART_IT_TXE发送寄存器空TIMTIM_IT_Update定时器溢出TIMTIM_IT_CC1捕获/比较通道1事件EXTIEXTI_Line0外部中断线04.2 NVIC优先级配置STM32使用4位优先级分组建议在main()开头统一设置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2位抢占优先级2位子优先级配置USART1中断通道NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure);4.3 中断服务函数模板void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t data USART_ReceiveData(USART1); // 处理接收数据 USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }关键点必须在中断服务函数中清除对应中断标志否则会重复进入中断。