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

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如下:

#ifndef _GPIO_H__

#define _GPIO_H__



#include "ac780x_gpio.h"



#define LED1_PORT           (GPIOA)

#define LED1_PIN            (GPIO_PIN2)



#define LED2_PORT           (GPIOA)

#define LED2_PIN            (GPIO_PIN3)



/*LED1动作定义.*/

#define LED1_ON             do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_HIGH);}while(0)

#define LED1_OFF            do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_LOW);}while(0)

#define LED1_TOGGLE         do{if(GPIO_GetPinLevel(LED1_PORT, LED1_PIN)){LED1_OFF;}else{LED1_ON;}}while(0)



/*LED2动作定义.*/

#define LED2_ON             do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_HIGH);}while(0)

#define LED2_OFF            do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_LOW);}while(0)

#define LED2_TOGGLE         do{if(GPIO_GetPinLevel(LED2_PORT, LED2_PIN)){LED2_OFF;}else{LED2_ON;}}while(0)



#define KEY_PORT            (GPIOA)

#define KEY_PIN             (GPIO_PIN11)



#define NMI_PORT            (GPIOB)

#define NMI_PIN             (GPIO_PIN2)





void GPIO_LedInit(void);



void GPIO_NMIInit(void);

void GPIO_MCUGotoSleep(void);





#endif

2、修改gpio.c如下:

#include "gpio.h"

#include "stdbool.h"



void GPIO_LedInit(void)

{

    GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);

    GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);



    GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);

    GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);



    LED1_ON;

    LED2_ON;  

}



void GPIO_NMIInit(void)

{

    GPIO_SetFunc(NMI_PORT, NMI_PIN, GPIO_FUN1);

    SPM_EnableModuleWakeup(SPM_MODULE_NMI, ENABLE);

}



void GPIO_MCUGotoSleep(void)

{

    mdelay(2000);

    LED1_OFF;

    LED2_OFF;



    SysStop();



    LED1_ON;

    LED2_ON;

}

3、 修改main.c如下:

#include "main.h"

#include "AC7802x_irq_cb.h"

#include "ac780x_gpio.h"

#include "gpio.h"



int main(void)

{



    InitDelay();

    GPIO_LedInit();

    GPIO_NMIInit();



    while(1)

    {

        GPIO_MCUGotoSleep();



    }



}

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

TARGET = AC7802_NMI
5、makeclearn 再编译执行make就生成了AC7802_NMI.elf的固件:

arm-none-eabi-size build/AC7802_NMI.elf

   text    data     bss     dec     hex filename

   2904       8    2112    5024    13a0 build/AC7802_NMI.elf

arm-none-eabi-objcopy -O ihex build/AC7802_NMI.elf build/AC7802_NMI.hex

arm-none-eabi-objcopy -O binary -S build/AC7802_NMI.elf build/AC7802_NMI.bin

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__])。

lugl@lugl-virtual-machine:~/ac7802/AC7802_NMI$ pyocd load ./build/AC7802_NMI.elf --target ac78022mbqa

0000372 I Loading /home/lugl/ac7802/AC7802_NMI/build/AC7802_NMI.elf [load_cmd]

[==================================================] 100%

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的中断。相比其他中断,他的配置更新精简。/
---------------------
作者:lulugl
链接:https://bbs.21ic.com/icview-3306378-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值