芯源半导体CW32
直播中

jennyzhaojie

3年用户 67经验值
擅长:测量仪表 嵌入式技术 模拟技术 处理器/DSP 控制/MCU
私信 关注
[经验]

【CW32饭盒派开发板试用体验】+GPIO口的使用

前面已解决了开发环境的构建,并实现了例程的下载。稍感不足的是,该例程并没使LED灯有啥变化。

通过查看程序方知,原来它使用的引脚是PB8和PB9,其定义如下:

#define LED_GPIO_PORT CW_GPIOB/C

#define LED_GPIO_PINS GPIO_PIN_8
| GPIO_PIN_9/13

而开发板的原理图可知,LED灯所使用的引脚是PC13,见图1所示。
image.png

图1 LED原理图

为此,需要对原程序进行重新的改写,更新后的定义语句为:

#define LED_GPIO_PORT CW_GPIOC

#define LED_GPIO_PINS GPIO_PIN_13

由于使用的GPIO口出现了变化,故驱动时钟源也需要修改,修改后应为:__RCC_GPIOC_CLK_ENABLE();

这样例程的主程序就成为了如下的内容:

int32_t main(void)
{   
GPIO_InitTypeDef GPIO_InitStruct;   
RCC_HSI_Enable(RCC_HSIOSC_DIV6);   
__RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.IT= GPIO_IT_NONE;   
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   
GPIO_InitStruct.Pins = LED_GPIO_PINS;  
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;   
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);   
while (1)   
{       
GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PINS);       
Delay(0xFFFF);   
}
}

经程序的编译和下载,果然见到了预期的效果,见图2所示。

image.png

图2 点亮LED

此外,在开发板上还配有LED和KEY,其电路如图2和图3所示,通过GPIO口可对它们进行使用。

image.png

图3 LED原理图

由图3可知,要点亮LED,需对所连接的引脚输出低电平。

image.png

图4 KEY原理图

由图4可知,当按键按下时,会向所连接的引脚输出低电平,为了提高识别的可靠性,应将引脚配置为上拉输入模式。

为以KEY对LED进行控制,对KEY所用引脚的配置函数为:

void key(void)
{   
GPIO_InitTypeDef GPIO_InitStruct;   
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
__RCC_GPIOB_CLK_ENABLE();   
GPIO_InitStruct.IT = GPIO_IT_NONE;   
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;   
GPIO_InitStruct.Pins = PIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;   
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;   
GPIO_Init(CW_GPIOB, &GPIO_InitStruct); 
}

对LED所用引脚的配置函数为:

void LED(void)
{   
GPIO_InitTypeDef GPIO_InitStruct;   
RCC_HSI_Enable(RCC_HSIOSC_DIV6); __RCC_GPIOA_CLK_ENABLE();   
GPIO_InitStruct.IT = GPIO_IT_NONE; 
GPIO_InitStruct.Mode= GPIO_MODE_OUTPUT_PP;   
GPIO_InitStruct.Pins = GPIO_PIN_7|GPIO_PIN_8;   
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;   
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
__RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pins= GPIO_PIN_12;
GPIO_Init(CW_GPIOC,&GPIO_InitStruct);
}

使用3个KEY对3个LED实现一对一控制的主程序为:

int32_t main(void)
{   
    LED();
    key();
    while(1)
    {                    if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET)     // KEY 1
                     { 
                                                              GPIO_WritePin(CW_GPIOA,GPIO_PIN_7,GPIO_Pin_RESET);
                     }
                     else      
                     {
                                GPIO_WritePin(CW_GPIOA,GPIO_PIN_7,GPIO_Pin_SET);
                     }
                     if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_14)==GPIO_Pin_RESET)    // KEY
2
                     {                                     GPIO_WritePin(CW_GPIOA,GPIO_PIN_8,GPIO_Pin_RESET);     
                      }                     
                      else      
                      {                                     GPIO_WritePin(CW_GPIOA,GPIO_PIN_8,GPIO_Pin_SET);
                      }
                     if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_15)==GPIO_Pin_RESET)    // KEY 3
                     {                                     GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_RESET);
                     }
                     else      
                     {
                                     GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_SET);
                     }
         }
}

经程序的编译和下载,其控制效果符合设计要求。

此外,在开发板上还配有无源蜂鸣器,其电路如图5所示。

由图可知,要使蜂鸣器发声必须使Q1导通,而要使Q1导通,则需PB3提供高电平。

image.png

图5 蜂鸣器电路

对蜂鸣器所用引脚的配置函数为:

void beep(void)
{   
GPIO_InitTypeDef GPIO_InitStruct;   
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
__RCC_GPIOB_CLK_ENABLE();   
GPIO_InitStruct.IT = GPIO_IT_NONE;   
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   
GPIO_InitStruct.Pins = GPIO_PIN_3;   
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;   
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}

要使蜂鸣器发声,只需为其提供高低变化的电平信号即可,其程序为:

beep();
while (1)
{          
      GPIO_TogglePin(CW_GPIOB, GPIO_PIN_3);
      Delay(0xFFF);
}

更多回帖

发帖
×
20
完善资料,
赚取积分