[G32A] 极海G32A1465汽车通用MCU评估板测试02:按键中断控制LED亮灭

[复制链接]
886|2
 楼主| 聪聪哥哥 发表于 2025-1-13 20:24 | 显示全部楼层 |阅读模式
一:G32产品中的 Cortex-M4F 内核集成了嵌套向量中断控制器(Nested VectoredInterrupt Controller(NVIC)),它和内核紧密耦合,能高效、低延迟处理异常和中断、电源管理控制。
主要如下:
16个可编程的优先级(使用4位的中断优先级)
NVIC的不可屏蔽中断请求由外部 NMI信号控制配置
NMI信号复用的引脚,才可生成不可屏蔽中断请求
这里,我测试使用板载的按键来控制LED的闪烁,使用按键的IO口触发中断。
二:硬件设计:
2.1 按键原理图如下:
1.png 2.png
如上所示:使用PMC12和PMC13引脚来当作外部的中断的触发来源:
三:软件代码编写:

按键中断处理函数编写:发现官方的例程中一个小的 bug;
  1. void KEY_IRQHandler(void)
  2. {
  3.     /* Get interrupt flag */
  4.     if((PINS_ReadPmInt**(PMC) & (1<<KEY1_PIN)) != 0)
  5.     {
  6. //        LED_On(LED_GREEN_PIN);

  7.                                 PINS_ClrPins(LED_GREEN_GPIO_BASE, 1U << LED_GREEN_PIN);
  8.         /* Clear interrupt flag */
  9.         PINS_ClrPinInt**Cmd(PMC, KEY1_PIN);
  10.     }
  11.     else if((PINS_ReadPmInt**(PMC) & (1<<KEY2_PIN)) != 0)
  12.     {
  13. //        LED_Off(LED_GREEN_PIN);

  14.                                 PINS_WritePin(GPIOD, 0U, 1);
  15.                                 PINS_WritePin(GPIOD, 15U, 1);
  16.                                 PINS_WritePin(GPIOD, 16U, 1);
  17.         /* Clear interrupt flag */
  18.         PINS_ClrPinInt**Cmd(PMC, KEY2_PIN);
  19.     }
  20.     else
  21.     {
  22.         /* Clear interrupt flags for all pins in the port */
  23.         PINS_ClrPmInt**Cmd(PMC);
  24.     }
  25. }

在官方的代码文件:PINS/PINS_ISR中进行测试,发现 当按下按键时候,LED不能正常工作,LED_ON 代码不能改变IO口的电平,这里做一个简单的修改,主代码如上所示,修改完成之后,按下key1 按键时 绿色灯工作,按下key2按键时,绿色灯熄灭。
测试功能如下所示:
WeChat_20250113200814 00_00_00-00_00_30.gif
解决办法:
这里官方定义的函数LED_ON 原型如下所示:测试发现函数本身没有任何问题,只是在调用时候出现问题。
  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] Turn on requested LED
  3. *
  4. * @param num  LED number
  5. *
  6. * @retval None.
  7. */
  8. void LED_On(uint32_t num)
  9. {
  10.     if (num < LED_COUNT)
  11.     {
  12.         PINS_ClrPins(ledGPIO[num], 1U << ledPIN[num]);
  13.     }
  14. }
这里定义的LED数组为
  1. GPIO_T* ledGPIO[3] = {LED_RED_GPIO_BASE, LED_GREEN_GPIO_BASE, LED_BLUE_GPIO_BASE};
这里操作的时候需要,直接操作为:LED_ON(0);LED_ON(1);LED_ON(2); 而不应该去操作 LED_ON(LED_GREEN_PIN);
修改之后,测试代码功能正常。
ForgottenRealm 发表于 2025-1-21 10:48 | 显示全部楼层
这个函数的传入参数是个uint32的变量,用LED_GREEN_PIN应该就是不行吧
 楼主| 聪聪哥哥 发表于 2025-2-1 16:13 | 显示全部楼层
ForgottenRealm 发表于 2025-1-21 10:48
这个函数的传入参数是个uint32的变量,用LED_GREEN_PIN应该就是不行吧

里面有宏定义得
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

307

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部