前面已解决了开发环境的构建,并实现了例程的下载。稍感不足的是,该例程并没使LED灯有啥变化。
通过查看程序方知,原来它使用的引脚是PB8和PB9,其定义如下:
#define LED_GPIO_PORT CW_GPIOB/C
#define LED_GPIO_PINS GPIO_PIN_8
| GPIO_PIN_9/13
而开发板的原理图可知,LED灯所使用的引脚是PC13,见图1所示。
图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所示。
图2 点亮LED
此外,在开发板上还配有LED和KEY,其电路如图2和图3所示,通过GPIO口可对它们进行使用。
图3 LED原理图
由图3可知,要点亮LED,需对所连接的引脚输出低电平。
图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)
{
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)
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)
{ 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提供高电平。
图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);
}