第三章 RGB LED试验 W7500 最简单的外设莫过于 IO 口的高低电平控制了,本章将通过一个经典的跑马灯程序,带大家开启 W7500EVB 之旅, 通过本章的学习, 将了解到W7500的 IO 口作为输出使用的方法。 在本章中, 我们将通过代码控制W7500EVB 开发板上的RGBLED: 红绿蓝交替闪烁。
本章分为如下四个小节:
3.1 W7500 IO 口简介
3.2 硬件设计
3.3 软件设计
3.4 下载验证
3.1 W7500 IO 口简介本章将要实现的是控制 W7500EVB 开发板上的RGB LED 实现一个跑马灯的效果, 该实验的关键在于如何控制W7500 的 IO口输出。了解了W7500的 IO 口是如何输出的,就可以实现跑马灯了。通过这一章的学习, 将初步掌握W7500基本 IO 口的使用,这是迈向W7500的第一步。 W7500 的 IO 口可以由软件配置成如下 3 种模式
1. 输入模式
2. 输出模式
3. 复用功能模式 每个 IO口可以自由编程,都有各自的输出使能位和清除输出使能位以及其它复用功能的选择。
下面我们来看一下GPIO的初始化,我们可以调用GPIO_Init函数来进行初始化。
[mw_shl_code=c,true]void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);[/mw_shl_code]
GPIO_Init函数有两个参数, 第一个参数GPIOx是用来指定 GPIO,取值范围为 GPIOA~GPIOD。第二个参数GPIO_InitStruct是初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。下面来看看这个结构体的定义。
[mw_shl_code=applescript,true]typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOPad_TypeDef GPIO_Pad;
}GPIO_InitTypeDef;
[/mw_shl_code]
这里我们通过初始化一个GPIO来讲解这个结构体成员变量的含义。
初始化GPIO的常用格式是。
[mw_shl_code=c,true]GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PAD_AFConfig(PAD_PC, GPIO_Pin_5, PAD_AF1);
[/mw_shl_code]
上面代码的意思是设置GPIOC的第5个IO口为输出模式。从上面初始化代码可以看出,结构体GPIO_InitStructure 的第一个成员变量GPIO_Pin 用来设置是要初始化哪个或者哪些 IO口; 第二个成员变量 GPIO_Mode 是用来设置对应 IO 口的输出输入模式,这些模式是上面我们讲解的3个模式,在 W7500x_gpio.h中是通过一个枚举类型定义的。 [mw_shl_code=c,true]typedef enum
{
GPIO_Mode_IN = 0x00,
GPIO_Mode_OUT = 0x01,
GPIO_Mode_AF = 0x02
}GPIOMode_TypeDef;
[/mw_shl_code]
如果想知道某个IO口的电平状态,可以读取DATA寄存器的某个位的状态就可以了。在固件库中操作DATA寄存器读取IO口数据,是通过GPIO_ReadInputDataBit函数实现的,使用起来是比较简单的:
[mw_shl_code=c,true]uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);[/mw_shl_code]
比如我要读GPIOC_5 的电平状态,那么方法是。
[mw_shl_code=c,true]GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_5);[/mw_shl_code]
返回值是1(Bit_SET)或者0(Bit_RESET);
如果想要某个IO口输出高电平状态或低电平状态,只要设置GPIO字节屏蔽访问寄存器的某个位就可以了。使用起来也是比较简单的。在固件库中操作GPIO字节屏蔽访问寄存器设置IO口,是通过GPIO_SetBits函数或者GPIO_ResetBits函数。
[mw_shl_code=c,true]void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
[/mw_shl_code]
如果我要将GPIOC_5 的电平状态拉高,那么方法是:
[mw_shl_code=applescript,true]GPIO_SetBits(GPIOC, GPIO_Pin_5);[/mw_shl_code]
如果我要将GPIOC_5 的电平状态拉低,那么方法是:
[mw_shl_code=c,true]GPIO_ResetBits(GPIOC, GPIO_Pin_5);[/mw_shl_code]
如果想要使用某个IO口的备用功能,只要设置功能引脚备用功能选择寄存器(AFR)就可以了。在固件库中操作该寄存器的设置的PAD_AFConfig函数:
[mw_shl_code=c,true]void PAD_AFConfig(PAD_Type Px, uint16_t GPIO_Pin, PAD_AF_TypeDef P_AF);[/mw_shl_code]
| 功能选择寄存器值 |
| 00(复位值) | 01 | 10 | 11 | 功能引脚 | PIN | Normal Function | 2nd Function | 3rd Function | 4th Function | PA_00 | 29 | GPIOA_0 | GPIOA_0 | PWM6/CAP6 | | PA_01 | 30 | GPIOA_1 | GPIOA_1 | PWM7/CAP7 | | PA_02 | 31 | GPIOA_2 | GPIOA_2 | CLKOUT | | PA_03 | 49 | SWCLK | GPIOA_3 | | | PA_04 | 50 | SWDIO | GPIOA_4 | | | PA_05 | 33 | SSEL0 | GPIOA_5 | SCL1 | PWM2/CAP2 | PA_06 | 34 | SCLK0 | GPIOA_6 | SDA1 | PWM3/CAP3 | PA_07 | 35 | MISO0 | GPIOA_7 | U_CTS1 | PWM4/CAP4 | PA_08 | 36 | MOSI0 | GPIOA_8 | U_RTS1 | PWM5/CAP5 | PA_09 | 37 | SCL0 | GPIOA_9 | U_TXD1 | PWM6/CAP6 | PA_10 | 38 | SDA0 | GPIOA_10 | U_RXD1 | PWM7/CAP7 | PA_11 | 40 | U_CTS0 | GPIOA_11 | SSEL1 | | PA_12 | 41 | U_RTS0 | GPIOA_12 | SCLK1 | | PA_13 | 42 | U_TXD0 | GPIOA_13 | MISO1 | | PA_14 | 43 | U_RXD0 | GPIOA_14 | MOSI1 | | PA_15 | 44 | GPIOA_15 | GPIOA_15 | | | PB_00 | 45 | SSEL1 | GPIOB_0 | U_CTS0 | | PB_01 | 46 | SCLK1 | GPIOB_1 | U_RTS0 | | PB_02 | 47 | MISO1 | GPIOB_2 | U_TXD0 | | PB_03 | 48 | MOSI1 | GPIOB_3 | U_RXD0 | | PB_04 | 24 | TXEN | GPIOB_4 | | | PB_05 | 25 | COL | GPIOB_5 | | | PB_06 | 16 | RXD3 | GPIOB_6 | | | PB_07 | 17 | RXCLK | GPIOB_7 | | | PB_08 | 18 | DUP | GPIOB_8 | | | PB_09 | 19 | TXCLK | GPIOB_9 | | | PB_10 | 20 | TXD0 | GPIOB_10 | | | PB_11 | 21 | TXD1 | GPIOB_11 | | | PB_12 | 22 | TXD2 | GPIOB_12 | | | PB_13 | 23 | TXD3 | GPIOB_13 | | | PB_14 | 26 | | GPIOB_14 | | | PB_15 | 27 | | GPIOB_15 | |
|
|