[学习笔记] 【杰发科技AC7802x测评】linux下NMI中断体验

[复制链接]
209539|0
 楼主| lulugl 发表于 2023-6-3 14:28 | 显示全部楼层 |阅读模式
AC7802x支持NMI(不可屏蔽中断)。开发板引出了NMI(PB2)到按键。经学习示例:\AC7802x_Demo_V1.0.0\GPIO\SampleCode\04_GPIO_NMI_Wakeup示例,下面体验如何在linux下面实现对NMI的编程。1. 新建文件夹:AC7802_NMI文件夹,并把原来【杰发科技AC7802x测评】linux下开发按键中断试验 - - 21ic电子技术开**坛的工程文件复到该文件夹下:cp -r ./AC7802_GPIO/* ./AC7802_NMI/
2、用vscode打开该文件夹,并修改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_NMIInit(void);
  22. void GPIO_MCUGotoSleep(void);


  23. #endif


2、修改gpio.c如下:
  1. #include "gpio.h"
  2. #include "stdbool.h"

  3. void GPIO_LedInit(void)
  4. {
  5.     GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);
  6.     GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);

  7.     GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);
  8.     GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);

  9.     LED1_ON;
  10.     LED2_ON;  
  11. }

  12. void GPIO_NMIInit(void)
  13. {
  14.     GPIO_SetFunc(NMI_PORT, NMI_PIN, GPIO_FUN1);
  15.     SPM_EnableModuleWakeup(SPM_MODULE_NMI, ENABLE);
  16. }

  17. void GPIO_MCUGotoSleep(void)
  18. {
  19.     mdelay(2000);
  20.     LED1_OFF;
  21.     LED2_OFF;

  22.     SysStop();

  23.     LED1_ON;
  24.     LED2_ON;
  25. }
3、 修改main.c如下:


  1. #include "main.h"
  2. #include "AC7802x_irq_cb.h"
  3. #include "ac780x_gpio.h"
  4. #include "gpio.h"

  5. int main(void)
  6. {

  7.     InitDelay();
  8.     GPIO_LedInit();
  9.     GPIO_NMIInit();

  10.     while(1)
  11.     {
  12.         GPIO_MCUGotoSleep();

  13.     }

  14. }
4、修改makefile修改我们编译的target:

TARGET = AC7802_NMI
5、makeclearn 再编译执行make就生成了AC7802_NMI.elf的固件:
  1. arm-none-eabi-size build/AC7802_NMI.elf
  2.    text    data     bss     dec     hex filename
  3.    2904       8    2112    5024    13a0 build/AC7802_NMI.elf
  4. arm-none-eabi-objcopy -O ihex build/AC7802_NMI.elf build/AC7802_NMI.hex
  5. arm-none-eabi-objcopy -O binary -S build/AC7802_NMI.elf build/AC7802_NMI.bin
  6. lugl@lugl-virtual-machine:~/ac7802/AC7802_NMI$
6、下载,执行:pyocd load ./build/AC7802_NMI.elf --target ac78022mbqa(如果上次是烧写这个软件,需要复位一下,要 进入休眠会导致连接到target失败:0000334 C STLink error (11): Debug power error [__main__])。
  1. lugl@lugl-virtual-machine:~/ac7802/AC7802_NMI$ pyocd load ./build/AC7802_NMI.elf --target ac78022mbqa
  2. 0000372 I Loading /home/lugl/ac7802/AC7802_NMI/build/AC7802_NMI.elf [load_cmd]
  3. [==================================================] 100%
  4. 0000832 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 3072 bytes (6 pages) at 6.54 kB/s [loader]
7、运行效果,开机后两个LED灯会亮2秒钟后两个LED熄灭,然后我按们下Key2(NMI)就会唤醒系统,2秒钟后也会进入休眠模式,LED1、LED2熄灭。
【总结】AC7802是基于Cortex-M0+的内核,支持NMI的中断。相比其他中断,他的配置更新精简。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

844

帖子

12

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