1. 引脚说明
高电平驱动
2. 基本知识
寄存器说明:
GPIOx_CTL 配置选择输入输出复用、模拟模式
GPIOx_OMODE 输出模式寄存器
GPIOx_OSPD 输出端口的最大速度
GPIOx_PUD 配置为浮空
GPIOx_OCTL 输出寄存器
上图说明
a. 输入驱动和输出驱动增大驱动能力
b. ESD保护内部电路,当电压高于VDD,电流流向VDD,电压低于GND,电流从GND流向I/O pin
c. 位操作寄存器作用,只更改某一位,不需要对整个寄存器操作
c. 右侧的开关电路,则是上拉与下拉电阻(在引脚内部),只在输入时有用,上拉连通到Vdd,下拉连通到Vss,给输入提供一个默认的输入电平,当没有输入时,确定是高电平还是低电平
d. 施密特触发器特点:当输入高于上阈值,会瞬间变为高电平,当输入低于下阈值,会瞬间变为低电平;去除一定的抖振;
e. PMOS 和NMOS,电子开关,上管导通接到VDD,输出高电压,下管导通接到Vss,输出低电压,开漏输出下,PMos无效,只有低电平和高阻两种状态,开漏模式可以作为通信协议的驱动方式;
3. 项目及程序源码
流程:
开启GPIO的RCU时钟
配置为输出模式(端口控制寄存器)
配置输出的模式(端口输出模式寄存器)
配置输出的速度(端口输出速度寄存器)
配置上拉与下拉 (端口上拉/下拉寄存器)
输出内容 (端口位操作寄存器)
项目配置所需文件
1. 复制如下固件库到./hardware目录下
2. 复制如下系统时钟及中断相关文件到./user目录下
3. 在keil项目中添加已有文件到对应group下
4. 在魔术棒->C/C++下添加头文件目录
与stm32不同,GD32的GPIO挂载在AHB1总线上;首先需要初始化AHB1的时钟,如下:
// AHB1的地址:RCU_base+0x30
#define AHB1_ADDR *(unsigned int *)(0x40023800+0x30)
点亮led1小demo
#include "rcu_config.h"
// AHB1 RCU config
void AHB1_CONF(void)
{
//A E D G
AHB1_ADDR |= (0x01<<A);
AHB1_ADDR |= (0x01<<E);
AHB1_ADDR |= (0x01<<G);
AHB1_ADDR |= (0x01<<D);
}
// rcu_config.h
#ifndef _RCU_CONFIG_H_
#define _RCU_CONFIG_H_
#define RCU_AHB1 *(unsigned int *)(0x40023800+0x30)
enum{
A=0,B,C,D,E,F,G,H,I
};
void AHB1_CONF(void);
#endif
#include "led.h"
//E3//D7//G3//A5
void LED1_CONF(void){
unsigned int * GPIOE3_CTL = (unsigned int *)(GPIOE_BASE+GPIOx_CTL);
*GPIOE3_CTL &= ~(0x03<<(3*2));
*GPIOE3_CTL |= (0x01<<(3*2));
unsigned int * GPIOE3_OMODE = (unsigned int *)(GPIOE_BASE + GPIOx_OMODE);
*GPIOE3_OMODE &= ~(0x01<<3); //必须配置为推挽,开漏只有低电平和高阻模式
unsigned int * GPIOE3_OSPD = (unsigned int *)(GPIOE_BASE + GPIOx_OSPD);
* GPIOE3_OSPD &= ~(0x03<<(3*2));
* GPIOE3_OSPD |= (0x02<<(3*2));
unsigned int * GPIOE3_PUD = (unsigned int *)(GPIOE_BASE + GPIOx_PUD);
* GPIOE3_PUD &= ~(0x03<<(3*2));
unsigned int * GPIOE3_OCTL = (unsigned int *)(GPIOE_BASE+GPIOx_OCTL);
* GPIOE3_OCTL |= (0x01<<3);
}
void LED2_CONF(void){
}
void LED3_CONF(void){
}
void LED4_CONF(void){
}
#ifndef _LED_H_
#define _LED_H_
#define GPIOA_BASE (unsigned int)(0x40020000)
#define GPIOD_BASE (unsigned int)(0x40020C00)
#define GPIOE_BASE (unsigned int)(0x40021000)
#define GPIOG_BASE (unsigned int)(0x40021800)
#define GPIOx_CTL (unsigned int)(0x00)
#define GPIOx_OMODE (unsigned int)(0x04)
#define GPIOx_OSPD (unsigned int)(0x08)
#define GPIOx_PUD (unsigned int)(0x0C)
#define GPIOx_OCTL (unsigned int)(0x14)
#define GPIOx_BOP (unsigned int)(0x18)
#define GPIOx_TG (unsigned int)(0x2c)
void LED1_CONF(void); //E3
void LED2_CONF(void); //D7
void LED3_CONF(void); //G3
void LED4_CONF(void); //A5
#endif
//main.c
#include "gd32f4xx.h" // Device header
//#include "gd32f4xx_it.h"
#include "systick.h"
#include <stdio.h>
#include "rcu_config.h"
#include "led.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);
delay_1ms(1000);
* GPIOE3_TG |= (0x01<<3);
delay_1ms(1000);
}
}