STM32嵌入式学习笔记(B站铁头山羊)

1.GPIO的八种工作模式

GPIO共有八种工作模式,四种输出模式,四种输入模式

四种输出模式包括:通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出

四种输入模式:上拉输入、下拉输入、浮空输入、模拟输入

先讲四种输出模式:

推挽输出 (PUSH-PULL ):构成是上面一个P-mos,下面一个N-mos。当输入为高电平时,上管P-mos导通,输出高电平;当输入为低电平时,下管N-mos导通,输出低电平。两个MOS是交替导通的,不会同时导通(同时导通相当于VCC直连GND,会烧坏IO口)。

开漏输出(Open-Drain):所谓开漏输出,即相当于漏极断开,此时上方的Pmos相当于一直关闭状态。当输入电平为高时,N-mos保持关闭状态,输出高阻状态;输入为低时,下管N-mos导通,输出低电平。所以,开漏输出是不能直接输出高电平的,使用开漏输出一般要加上拉电阻使其能输出高电平。

注意:在输入信号到上下两个MOS管之前,前面有个反相电路,这也就解释了为何输入为1时是上管P-mos导通下管N-mos关闭了。

通用和复用的区别:通用一般是指CPU直接发出脉冲信号控制IO口的电平,复用则是CPU通过控制片上外设,然后片上外设再控制IO口。

GPIO的基本介绍基本就这些,然后看下它是如何工作的:

GPIO工作前要进行初始化操作,所谓初始化你也可以理解为配置GPIO工作的参数。

1.开始GPIO的时钟,命令RCC_APB2PeriphClockCmd();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO使能

2.GPIO管脚的初始化,GPIO_Init();以PA13为例,PA13控制点亮一颗LED,开漏输出模式,频率2MHz,

GPIO输出模式下有三个参数:

GPIO_Mode:选择GPIO的工作模式,推挽/开漏/上拉/下拉等状态

GPIO_Pin:GPIO的管脚

GPIO_Speed:GPIO的最大输出速率,有2MHz,10MHz,50MHz可选

所谓GPIO最大工作速率是指GPIO连续输出0/1保持波形不失真的最大速度,与上升时间和下降时间有关,工作速度并不是越大越好,高工作速度将会产生更高的功耗以及对外产生更多的EMI辐射。

GPIO的初始化我们一般定义一个结构体,命令GPIO_InitTypeDef 结构体名称为GPIO_InitStruct;

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT_OD;//开漏输出

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;//PA13

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//工作速度

GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化完成

GPIO输出模式下初始化完整代码截图如下:

以上介绍的是输出工作模式下,输入工作模式基本类似,参数没有GPIO_Speed,速度只是相对于输出而言的。

<think>好的,我现在需要帮助用户查找关于STM32外部中断EXTI的教程或笔记,特别是铁头山羊的相关内容。根据用户提供的引用,引用2和3提到了铁头山羊STM32学习笔记,其中引用2是关于中断、NVIC和EXTI的,而引用3是关于GPIO工作模式的。用户的问题主要集中在EXTI中断配置上,所以应该重点参考引用2。 首先,我需要确认用户提到的铁头山羊笔记内容是否涵盖EXTI的配置步骤。根据引用2的标题,确实涉及了中断、NVIC和EXTI,所以这部分内容应该有用。接下来,我需要整理出EXTI配置的关键步骤,包括GPIO初始化、EXTI线路配置、中断优先级设置(NVIC)以及中断服务函数的编写。 用户可能需要的步骤包括: 1. GPIO模式设置:输入模式,如上拉或下拉,根据硬件设计选择。 2. EXTI线路配置:将GPIO引脚连接到EXTI线路,可能需要使用AFIO来重映射。 3. 触发边沿选择:上升沿、下降沿或双边沿触发。 4. NVIC配置:设置中断优先级,启用对应的中断通道。 5. 编写中断服务函数:处理中断事件,清除中断标志位。 另外,用户提供的引用3提到GPIO的内部结构,如施密特触发器和输入/输出寄存器,这些可能影响中断响应的稳定性,所以在配置GPIO时需要注意这些硬件特性。 需要确保步骤中提到的寄存器操作和库函数(如HAL库或标准外设库)的正确性。例如,使用HAL_GPIO_Init函数配置GPIO,以及EXTI_InitTypeDef结构体来设置EXTI参数。同时,中断服务函数的命名需要符合标准,比如EXTI0_IRQHandler对应EXTI线路0的中断。 可能的问题点:用户是否使用特定的开发库(如HAL库或标准库)?不同库的函数名称和配置方法可能不同,但用户提供的引用中没有明确说明,因此可能需要通用步骤,或者指出不同库之间的差异。 最后,生成的相关问题需要围绕EXTI配置的细节、常见问题、应用场景等,帮助用户进一步理解。例如,如何选择触发边沿,如何防止抖动,EXTI与其他中断的优先级处理等。</think>### STM32 EXTI外部中断配置教程 根据铁头山羊STM32学习笔记[^2][^3],STM32的EXTI(外部中断)配置主要涉及GPIO工作模式、中断触发条件及NVIC优先级设置。以下是关键步骤: --- #### **1. GPIO模式配置** - **输入模式选择**:将GPIO设置为**浮空输入(Input floating)**或**上拉/下拉输入**,具体根据硬件电路设计决定。例如,按键通常配置为上拉输入,默认高电平,按下后接地触发低电平[^3]。 - **内部结构影响**:GPIO内部包含施密特触发器,用于信号整形,确保中断触发稳定性。 ```c // 示例:配置PA0为上拉输入(HAL库) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### **2. EXTI线路配置** - **映射GPIO到EXTI**:通过AFIO(复用功能IO)将GPIO引脚连接到EXTI线路。例如,PA0对应EXTI0,PB0也对应EXTI0,需通过AFIO选择具体引脚。 - **触发条件设置**:选择**上升沿(Rising Edge)**、**下降沿(Falling Edge)**或双边沿触发。 ```c // 示例:配置PA0为EXTI0,下降沿触发(标准库) EXTI_InitTypeDef EXTI_InitStruct = {0}; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); ``` --- #### **3. NVIC中断优先级配置** - **启用中断通道**:通过NVIC(嵌套向量中断控制器)设置中断优先级。例如,EXTI0的中断通道为`EXTI0_IRQn`[^2]。 - **优先级分组**:建议使用`HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)`设置优先级分组。 ```c // 示例:配置EXTI0中断优先级(HAL库) HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` --- #### **4. 编写中断服务函数** - **函数命名规则**:中断服务函数需与向量表定义一致,例如EXTI0的中断函数为`EXTI0_IRQHandler`。 - **清除中断标志**:在函数内必须调用`__HAL_GPIO_EXTI_CLEAR_IT()`或手动清除标志位,避免重复触发。 ```c // 示例:EXTI0中断服务函数 void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { // 处理中断事件(如计次) __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); } } ``` --- #### **常见问题** 1. **中断未触发**:检查GPIO模式、EXTI线路映射是否正确,NVIC是否启用。 2. **信号抖动**:硬件添加电容滤波,或软件去抖动(如延时检测)。 3. **多引脚共用EXTI线**:同一EXTI线(如EXTI0)只能处理一个引脚的中断,需避免冲突。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值