目录
1 LED闪烁
HAL_GPIO_TogglePin
HAL_Delay
2 按键控制
HAL_GPIO_ReadPin
HAL_GPIO_WritePin
3 EXIT中断
HAL_GPIO_EXTI_IRQHandler
HAL_GPIO_EXTI_Callback
/**
* @brief 翻转指定的GPIO引脚。
* @param GPIOx 其中x可以是(A..K)来选择STM32F429X器件的GPIO外设,或者x可以是(A..I)来选择STM32F40XX和STM32F427X器件的GPIO外设。
* @param GPIO_Pin 指定要翻转的引脚。
* @retval 无
*/
Definition at line 433 of file stm32f4xx_hal_gpio.c.
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint32_t odr;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
/* get current Output Data Register value */
odr = GPIOx->ODR;
/* Set selected pins that were at low level, and reset ones that were high */
GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
#define LED2_Pin GPIO_PIN_6 #define LED2_GPIO_Port GPIOA
eg1. HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
eg2. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
/**
* @brief 这个函数提供基于变量增量的最小延迟(以毫秒为单位)。
* @note 在默认实现中,SysTick定时器是时间基础的来源。
* 它用于在uwTick被递增的定期时间间隔内产生中断。
* @note 这个函数被声明为__weak,以便在用户文件中的其他实现的情况下被覆盖。
* @param Delay 指定延迟时间长度,单位是毫秒。
* @retval 无
*/
Definition at line 389 of file stm32f4xx_hal.c.
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while((HAL_GetTick() - tickstart) < wait)
{
}
}
/**
* @brief 读取指定的输入端口引脚。
* @param GPIOx 其中x可以是(A...K)来选择STM32F429X器件的GPIO外设,或x可以是(A...I)来选择STM32F40XX和STM32F427X器件的GPIO外设。
* @param GPIO_Pin 指定要读取的端口位。
*这个参数可以是GPIO_PIN_x,其中x可以是(0...15)。
* @retval 输入端口引脚的值。
*/
Definition at line 375 of file stm32f4xx_hal_gpio.c.
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));
if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
#define KEY1_Pin GPIO_PIN_3 #define KEY1_GPIO_Port GPIOE
eg: if(0 == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))
/**
* @brief 设置或清除选定的数据端口位。
*
* @注意 这个函数使用GPIOx_BSRR寄存器来允许原子式的读/修改访问。这样,在读取和修改访问之间就不会有IRQ发生的风险。
*
* GPIOx可以是(A...K),用于选择STM32F429X器件的GPIO外设;也可以是(A...I),用于选择STM32F40XX和STM32F427X器件的GPIO外设。
* @param GPIO_Pin 指定要写入的端口位。
* 这个参数可以是GPIO_PIN_x中的一个,其中x可以是(0...15)。
* @param PinState 指定要写到所选位的值。
* 这个参数可以是GPIO_PinState的一个枚举值。
* @arg GPIO_PIN_RESET: 用于清除端口引脚
* @arg GPIO_PIN_SET: 设置端口引脚。
* @retval 无
*/
Definition at line 410 of file stm32f4xx_hal_gpio.c.
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 = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
}
eg: HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
/**
* @brief 这个函数处理EXTI中断请求。
* @param GPIO_Pin 指定连接EXTI线的引脚
* @retval 无
*/
Definition at line 492 of file stm32f4xx_hal_gpio.c.
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);
}
}
/**
* @brief EXTI线路检测的回调函数。
* @param GPIO_Pin 指定连接EXTI线的引脚。
* @retval 无
*/
Definition at line 507 of file stm32f4xx_hal_gpio.c.
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
eg:
#define KEY1_Pin GPIO_PIN_3 #define KEY1_GPIO_Port GPIOE #define KEY1_EXTI_IRQn EXTI3_IRQn #define KEY2_Pin GPIO_PIN_4 #define KEY2_GPIO_Port GPIOE #define KEY2_EXTI_IRQn EXTI4_IRQn #define LED_Pin GPIO_PIN_6 #define LED_GPIO_Port GPIOA
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { /* 判断哪个引脚触发了中断 */ switch(GPIO_Pin) { case GPIO_PIN_3: /* 处理GPIO2发生的中断 */ //点亮LED HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET); break; case GPIO_PIN_4: /* 处理GPIO3发生的中断 */ //熄灭LED HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); break; default: break; } }