GD32F207 GPIO实验

[复制链接]
181|13
 楼主 | 2018-9-30 18:18 | 显示全部楼层 |阅读模式
GD32F207 GPIO 介绍在嵌入式微处理器上通常提供了一种“通用可编程 I/O 端口”,也就是 GPIO,英文全称
General-Purpose Input /Output Ports。
在 GD32F207 芯片上, I/O 引脚可以被软件设置成各种不同的功能,如输入或输出。 GPIO
引脚又被分为 GPIOA、 GPIOB……不同的组,每组端口分为 0~15,共 16 个不同的引脚,对
于不同型号的芯片,端口的组和引脚的数量不同。 PA0 ~ PA15 PB0 ~ PB15, PC0 ~
PC15…这样的名字来描述。每个 GPIO 端口有相关的控制和配置寄存器以满足特定应用的需求。
GPIO 端口和和其他的备用功能(AFs)复用同一管脚,在特定的封装下获得最大的的灵活性。
GPIO 管脚通过配置相关的寄存器可以用作备用功能管脚,不管是备用功能输入还是备用功能输
  

 楼主 | 2018-9-30 18:19 | 显示全部楼层
每一个 GPIO 可以软件配置为输出(推挽或开漏), 输入,外设备用功能或模拟模式。每一个
GPIO 管脚可以配置为上拉,下拉或无上拉/下拉。除了模拟模式外,所有的管脚 GPIOs 都具备
大电流驱动能力。
 楼主 | 2018-9-30 18:20 | 显示全部楼层
发光二极管简称为 LED,是由各种化合物制成的二极管。 当电子与空穴复合时能辐射出
可见光,因而可以用来制成发光二极管。 LED 在电子设备中被大量采用,通过它能简单有效
的提示系统状态。驱动 LED 十分简单,只需要通过 GPIO 的电压变化就可以。
 楼主 | 2018-9-30 18:21 | 显示全部楼层
硬件连接
开发板共有 3 个 LED,原理图如下所示:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-9-30 18:21 | 显示全部楼层
代码分析
#include "example.h"
#if (EVB_EXAMPLE == LED_EXAMPLE)
/* 用户应用程序入口函数 */
int main(void)
{
int i;
/* 配置使能评估板上的设备 */
EvbSetupBoard();
PRINTF("感谢使用 Colibri 开发板\r\n");
PRINTF("\r\n");
PRINTF("##### LED 实验 #####\r\n");
PRINTF("\r\n");
while(1)
{
for (i = 0; i< 0x7fffff; i++);
EvbLedControl(LED1, LED_ON);
EvbLedControl(LED2, LED_ON);
EvbLedControl(LED3, LED_ON);
for (i = 0; i< 0x7fffff; i++);
EvbLedControl(LED1, LED_OFF);
EvbLedControl(LED2, LED_OFF);
EvbLedControl(LED3, LED_OFF);
}
}
 楼主 | 2018-9-30 18:23 | 显示全部楼层
程序通过函数 EVB_LEDConfig()配置好 LED 使用到的 GPIO。
void EvbLedConfig(void)
{
GPIO_InitPara GPIO_InitStructure;
RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 |
GPIO_PIN_12|GPIO_PIN_13;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12
|GPIO_PIN_13;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
 楼主 | 2018-9-30 18:23 | 显示全部楼层
这里首先使能 GPIOC 的时钟,然后设置 GPIOD11\12\13 的管脚为输出模式,翻转速率
为 50M。 GPIO_InitTypeDef 类型结构体包含 GPIO_Pin、 GPIO_Speed、 GPIO_Mode 三个成员,
我们对这三个成员赋予不同的数值可以对 GPIO 端口进行不同的配置。
 楼主 | 2018-9-30 18:23 | 显示全部楼层
在主函数的循环体中, 我们通过延时函数间隔的控制相关的 GPIO 输出电压,这样就可
以点量和熄灭各个 LED,造成闪烁的效果。 电压的控制是通过库函数 GPIO_SetBits()完成的;
void EvbLedControl(int index, int cmd)
{
switch (index)
{
case LED1:
{
if (cmd == LED_ON)
{
GPIO_SetBits(GPIOD,GPIO_PIN_11); /*µãÁÁLed1µÆ*/
}
else
{
GPIO_ResetBits(GPIOD,GPIO_PIN_11); /*ϨÃðLed1µÆ*/
}
break;
}
case LED2:
{
if (cmd == LED_ON)
{
GPIO_SetBits(GPIOD,GPIO_PIN_12);
}
else
{
GPIO_ResetBits(GPIOD,GPIO_PIN_12); /*ϨÃðLed2µÆ*/
}
break;
}
case LED3:
{
if (cmd == LED_ON)
{
GPIO_SetBits(GPIOD,GPIO_PIN_13); /*µãÁÁLed3µÆ*/
}
else
{
GPIO_ResetBits(GPIOD,GPIO_PIN_13); /*ϨÃðLed3µÆ*/
}
break;
}
default:
{
if (cmd == LED_ON)
{
GPIO_SetBits(GPIOD,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13);
/*µãÁÁËùÓеĵÆ*/
}
else
{
GPIO_ResetBits(GPIOD,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13);
/*ϨÃðËùÓеĵÆ*/
}
break;
}
}
}
 楼主 | 2018-9-30 18:24 | 显示全部楼层
实验结果
将 Colibri 开发板插上 USB 供电, 即可看到串板载 LED 会按顺序逐次点量和熄灭。
 楼主 | 2018-9-30 18:31 | 显示全部楼层
硬件连接
开发板共有多个 GPIO, 我们选择 GPIOB2 来连接蜂鸣器
 楼主 | 2018-9-30 18:31 | 显示全部楼层
代码分析
#include "example.h"
#if (EVB_EXAMPLE == BUZZER_EXAMPLE)
/* 处理器 BOOT 之后会调用 main 函数,必须提供 */
int main(void)
{
int i;
/* 配置使能评估板上的 BUZZER 设备 */
EVB_BuzzerConfig();
while(1)
{
for (i = 0; i< 0xffff; i++);
EVB_BuzzerControl(1);
for (i = 0; i< 0xffff; i++);
EVB_BuzzerControl(0);
}
}
#endif
 楼主 | 2018-9-30 18:32 | 显示全部楼层
程序通过函数 EVB_LEDConfig()配置好蜂鸣器使用到的 GPIO。
void EVB_BuzzerConfig(void)
{
GPIO_InitPara GPIO_InitStructure;
/* 使能 GPIOB 时钟 */
RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);
/* PD1 用于控制蜂鸣器 */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void EVB_BuzzerControl(int value)
{if (value)
{
GPIO_SetBits(GPIOD, GPIO_PIN_1);
}
else
{
GPIO_ResetBits(GPIOD, GPIO_PIN_1);
}
}
 楼主 | 2018-9-30 18:32 | 显示全部楼层
这里首先使能 GPIOC 的时钟,然后设置 GPIOD1 的管脚为输出模式,翻转速率为 50M。
GPIO_InitTypeDef 类型结构体包含 GPIO_Pin、 GPIO_Speed、 GPIO_Mode 三个成员,我们对这
三个成员赋予不同的数值可以对 GPIO 端口进行不同的配置。
 楼主 | 2018-9-30 18:42 | 显示全部楼层
在主函数的循环体中, 我们通过延时函数间隔的控制相关的 GPIO 输出电压,这样就可
以驱动蜂鸣器。 电压的控制是通过库函数 GPIO_SetBits()完成的;
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表