当前位置:   article > 正文

STM32HAL库的基本使用(1)- GPIO引脚配置_gpio_inittypedef key={0}

gpio_inittypedef key={0}

前言

作者使用的是STM32L431RCT的开发板,Cortex-M4的内核,是大学老师教学用的,原理图如下

dbf62faee43f4e21a05a0a74c24ff7d9.png

原理图下载链接:https://pan.baidu.com/s/1c8WFBO9bPxarzaOKqDrl0Q?pwd=6666 
提取码:6666 

HAL库的优点是可以对STM32快速入门,但是很难深入了解STM32的内部寄存器,后期没事的时候可以尝试基于寄存器的开发,跟C51一样,但是需要手册的辅助,毕竟寄存器太多了,关于GPIO引脚的配置说三种:输入、输出、外部中断;两种配置方法:图形配置、函数配置

输入

e6d8aa3ef05141fa8e842b8744c26e06.png

鼠标选中PA5引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA5引脚配置成输入GPIO_Input

配置好了后该引脚会生成一个其他的配置项,各个意思都在图中标识过了,然后Ctrl+s保存,即可自动生成初始代码

ecda32453ec14369b0176119be416f85.png

 初始化完成后的代码

  1. /**
  2. * @brief GPIO Initialization Function
  3. * @param None
  4. * @retval None
  5. */
  6. static void MX_GPIO_Init(void)
  7. {
  8. GPIO_InitTypeDef GPIO_InitStruct = {0};
  9. /* GPIO Ports Clock Enable */
  10. __HAL_RCC_GPIOH_CLK_ENABLE();
  11. __HAL_RCC_GPIOA_CLK_ENABLE();
  12. /*Configure GPIO pin : LED_Pin */
  13. GPIO_InitStruct.Pin = LED_Pin; //引脚的自定义命名LED_Pin
  14. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//引脚的模式GPIO_MODE_INPUT输入
  15. GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚的上拉或下拉选择
  16. HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);//引脚初始化的函数,我们在调用时的函数
  17. }
  18. /* USER CODE BEGIN 4 */

输出

与输入类似,鼠标选中PA4引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA4引脚配置成输入GPIO_Output,然后就会生成一些其他的配置项

c5c7dbf65000439ca21a59c61d97fbfc.png

 这里主要说一下引脚模式:推挽输出、开漏输出;推挽输出跟我们平时用的C51的P1差不多;而开漏输出更像C51的P0需要配合上拉电阻使用,适合驱动电流稍微大一点外设。配置好了以后Ctrl+s保存,就可以自动生成初始化代码

f5b60110a2744b908316e91a7d6603c7.png

 

  1. /*Configure GPIO pin Output Level */
  2. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);//引脚的初始电平
  3. /*Configure GPIO pin : LED3_Pin */
  4. GPIO_InitStruct.Pin = LED3_Pin; //引脚的名字LED_Pin
  5. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //引脚的模式
  6. GPIO_InitStruct.Pull = GPIO_NOPULL; //是否选择上拉或下拉电阻
  7. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //引脚的频率
  8. HAL_GPIO_Init(LED3_GPIO_Port, &GPIO_InitStruct); //引脚初始化的示例

到此引脚的输入、输出初始化完成,做点东西,不然没意思,我们做一个按钮控制灯的开关;因为我们没有采用外部中断,所以只能以查询的方式去检测引脚电平去控制灯,这里我们选择开发板上的LED3,由原理图可以看到,该灯是低电平点亮

da710683ca984f5c8dcd7b8c3c6f16ed.png

 大致思想就是检测PA5的引脚电平,检测到低电平就把LED3灭掉,即把PA4置1;如果检测到PA5为高电平,就把LED3点亮,即把PA4置0;先来看一下HAL库给的GPIO的函数:

HAL_GPIO_Init是一个引脚初始化的函数;对应的HAL_GPIO_DeInit就是一个清空初始化的函数,我们一般不用

HAL_GPIO_ReadPin故名思意就是读取引脚电平;HAL_GPIO_WritePin就是给对应的引脚写入电平

HAL_GPIO_TogglePin意思是引脚电平反转;HAL_GPIO_LockPin是锁住引脚寄存器的状态;

HAL_GPIO_EXTI_IRQHandler是外部中断的判断,并清除中断标识,调用中断回调函数HAL_GPIO_EXTI_Callback;这里需要注意一点,如果不指明中断回调函数的外部中断引脚,那么所有的外部中断函数都要写在这个函数里

  1. /* Initialization and de-initialization functions *****************************/
  2. void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
  3. void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
  4. /**
  5. * @}
  6. */
  7. /** @addtogroup GPIO_Exported_Functions_Group2 IO operation functions
  8. * @{
  9. */
  10. /* IO operation functions *****************************************************/
  11. GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  12. void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
  13. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  14. HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  15. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
  16. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

HAL库的GPIO的函数基本就这么多,下面开始写上面提到的控制程序,如下代码实现了开关按下灯灭,开关弹出灯亮的功能,我身边没有按钮,我用杜邦线接3.3V展示效果

  1. if( HAL_GPIO_ReadPin(LED_GPIO_Port,LED_Pin) == GPIO_PIN_SET )
  2. {
  3. HAL_Delay(10);
  4. HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin,GPIO_PIN_SET );
  5. }
  6. else
  7. {
  8. HAL_Delay(10);
  9. HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin, GPIO_PIN_RESET);
  10. }

 

演示

中断

 关于外部中断的配置跟输入输出相似,多了一个触发方式的配置,可分为两类:中断和事件;每类都有3种触发方式:下降沿触发、上升沿触发、上升沿和下降沿都触发;最后要使能中断,这就好像我们用C51时,开启外部中断一样;最后Ctrl+S保存生成代码

 

b18b5c7d2185405b8b8b6e209604bab5.png

 

a74e40b2eaa94839ad07194a5a598f70.png

 

  1. /*Configure GPIO pin : KEY_Pin */
  2. GPIO_InitStruct.Pin = KEY_Pin; //中断引脚名称
  3. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //外部中断触发方式
  4. GPIO_InitStruct.Pull = GPIO_PULLDOWN; //是否选择上拉或者下拉电阻
  5. HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
  6. /* EXTI interrupt init*/
  7. HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); //外部中断优先级配置
  8. HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //外部中断使能

到这里外部中断引脚初始化完成,做个按键控制灯的亮灭程序

先打开外部中断

  1. /* USER CODE BEGIN 2 */
  2. HAL_GPIO_EXTI_IRQHandler(KEY_Pin);
  3. /* USER CODE END 2 */

 在写中断回调函数,使其控制LED3的亮灭

  1. /* USER CODE BEGIN 4 */
  2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  3. {
  4. if(GPIO_Pin == KEY_Pin) //需要判断是哪个外部中断
  5. {
  6. HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); //反转LED3的电平
  7. }
  8. }
  9. /* USER CODE END 4 */

演示效果

演示1

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/126078
推荐阅读
相关标签
  

闽ICP备14008679号