我们本次使用的主要对象是ST的开发板,这次我们是以STM32H533为例来进行本次活动的开发,注意也支持采用新系列的开发板(C562和C542)进行开发,其开发流程会有些许的差异。
STM32H533属于ST的H5的一款单片机,本人还是非常喜欢的一款,大家也可能有不少人接触过,这次我将通过这款单片机的官方开发板实现本次活动的基本任务。
我们使用STM32CubeMX进行初始化代码的配置,第一个任务主要是对这个开发板的开发基础配置和基本的使用,主要实现的功能是蜂鸣器模块和LED的控制,并通过串口打印基本信息,这里我们在加入按键的控制。
对于官方开发板来说,有stm32h5xx_nucleo,我们不需要太特殊的配置,板载的LED、按键、串口的使用都需要我们配置:
直接使用官方正对开发板bsp就可以,蜂鸣器的控制我们加入了一个引脚就可以
我们先看一下本次使用的蜂鸣器,我们推荐了一款有源蜂鸣器作为本次活动的声音指示,Grove - 蜂鸣器模块的主要组件是一个压电蜂鸣器。压电蜂鸣器可以连接到数字输出,当输出为高电平时会发出音调。或者,它可以连接到模拟脉宽调制输出以生成各种音调和效果。其主要控制信号是高低电平,我们配置一个一个引脚进行控制:

加了一个定时器进行非阻塞相关的控制:

其他就是工程相关的配置了,时钟直接拉满,本次使用Cmake+VScode进行开发:

新工程来到后再VScode的STM32CubeIDE打开,首先需要配置一下,不然没法调试:

接下来就是代码调试,我们主要实现的功能,按键控制LED的运行状态,并通过蜂鸣器提示按键按下,串口打印LED状态,主要都是在中断中实现,主要涉及的是定时器中断和按键外部中断,代码如下:
oid App_ToggleLedBlink(void)
{
ledBlinkEnabled = !ledBlinkEnabled;
if (ledBlinkEnabled)
{
ledToggleTick = 0U;
BSP_LED_On(LED_GREEN);
printf("[KEY] USER button pressed -> LED blink ON (period=%u ms)\r\n",
(unsigned)LED_BLINK_PERIOD_MS);
}
else
{
BSP_LED_Off(LED_GREEN);
printf("[KEY] USER button pressed -> LED blink OFF\r\n");
}
/* Always sound the buzzer on a valid press (high level drives the buzzer) */
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
buzzerActive = true;
buzzerTick = 0U;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance != TIM12)
{
return;
}
if (ledBlinkEnabled)
{
if (++ledToggleTick >= LED_BLINK_PERIOD_MS)
{
ledToggleTick = 0U;
BSP_LED_Toggle(LED_GREEN);
}
}
if (buzzerActive)
{
if (++buzzerTick >= BUZZER_DURATION_MS)
{
buzzerActive = false;
buzzerTick = 0U;
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
}
}
if (!keyReady)
{
if (++keyDebounceTick >= KEY_DEBOUNCE_MS)
{
keyDebounceTick = 0U;
keyReady = true;
}
}
}
void BSP_PB_Callback(Button_TypeDef Button)
{
if (Button != BUTTON_USER)
{
return;
}
/* Reject bounce / double-trigger until the debounce window has elapsed */
if (!keyReady)
{
return;
}
keyReady = false;
keyDebounceTick = 0U;
App_ToggleLedBlink();
}整体的硬件连接如下:

可以看到串口有如下的打印:

我要赚赏金
