【目的】学习使用GPIO的基本配置、中断
【学习资料】官方示例AC7802x_Demo_V1.0.0\GPIO\SampleCode\02_GPIO_Exti
【学习文档】
AC7802x GPIO模块应用笔记.pdf
(627.04 KB)
【实现步聚】
1、新建一个文件夹用于存放工程
2、新建一个mdk工程,文件夹选刚才新建的gpio_exti,工程命名为,gipo_exti
3、在弹出的菜单中选择芯片型号为:AC78022MBQA
4、选择启动以及驱动库:
5、这样我们就生成了基本工程:
6、在工程目录下面我们新建一个User文件夹,用于存放用户的文件:
7、新建main.c、gpio.c、gpio.h到User目录下,并且重命名工程名称,把main.c、gpio.c添加到分组中:
8、按下图添加头文件目录到工程中:
9、编写main.c函数如下:
int main(void)
{
while (1)
{
}
}
10、编译,没有错误,没有警告:
Program Size: Code=1356 RO-data=224 RW-data=16 ZI-data=1160
".\Objects\Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
11、编写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_KeyInit(void);
#endif /* _GPIO_H */
12、编写gpio.c内容如下:
/* =========================================== Includes =========================================== */
#include "gpio.h"
#include "stdbool.h"
/* ============================================ Define ============================================ */
#define GET_KEY1_STS() (bool)(GPIO_GetPinLevel(KEY_PORT, KEY_PIN))
#define GET_NMI_STS() (bool)(GPIO_GetPinLevel(NMI_PORT, NMI_PIN))
void EXTI_Key_Callback(void *device, uint32_t wpara, uint32_t lpara)
{
if (GET_KEY1_STS() == false)
{
LED1_TOGGLE;
LED2_TOGGLE;
}
}
void GPIO_LedInit(void)
{
/*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);/*功能复用选择.*/
GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);
/*设置LED引脚为GPIO输出.*/
GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);
GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);
LED1_ON;
LED2_OFF;
}
void GPIO_KeyInit(void)
{
/*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
GPIO_SetFunc(KEY_PORT, KEY_PIN, GPIO_FUN0); /*功能复用选择.*/
/*设置按键引脚为输入,检测按键动作.*/
GPIO_SetDir(KEY_PORT, KEY_PIN, GPIO_IN); /*设置为输入模式.*/
/*使能KEY1的外部中断,设置为下降沿产生中断,当按下按键时产生中断.*/
GPIO_EnableExtInterrupt(KEY_PORT, KEY_PIN, EXTI_TRIGGER_FALLING);
/*设置外部中断,中断回调函数.*/
GPIO_SetCallback(KEY_PIN, EXTI_Key_Callback);
}
/* ============================================= EOF ============================================== */
12、修改main.c如下:
#include "gpio.h"
int main(void)
{
InitDelay();
InitDebug();
GPIO_LedInit();
GPIO_KeyInit();
printf("Hi! This is GPIO external IRQ demo !\r\n");
while (1)
{
}
}
编译后无警告无错误
Program Size: Code=3960 RO-data=224 RW-data=48 ZI-data=1160
".\Objects\Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
12、选择下载器为stlink:
13、下载后就可以实验按键控制LED的亮与灭了。
【总结】这次从头创建工程,熟悉AC7802x的工程结构。同时学习了gpio中断的例程。
|