本次用到GPIO控制外设,通过分别控制按键(SW2)以及RGB灯中的绿灯。通过按键是否按下做逻辑判断,当按键,LED管脚为高电平;反之,为低电平。
#一.硬件GPIO原理
通过查找WBZ2451的原理图,文件在之前给了,分别控制的是RGB灯的中的绿灯和按键SW2。下面是其原理图。
RGB灯,引脚为PB3
按键SW2,引脚为PB4
#二.代码分析
打开工程,其在csp_apps_pic32cxbz2_wbz45\apps\gpio\gpio_led_on_off_polling\firmware\src\config\wbz451_curiosity\peripheral\gpio目录下,直接打开工程就好。
主程序,痛过while循环,利用按键翻转LED的电平,代码如下:
```c
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
while ( true )
{
if(SWITCH_Get() == SWITCH_PRESSED_STATE)
{
/* Turn ON LED */
LED_On();
}
else
{
/* Turn OFF LED */
LED_Off();
}
}
/* Execution should not come here during normal operation */
return ( EXIT_FAILURE );
}
```
```c
#define SWITCH_PRESSED_STATE 0 // Active LOW switch
#define LED_On() LED_Set()
#define LED_Off() LED_Clear()
```
主要调用LED_On和LED_Off函数,而led又是通过GPIO控制,主要由头文件设置和c文件函数功能,代码如下:
GPIO.h
led的设置
```c
#define LED_Set() (GPIOB_REGS->GPIO_LATSET = (1U<<3U))
#define LED_Clear() (GPIOB_REGS->GPIO_LATCLR = (1U<<3U))
#define LED_Toggle() (GPIOB_REGS->GPIO_LATINV= (1U<<3U))
#define LED_Get() ((GPIOB_REGS->GPIO_PORT >> 3U) & 0x1U)
#define LED_OutputEnable() (GPIOB_REGS->GPIO_TRISCLR = (1U<<3U))
#define LED_InputEnable() (GPIOB_REGS->GPIO_TRISSET = (1U<<3U))
#define LED_PIN GPIO_PIN_RB3
```
sw2的设置
```c
#define SWITCH_Set() (GPIOB_REGS->GPIO_LATSET = (1U<<4U))
#define SWITCH_Clear() (GPIOB_REGS->GPIO_LATCLR = (1U<<4U))
#define SWITCH_Toggle() (GPIOB_REGS->GPIO_LATINV= (1U<<4U))
#define SWITCH_Get() ((GPIOB_REGS->GPIO_PORT >> 4U) & 0x1U)
#define SWITCH_OutputEnable() (GPIOB_REGS->GPIO_TRISCLR = (1U<<4U))
#define SWITCH_InputEnable() (GPIOB_REGS->GPIO_TRISSET = (1U<<4U))
```
GPIO.c
GPIO功能函数
```
void GPIO_PortWrite(GPIO_PORT port, uint32_t mask, uint32_t value);
uint32_t GPIO_PortLatchRead ( GPIO_PORT port );
void GPIO_PortSet(GPIO_PORT port, uint32_t mask);
void GPIO_PortClear(GPIO_PORT port, uint32_t mask);
void GPIO_PortToggle(GPIO_PORT port, uint32_t mask);
void GPIO_PortInputEnable(GPIO_PORT port, uint32_t mask);
void GPIO_PortOutputEnable(GPIO_PORT port, uint32_t mask);
```
编译并烧录,配置这些均可以参考前面的设置,这里不再继续讲了。
#三.现象
按下sw2,绿灯亮;松开,绿灯灭。
灯现象
谢谢大家,有问题欢迎交流,对于zigbee目前测试不了,没有多余的板子。