【GD32F4xx源码】2. GPIO寄存器与库函数(输出模式:点亮LED灯)待修改

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);
		
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值