swzswz 发表于 2023-8-27 16:25

【Microchip WBZ451 Curiosity】GPIO控制

<div class='showpostmsg'>本次用到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,绿灯亮;松开,绿灯灭。
8a712fb2a9a174e0a16210afc28fcde5<br/>

谢谢大家,有问题欢迎交流,对于zigbee目前测试不了,没有多余的板子。
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2023-8-27 21:49

<p>按下sw2,绿灯亮;松开,绿灯灭,OK</p>

<p> &nbsp;</p>

swzswz 发表于 2023-8-28 16:25

Jacktang 发表于 2023-8-27 21:49
按下sw2,绿灯亮;松开,绿灯灭,OK

&nbsp;

<p>是的,我想改下控制红灯或者蓝灯,没找到入口,除了修改管脚还有其他的嘛?<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【Microchip WBZ451 Curiosity】GPIO控制