实验内容:按键KEY1控制RGB灯颜色变换。
一、原理图
二、 CubeMX配置
Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。
Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)
Step4.GPIO引脚配置,点击搜索框,选择相应的引脚。PB0/PB1/PB5 配置为GPIO_Output,PA0 配置为GPIO_Input。
KEY引脚配置:方框3 第一行是GPIO模式,这里选择输入模式,第二行是选择上拉还是下拉,这里选择既不上拉也不下拉,第三行是用户标签(可以自己给该引脚命名)。
RGB灯引脚配置:方框中 第一行是初始化引脚电平,(我的开发板灯是低电平亮,所以初始化高电平),第二行是GPIO模式,这里选择推挽输出,第三行是选择上拉还是下拉,这里选择既不上拉也不下拉,第四行是IO口翻转速度,这里选择低速,第五行是用户标签(可以自己给该引脚命名)。
Step5.Project工程设置,这个选项是配置工程重要的一个选项,其中配置的信息也比较重要,且容易理解。
Step6.Project代码生成配置界面。
Step7.Project高级配置界面。(一般情况下,采用默认配置即可)
Step8.点击“GENRATE CODE”生成代码。
三、添加功能代码
按键扫描程序:
uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==1)
{
while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==1);//松手检测
return 1;
}
return 0;
}
RGB灯控制程序:
uint8_t cnt=0;
uint8_t value=0;
while (1)
{
value=KEY_SCAN(KEY_CTRL_GPIO_Port, KEY_CTRL_Pin);
if(value==1)
{
switch(cnt)
{
case 0:
{
HAL_GPIO_WritePin(GPIOB, LED_R_Pin,0);
HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
cnt++;
break;
}
case 1:
{
HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_G_Pin,0);
HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
cnt++;
break;
}
case 2:
{
HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_B_Pin,0);
cnt++;
break;
}
case 3:
{
HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
cnt=0;
break;
}
}
}
}