历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2018年09月06日 | STM32—HAL库中GPIO相关函数解析

2018-09-06 来源:eefocus

背景:

最近一直在学习HAL库,总结下STM32中HAL库的GPIO相关函数知识点。

内容:

在stm32l152xb.h头文件中定义了GPIO的相关寄存器,下面讲述的GPIO函数将会调用到这些寄存器。寄存器的结构体定义如下图:

下面解析stm32l1xx_hal_gpio.c文件中一些常用的GPIO函数:

(1)GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  GPIO_PinState bitstatus;

 

 

  /* Check the parameters */

  assert_param(IS_GPIO_PIN(GPIO_Pin));//检查确认是不是GPIO口,从GPIO_PIN_0到GPIO_PIN_ALL

 

 

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)  //判断输入数据寄存器是不是GPIO_PIN_SET

  {

    bitstatus = GPIO_PIN_SET;

  }

  else

  {

    bitstatus = GPIO_PIN_RESET;

  }

  return bitstatus;

}

 

(2)void              HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 函数


 


void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

{

  /* Check the parameters */

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  assert_param(IS_GPIO_PIN_ACTION(PinState));

 

  if (PinState != GPIO_PIN_RESET)

  {

    GPIOx->BSRR = (uint32_t)GPIO_Pin;//如果是GPIO_PIN_SET,则将GPIO的BSRR寄存器低16位置为GPIO_Pin

  }

  else

  {

    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;//如果是GPIO_PIN_RESET,则将GPIO的BSRR寄存器的高16位置为GPIO_Pin

  }

}

例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_SET,则GPIOA->BSRR=((uint32_t)0x0002U);即把二进制数0000000000000010转换为32位数赋值给BSRR,对应的GPIO_Pin_1管脚置高;


例如函数输入的参数是GPIOA、GPIO_Pin_1和GPIO_PIN_RESET,则GPIOA->BSRR=((uint32_t)0x0002U<<16);即把二进制数0000000000000010左移16位并转换为32位数赋值给BSRR,高16位对应的GPIO_Pin_1为1,对应管脚被清零,置低;


(3)void              HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数


void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_PIN(GPIO_Pin));

 

  GPIOx->ODR ^= GPIO_Pin;//输出数据寄存器与GPIO_Pin异或;

}

例如函数的输入参数是GPIOA、GPIO_Pin_1,则GPIOx->ODR与0000000000000010进行异或操作,0 ^ 1 =1,1 ^ 1 =0,异或运算后,原来的对应位被翻转。


(4)void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);函数


void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

{

  /* EXTI line interrupt detected */

  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) //若中断标志被置位

  { 

    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清楚标志位

    HAL_GPIO_EXTI_Callback(GPIO_Pin);//进入回调函数

  }

}

(5)void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);函数


__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

 

//_weak:__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(GPIO_Pin);//防止出现警告,#define UNUSED(x)  ((void)(x)),x前面用void定义时,可以避免x定义了但没调用的错误

 

 

  /* NOTE : This function Should not be modified, when the callback is needed,

            the HAL_GPIO_EXTI_Callback could be implemented in the user file

   */ 

}

 


推荐阅读

史海拾趣

Electronic Concepts Inc公司的发展小趣事

随着市场的竞争加剧,ECI意识到只有不断创新才能在行业中立足。在总经理张女士的领导下,公司投入大量资源进行研发,成功推出了一系列具有竞争力的新产品。其中,一款集成了先进算法的智能传感器,因其高精度和低功耗特性,在市场上大受欢迎。这一创新不仅提升了ECI的品牌形象,也为公司带来了丰厚的利润。

Deutron Electronics Corp公司的发展小趣事

为了进一步提升竞争力,Deutron Electronics Corp积极寻求国际合作与并购机会。公司与多家国际知名电子企业建立了战略合作关系,共同研发新产品和技术。同时,公司还成功收购了几家具有核心技术的电子企业,增强了自身的研发和生产能力。这些合作与并购为Deutron Electronics Corp带来了更多的发展机遇和市场空间。

Chenmoun Enterprise Ltd公司的发展小趣事

作为一个有社会责任感的企业,Chenmoun Enterprise Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的环境污染和资源浪费。同时,公司还积极参与公益事业,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象,也增强了公司的社会影响力。

以上这些故事虽然基于虚构,但它们展示了一个电子企业可能经历的发展路径和关键成功因素。这些因素包括技术创新、全球化战略、品质控制、研发投入和社会责任等。当然,每个企业的具体情况和发展道路都会有所不同,但这些故事可以作为参考,帮助您理解电子行业企业的发展历程。

HellermannTyton公司的发展小趣事

Heimann Optoelectronics Gmbh深知人才是企业发展的核心动力。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。同时,公司还注重营造开放、包容的企业文化,鼓励员工创新思维和团队合作。这种良好的企业文化氛围吸引了大量优秀人才加入公司,为公司的持续发展提供了有力的人才保障。

以上五个故事虽然基于虚构的“Heimann Optoelectronics Gmbh”公司构建,但反映了电子行业中企业发展的一般规律和趋势。

Amidon Associates Inc公司的发展小趣事

Heimann Optoelectronics Gmbh深知人才是企业发展的核心动力。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。同时,公司还注重营造开放、包容的企业文化,鼓励员工创新思维和团队合作。这种良好的企业文化氛围吸引了大量优秀人才加入公司,为公司的持续发展提供了有力的人才保障。

以上五个故事虽然基于虚构的“Heimann Optoelectronics Gmbh”公司构建,但反映了电子行业中企业发展的一般规律和趋势。

E-CMOS(飞虹高科)公司的发展小趣事

在技术创新的同时,飞虹高科公司也积极拓展市场。然而,市场拓展的过程并非一帆风顺。公司面临着来自国内外众多竞争对手的激烈竞争,同时还要应对客户不断变化的需求。为了应对这些挑战,公司制定了一套完善的市场营销策略,积极参加国内外各类电子展会和技术交流活动,与客户建立了长期稳定的合作关系。同时,公司还不断优化产品性能和服务质量,提高客户满意度。通过这些努力,公司逐渐在市场上树立了良好的品牌形象。

问答坊 | AI 解惑

51单片机程序-word-1

最新的51单片机程序-word版本…

查看全部问答>

老师,帮我看看设计程序(程序后半部分)

(老师,这个程序是程序显示70h到74h中数值的程序,紧接前面发给你的那个程序。) ;显示70H到74H中的数值 MOV R0,#70H ;显示70H中的数值 LOOP1: MOV A,@R0 MOV DPTR,#LEDCODE MOVC A,@A+DPTR MOV R2,#8 LOOP0: RRC A ...…

查看全部问答>

线性相位

本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 线性相位  …

查看全部问答>

恭喜专区盛大开通

欢迎大家踊跃发帖、讨论!…

查看全部问答>

c51单片机

我刚学51单片机不久,最近遇到一个难题,我的板子上控制LED和数码管的都是P2口,请教高手,用什么办法可以同时按照自己的想法控制两者,做到互不影响?(希望能说的明白点) -- 给20点数,不要嫌少啊,是我目前全部的点数了。…

查看全部问答>

VS 2005 下WIN CE 6模拟器 语言选择中文 显示乱码

我先定制英文的CE,模拟可以显示正确。然后选择了语言中文,再试就是一些方框了,看不到中文。请问为什么呢?…

查看全部问答>

EVC3.0+ppc2002安装问题!

安装很正常,但建立一个Project后,Build时提示Connect,这时系统启动PPC2003,但一会出现Timeout:fail connect to device. 请问各位高手,如何让我的调试环境正常运行。…

查看全部问答>

关于网络的问题。

有问题请教: 自己做了板子,芯片是107vc,电脑跟板子之间通过一个5口的交换机连接,ping板子时返回时间都少于1ms; 但是公司的网络接进这个5**换机以后,ping板子返回的时间就变得很不稳定,而且大部分都在几百毫秒以上,有时甚至超过一千毫 ...…

查看全部问答>

如何判断串口发送给单片机的数据是相同的呢?

问一个问题 假如我在串口调试助手上发送数据:pass word 如果单片机收到这组数据后,进入一个条件, 这里怎么样判断单片机收到这个数据呢? 怎么比较出发出来的数据就是pass word呢? 是不是要"p","a","s","s","w","o ...…

查看全部问答>