1. 项目概述
作为一个刚接触STM32的新手,我最初对中断和引脚复用的概念感到非常困惑。直到完成这个项目后,才真正理解了如何让外部中断、定时器中断和引脚复用协同工作。这个"小白版"教程,就是把我踩过的坑和总结的经验,用最直白的方式分享给同样刚入门的朋友们。
这个项目的核心价值在于:通过一个完整的示例,展示如何配置STM32的外部中断(比如按键触发)、定时器中断(周期性任务)以及引脚复用功能(优化IO资源分配)。这三种技术在实际项目中经常需要配合使用,比如用外部中断响应紧急事件,用定时器中断处理周期性数据采集,同时合理复用引脚以节省硬件资源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与环境搭建
2.1 所需硬件清单
- STM32开发板(我用的是STM32F103C8T6最小系统板)
- 面包板及杜邦线若干
- 按键开关(用于触发外部中断)
- LED灯(用于状态指示)
- 10kΩ电阻(按键上拉用)
- USB转TTL模块(用于串口调试)
2.2 开发环境配置
我使用的是Keil MDK-ARM开发环境,配合ST-Link下载器。安装时需要注意:
- 确保安装了对应芯片系列的Device Family Pack(DFP)
- 安装STM32CubeMX工具(后面配置会用)
- 建议安装串口调试工具(如Putty或串口助手)
注意:不同STM32系列的库函数可能有差异,本教程基于STM32F1xx标准外设库。如果使用HAL库,原理相同但函数名称会有变化。
3. 外部中断配置详解
3.1 GPIO引脚初始化
首先配置用于外部中断的GPIO引脚。我选择PA0作为外部中断输入引脚:
c复制void EXTI_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 开启GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.2 外部中断线路映射
STM32的外部中断线(EXTI)与GPIO引脚有固定映射关系:
code复制PA0 ~ PX0 -> EXTI0
PA1 ~ PX1 -> EXTI1
...
PA15 ~ PX15 -> EXTI15
配置代码示例:
c复制void EXTI_Config(void)
{
