发新帖

[原创] 【STM32F723E-DISCO开发板试用体验】+外部中断取反LED(Cube库)

[复制链接]
发表于 2017-7-4 17:29:23
| 1449 查看 | 1 回复
本帖最后由 SingleYork 于 2017-7-4 17:32 编辑

本例程演示的是通过一个外部按键来实现点灯,仔细观察一下板子,板子上只有两个按键,一个是RESET按键,另一个是USER&WAKEUP按键。很显然,RESET按键是用来复位的,我们肯定不能用了,那么我们就只能用USER&WAKEUP按键了。从原理图上我们可以看到,USER&WAKEUP按键所连接的IO口是PA0口,也是一个外部中断唤醒功能的IO口:




从图上我们可以知道,当USER&WAKEUP按键没有按下的时候,外部电阻将IO口强制拉低了,如果USER&WAKEUP按键按下,PA0口便被外部3.3V拉高,此时相当于产生了一个上升沿。本例中,就是用的外部中断唤醒功能,通过外部按键触发产生一个上升沿信号,来实现LED取反:



因此,首先,我们可以将我们所需要的控制的LED口初始化:


  1. <blockquote>void BSP_LED_Init(Led_TypeDef Led)
复制代码

然后配置EXTI0(连接到PA0脚)为中断 模式:

  1. static void EXTI0_IRQHandler_Config(void)
  2. {
  3.   GPIO_InitTypeDef   GPIO_InitStructure;

  4.   /* Enable GPIOA clock */
  5.   __HAL_RCC_GPIOA_CLK_ENABLE();

  6.   /* Configure PA.00 pin as input floating */
  7.   GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
  8.   GPIO_InitStructure.Pull = GPIO_NOPULL;
  9.   GPIO_InitStructure.Pin = GPIO_PIN_0;
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

  11.   /* Enable and set EXTI line 0 Interrupt to the lowest priority */
  12.   HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
  13.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
  14. }
复制代码

接下来,我们就要来实现按键让LED取反的功能了,这些其实都是在中断函数中实现的,首先我们应该知道,PA0口的中断响应是挂在EXTI0中断线上面的:


  1. void EXTI0_IRQHandler(void)
  2. {
  3.   HAL_GPIO_EXTI_IRQHandler(WAKEUP_BUTTON_PIN);//前面有定义#define WAKEUP_BUTTON_PIN                   GPIO_PIN_0
  4. }
复制代码

外部中断请求是通过HAL_GPIO_EXTI_IRQHandler这个函数来实现的:


  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. {
  3.   /* EXTI line interrupt detected */
  4.   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  5.   {
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);
  8.   }
  9. }
复制代码

最终,在HAL_GPIO_EXTI_IRQHandler函数中,通过调用HAL_GPIO_EXTI_Callback函数,来实现我们所要的功能:

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == GPIO_PIN_0)
  4.   {
  5.     /* Toggle LED6 */
  6.     BSP_LED_Toggle(LED6);
  7.   }
  8. }
复制代码
  1. void BSP_LED_Toggle(Led_TypeDef Led)
  2. {
  3.   HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
  4. }
复制代码
  1. void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_GPIO_PIN(GPIO_Pin));

  5.   GPIOx->ODR ^= GPIO_Pin;
  6. }
复制代码

演示效果:







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 9 +13 收起 理由
lygo + 1
神马姐 + 5 赞一个!
donatello + 1
LiuYang + 1
new world + 1
chen0000009 + 1
汉云 + 1
黄莨元 + 1
Sourcelink + 1

查看全部评分

我要点赞 11

举报

发表于 2017-7-11 17:32:10
楼楼板子论坛申请的?
我要点赞 0

举报

您需要登录后才可以回帖 登录 | 立即注册