赞
踩
作者使用的是STM32L431RCT的开发板,Cortex-M4的内核,是大学老师教学用的,原理图如下
原理图下载链接:https://pan.baidu.com/s/1c8WFBO9bPxarzaOKqDrl0Q?pwd=6666
提取码:6666
HAL库的优点是可以对STM32快速入门,但是很难深入了解STM32的内部寄存器,后期没事的时候可以尝试基于寄存器的开发,跟C51一样,但是需要手册的辅助,毕竟寄存器太多了,关于GPIO引脚的配置说三种:输入、输出、外部中断;两种配置方法:图形配置、函数配置
输入
鼠标选中PA5引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA5引脚配置成输入GPIO_Input
配置好了后该引脚会生成一个其他的配置项,各个意思都在图中标识过了,然后Ctrl+s保存,即可自动生成初始代码
初始化完成后的代码
- /**
- * @brief GPIO Initialization Function
- * @param None
- * @retval None
- */
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
-
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOH_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- /*Configure GPIO pin : LED_Pin */
- GPIO_InitStruct.Pin = LED_Pin; //引脚的自定义命名LED_Pin
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//引脚的模式GPIO_MODE_INPUT输入
- GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚的上拉或下拉选择
- HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);//引脚初始化的函数,我们在调用时的函数
-
- }
-
- /* USER CODE BEGIN 4 */
与输入类似,鼠标选中PA4引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA4引脚配置成输入GPIO_Output,然后就会生成一些其他的配置项
这里主要说一下引脚模式:推挽输出、开漏输出;推挽输出跟我们平时用的C51的P1差不多;而开漏输出更像C51的P0需要配合上拉电阻使用,适合驱动电流稍微大一点外设。配置好了以后Ctrl+s保存,就可以自动生成初始化代码
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);//引脚的初始电平
-
- /*Configure GPIO pin : LED3_Pin */
- GPIO_InitStruct.Pin = LED3_Pin; //引脚的名字LED_Pin
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //引脚的模式
- GPIO_InitStruct.Pull = GPIO_NOPULL; //是否选择上拉或下拉电阻
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //引脚的频率
- HAL_GPIO_Init(LED3_GPIO_Port, &GPIO_InitStruct); //引脚初始化的示例
到此引脚的输入、输出初始化完成,做点东西,不然没意思,我们做一个按钮控制灯的开关;因为我们没有采用外部中断,所以只能以查询的方式去检测引脚电平去控制灯,这里我们选择开发板上的LED3,由原理图可以看到,该灯是低电平点亮
大致思想就是检测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;这里需要注意一点,如果不指明中断回调函数的外部中断引脚,那么所有的外部中断函数都要写在这个函数里
- /* Initialization and de-initialization functions *****************************/
- void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
- void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
-
- /**
- * @}
- */
-
- /** @addtogroup GPIO_Exported_Functions_Group2 IO operation functions
- * @{
- */
-
- /* IO operation functions *****************************************************/
- GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
- void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
HAL库的GPIO的函数基本就这么多,下面开始写上面提到的控制程序,如下代码实现了开关按下灯灭,开关弹出灯亮的功能,我身边没有按钮,我用杜邦线接3.3V展示效果
- if( HAL_GPIO_ReadPin(LED_GPIO_Port,LED_Pin) == GPIO_PIN_SET )
- {
- HAL_Delay(10);
- HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin,GPIO_PIN_SET );
- }
- else
- {
- HAL_Delay(10);
- HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin, GPIO_PIN_RESET);
- }
演示
关于外部中断的配置跟输入输出相似,多了一个触发方式的配置,可分为两类:中断和事件;每类都有3种触发方式:下降沿触发、上升沿触发、上升沿和下降沿都触发;最后要使能中断,这就好像我们用C51时,开启外部中断一样;最后Ctrl+S保存生成代码
- /*Configure GPIO pin : KEY_Pin */
- GPIO_InitStruct.Pin = KEY_Pin; //中断引脚名称
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //外部中断触发方式
- GPIO_InitStruct.Pull = GPIO_PULLDOWN; //是否选择上拉或者下拉电阻
- HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
-
- /* EXTI interrupt init*/
- HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); //外部中断优先级配置
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //外部中断使能
到这里外部中断引脚初始化完成,做个按键控制灯的亮灭程序
先打开外部中断
- /* USER CODE BEGIN 2 */
- HAL_GPIO_EXTI_IRQHandler(KEY_Pin);
- /* USER CODE END 2 */
在写中断回调函数,使其控制LED3的亮灭
- /* USER CODE BEGIN 4 */
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if(GPIO_Pin == KEY_Pin) //需要判断是哪个外部中断
- {
- HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); //反转LED3的电平
- }
-
- }
- /* USER CODE END 4 */
演示效果
演示1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。