1. 电路图
PA0:输入GPIO口
按键按下:PA0捕获为1,松开捕获为0,配置为下拉电阻
2. 用户手册介绍
3. 项目流程
1. 使能AHB1时钟
2. 配置控制寄存器为输入模式
3. 端口上拉/下拉寄存器
4. 配置端口输入状态寄存器比较高低电平判断输入是高电平还是低电平
4. 源码
新增文件key.c 和key.h
// key.c
#include "key.h"
void key_init(void){
unsigned int * GPIOA_CTL = (unsigned int *)(BSP_GPIOA + GPIOA_CTL);
* GPIOA_CTL &= ~(0x03);
unsigned int * GPIOA_PUD = (unsigned int *)(BSP_GPIOA + GPIOA_PUD);
* GPIOA_PUD &= ~(0x03);
* GPIOA_PUD |= (0x02);
}
//key.h
#ifndef _KEY_H_
#define _KEY_H_
#define BSP_GPIOA (unsigned int)(0x40020000)
#define KEY_CTL (unsigned int)(0x00)
#define KEY_PUD (unsigned int)(0x0C)
#define KEY_ISTAT (unsigned int)(0x10)
#define GPIOA_ISTAT *(unsigned int*)(BSP_GPIOA+KEY_ISTAT)
#endif
在main函数循环体中,判断GPIOA0的输入状态,并反转LED1的输出电平
//main.c
#include "gd32f4xx.h" // Device header
//#include "gd32f4xx_it.h"
#include "systick.h"
#include <stdio.h>
#include "rcu_config.h"
#include "led.h"
#include "key.h"
#define bit(x) (unsigned int)(1<<x)
int main(){
systick_config();
AHB1_CONF();
LED1_CONF();
unsigned int * GPIOE3_TG = (unsigned int *)(GPIOE_BASE+GPIOx_TG);
//unsigned int * GPIOE3_BOP = (unsigned int *)(GPIOE_BASE+GPIOx_BOP);
while(1)
{
//* GPIOE3_TG |= (0x01<<3);
//*GPIOE3_BOP |= (0x01<<3);
if(GPIOA_ISTAT&(0x0001))
{
delay_1ms(10);
if(GPIOA_ISTAT&(0x0001))
* GPIOE3_TG |= (0x01<<3);
}
}
}
时钟开启放置在rcu_config.c文件,如同前文