[学习笔记] 【杰发科技AC7802x测评】从零创建按键中断控制LED工程

[复制链接]
 楼主| lulugl 发表于 2023-6-1 07:06 | 显示全部楼层 |阅读模式
<
【目的】学习使用GPIO的基本配置、中断
【学习资料】官方示例AC7802x_Demo_V1.0.0\GPIO\SampleCode\02_GPIO_Exti
【学习文档】 AC7802x GPIO模块应用笔记.pdf (627.04 KB, 下载次数: 2)
【实现步聚】
1、新建一个文件夹用于存放工程
新建文件夹.png
2、新建一个mdk工程,文件夹选刚才新建的gpio_exti,工程命名为,gipo_exti
新建mdk工程.png 新建exit.png
3、在弹出的菜单中选择芯片型号为:AC78022MBQA
选择芯片.png
4、选择启动以及驱动库:
选择全部的devic.png
5、这样我们就生成了基本工程:
生成的基本工程.png
6、在工程目录下面我们新建一个User文件夹,用于存放用户的文件:
新建User文件夹.png
7、新建main.c、gpio.c、gpio.h到User目录下,并且重命名工程名称,把main.c、gpio.c添加到分组中:
重命名以及添加文件.png
8、按下图添加头文件目录到工程中:
添加头文件.png
9、编写main.c函数如下:

  1. int main(void)
  2. {
  3.     while (1)
  4.     {
  5.     }
  6. }
10、编译,没有错误,没有警告:
  1. Program Size: Code=1356 RO-data=224 RW-data=16 ZI-data=1160  
  2. ".\Objects\Demo.axf" - 0 Error(s), 0 Warning(s).
  3. Build Time Elapsed:  00:00:01
11、编写gpio.h内容如下:


  1. #ifndef _GPIO_H
  2. #define _GPIO_H

  3. #include "ac780x_gpio.h"


  4. #define LED1_PORT           (GPIOA)
  5. #define LED1_PIN            (GPIO_PIN2)

  6. #define LED2_PORT           (GPIOA)
  7. #define LED2_PIN            (GPIO_PIN3)

  8. /*LED1动作定义.*/
  9. #define LED1_ON             do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_HIGH);}while(0)
  10. #define LED1_OFF            do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_LOW);}while(0)
  11. #define LED1_TOGGLE         do{if(GPIO_GetPinLevel(LED1_PORT, LED1_PIN)){LED1_OFF;}else{LED1_ON;}}while(0)

  12. /*LED2动作定义.*/
  13. #define LED2_ON             do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_HIGH);}while(0)
  14. #define LED2_OFF            do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_LOW);}while(0)
  15. #define LED2_TOGGLE         do{if(GPIO_GetPinLevel(LED2_PORT, LED2_PIN)){LED2_OFF;}else{LED2_ON;}}while(0)

  16. #define KEY_PORT            (GPIOA)
  17. #define KEY_PIN             (GPIO_PIN11)

  18. #define NMI_PORT            (GPIOB)
  19. #define NMI_PIN             (GPIO_PIN2)


  20. void GPIO_LedInit(void);


  21. void GPIO_KeyInit(void);



  22. #endif /* _GPIO_H */
12、编写gpio.c内容如下:

  1. /* ===========================================  Includes  =========================================== */
  2. #include "gpio.h"
  3. #include "stdbool.h"

  4. /* ============================================  Define  ============================================ */
  5. #define GET_KEY1_STS()      (bool)(GPIO_GetPinLevel(KEY_PORT, KEY_PIN))
  6. #define GET_NMI_STS()       (bool)(GPIO_GetPinLevel(NMI_PORT, NMI_PIN))


  7. void EXTI_Key_Callback(void *device, uint32_t wpara, uint32_t lpara)
  8. {
  9.     if (GET_KEY1_STS() == false)
  10.     {
  11.         LED1_TOGGLE;
  12.         LED2_TOGGLE;
  13.     }
  14. }


  15. void GPIO_LedInit(void)
  16. {
  17.     /*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
  18.       有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
  19.     GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);/*功能复用选择.*/
  20.     GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);

  21.     /*设置LED引脚为GPIO输出.*/
  22.     GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);
  23.     GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);

  24.     LED1_ON;
  25.     LED2_OFF;
  26. }


  27. void GPIO_KeyInit(void)
  28. {
  29.     /*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
  30.       有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
  31.     GPIO_SetFunc(KEY_PORT, KEY_PIN, GPIO_FUN0); /*功能复用选择.*/

  32.     /*设置按键引脚为输入,检测按键动作.*/
  33.     GPIO_SetDir(KEY_PORT, KEY_PIN, GPIO_IN);    /*设置为输入模式.*/

  34.     /*使能KEY1的外部中断,设置为下降沿产生中断,当按下按键时产生中断.*/
  35.     GPIO_EnableExtInterrupt(KEY_PORT, KEY_PIN, EXTI_TRIGGER_FALLING);

  36.     /*设置外部中断,中断回调函数.*/
  37.     GPIO_SetCallback(KEY_PIN, EXTI_Key_Callback);
  38. }



  39. /* =============================================  EOF  ============================================== */
12、修改main.c如下:
  1. #include "gpio.h"

  2. int main(void)
  3. {
  4.     InitDelay();
  5.     InitDebug();
  6.     GPIO_LedInit();
  7.     GPIO_KeyInit();

  8.     printf("Hi! This is GPIO external IRQ demo !\r\n");
  9.     while (1)
  10.     {
  11.     }
  12. }
编译后无警告无错误
  1. Program Size: Code=3960 RO-data=224 RW-data=48 ZI-data=1160  
  2. ".\Objects\Demo.axf" - 0 Error(s), 0 Warning(s).
  3. Build Time Elapsed:  00:00:01
12、选择下载器为stlink:
选择下载器.png
13、下载后就可以实验按键控制LED的亮与灭了。
【总结】这次从头创建工程,熟悉AC7802x的工程结构。同时学习了gpio中断的例程。
选择启动创建文件.png
ccook11 发表于 2023-6-10 09:45 | 显示全部楼层
AC7802x入门的基本资料。              
ingramward 发表于 2023-6-10 11:02 | 显示全部楼层
可以实现单击或则双击的判断吗?              
 楼主| lulugl 发表于 2023-6-10 11:20 | 显示全部楼层
ingramward 发表于 2023-6-10 11:02
可以实现单击或则双击的判断吗?

大佬,双击没有去做驱动列。
updownq 发表于 2023-6-10 11:27 | 显示全部楼层
外部中断的影响速度怎么样?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

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

180

主题

830

帖子

12

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