使用LL库开发STM32:GPIO口与外部中断

目的

GPIO口使用是单片机开发中最简单的一块,STM32的GPIO口无论是使用HAL库还是LL库开发起来都很简单,也没有什么坑。一般的对性能和内存等没有特殊要求的话用HAL库开发就行了,如果有要求的话可以使用LL库进行开发。

初始化设置

使用STM32CubeIDE或STM32CubeMX来初始化设置GPIO口是比较方便的,毕竟初始化代码都会自动生成,当然我们也可以自己编写初始化代码,参考下面软件生成的初始化代码:

//以下代码将PA2口初始化设置为推挽输出模式
static void MX_GPIO_Init(void)
{
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; //声明GPIO初始化数据结构

  /* GPIO Ports Clock Enable */
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); //使能GPIOA口时钟

  /*Reset GPIO pin Output Level */
  LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_2); //重置初始输出低电平

  /* Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2; //设置2口
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; //设置为输出模式
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; //设置为低速
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; //设置为推挽输出模式
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; //没有上下拉电阻
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct); //应用初始化设置
}

上面代码中 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); 这句用来完成对指定GPIO口的初始化,程序中如果需要更改GPIO口配置也可以通过此方式更改。当然LL库中也提供了别的方法可以用来修改GPIO口的配置参数:
在这里插入图片描述

输出与控制

GPIO口输出通常指推挽输出 LL_GPIO_OUTPUT_PUSHPULL 和开漏输出 LL_GPIO_OUTPUT_OPENDRAIN ,开漏输出还可以设置内部上下拉电阻。在输出模式下通过下面三个方法可以控制输出值:

  • LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
    将输出置为高;
  • LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
    将输出置为低;
  • LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
    翻转GPIO输出值;

在这里插入图片描述
除了上面这几个方法外,LL库还提供了整组端口设置输出置的方法,可以在库中找到。

输入与端口值读取

输入分数字输入和模拟输入,这里主要讲下数字输入。数字输入的情况下可以设置内部上下拉电阻,如果不设置那就是浮空输入。数字输入时使用下面方法读取端口值:
uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask)
在这里插入图片描述

外部中断

STM32每一个IO口都可以设置外部中断,但有点限制,比如PA2设置了外部中断那么PB2、PC2、PD2……等等这些都无法设置外部中断了。所以在IO口上的外部中断最多可以设置0~15号共16个。IO口上的外部中断可以被配置成电平上升沿、下降沿、上升下降沿触发。
下面使用按钮进行外部中断使用演示,按照下图将按钮接到PA1脚,图中电容用于消除按钮操作时的电平抖动:
在这里插入图片描述
按照下图进行初始化配置:
在这里插入图片描述
上图中设置了PA1脚外部中断,配置为上升下降沿均触发中断,并且将PA1设置为上拉模式,这样根据上面电路按钮未按下时端口为高电平,按钮按下时端口变为低电平。(为了方便测试这里我还启用了Debug引脚,下图就是实际调试效果)
在这里插入图片描述
PA1位于EXIT1,上图中在中断回调函数 EXTI1_IRQHandler 中添加了测试代码,测试代码为读取PA1当前输入端口值。当我按下或松开连接在PA1上的按钮的时候端口值会相应的变化。

总结

GPIO口的使用还是非常简单的,更多内容可以参考官方Datasheet、Reference manual、User Manual等。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32中,使用HAL安装GPIO中断处理程序比较方便,只需要调用相应的HAL函数即可完成。 1. 配置GPIO为中断模式:使用HAL_GPIO_Init函数配置相应的GPIO为中断模式。需要设置GPIO的模式为GPIO_MODE_IT_RISING/FALLING、GPIO_PULLUP/GPIO_PULLDOWN等参数。 2. 开启GPIO中断:使用HAL_NVIC_EnableIRQ函数使能相应的中断。需要传入中断号作为参数。 3. 编写中断服务程序:中断服务程序是中断发生时执行的代码,在中断处理程序中完成相应的操作,如清除中断标志、处理数据等。 4. 安装中断处理程序:使用HAL_NVIC_SetPriority函数来设置中断优先级。该函数需要传入中断号和优先级作为参数。优先级越高的中断会先被处理。 下面是一个使用HAL安装GPIO中断处理程序的例子: ```c // 配置GPIO为中断模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 开启GPIO中断 HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 定义中断服务程序 void EXTI0_IRQHandler(void) { // 处理GPIO中断 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } // GPIO中断回调函数,需要在main函数中定义 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 处理GPIO中断 } // 设置中断优先级 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); ``` 注意,在使用HAL安装GPIO中断处理程序时,需要在main函数中定义GPIO中断回调函数,用于处理GPIO中断。同时,需要注意中断服务程序的执行时间不能过长,否则会影响其他任务的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值