编写stm32串口控制led闪烁或数码显示演示代码。要求:实现 STM32 的 PC 口所接 8 颗 LED 多种闪烁效果或者数码显示效果的控制,系 统由 PC 机通过串口下达指令(即串口发送控制指令,STM32 收到指令转换为具体的操作,指 令编码自行设定);串口设置为波特率 115200,8 位数据,1 位停止位,无需校验及流控;LED 闪烁的效果不低于 6 种(不包括常亮和常灭两种状态);定时可以使用 TIMx 中断方式控制 闪烁,也可使用 ARM 内核 SysTick 实现闪烁,程序中不得用软件延时。扩展要求:至少设置一个中断方式的按键,可以按键控制 LED 闪烁或者数码管显示状态切 换(固定切换顺序,也可以用两个按键分别对应两个不同控制方式)。
时间: 2024-02-17 18:03:20 浏览: 144
以下是基于STM32CubeMX和HAL库编写的串口控制LED闪烁和数码管显示演示代码:
1. 首先在STM32CubeMX中配置串口和GPIO口,具体配置如下:
串口配置:
- USART3
- 波特率:115200
- 数据位:8
- 停止位:1
- 校验位:无
- 流控:无
GPIO配置:
- 8颗LED灯使用GPIO口输出
- 数码管使用GPIO口输出,具体使用哪个口可以根据自己的实际情况选择
2. 在main函数中初始化串口和定时器,以及开启中断:
```
int main(void)
{
/* 初始化HAL库 */
HAL_Init();
/* 初始化串口 */
MX_USART3_UART_Init();
/* 初始化定时器 */
MX_TIM2_Init();
/* 开启定时器中断 */
HAL_TIM_Base_Start_IT(&htim2);
/* 开启中断 */
HAL_NVIC_EnableIRQ(USART3_IRQn);
while (1)
{
/* 等待串口接收中断 */
}
}
```
3. 在串口接收中断函数中解析指令并执行相应功能:
```
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* 接收到一个字节 */
if (huart->Instance == USART3)
{
/* 处理指令 */
switch (uart_receive_data)
{
case 0x01: // 闪烁模式1
led_mode = 1;
break;
case 0x02: // 闪烁模式2
led_mode = 2;
break;
case 0x03: // 数码管显示模式1
digit_mode = 1;
break;
case 0x04: // 数码管显示模式2
digit_mode = 2;
break;
default:
break;
}
/* 继续等待串口接收中断 */
HAL_UART_Receive_IT(&huart3, &uart_receive_data, 1);
}
}
```
4. 在定时器中断函数中控制LED或数码管的闪烁或显示:
```
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* 定时器2中断 */
if (htim->Instance == TIM2)
{
/* 控制LED闪烁 */
switch (led_mode)
{
case 1:
/* 闪烁模式1 */
if (led_blink_count++ >= 20)
{
/* 闪烁20次后熄灭 */
led_blink_count = 0;
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
else if (led_blink_count < 10)
{
/* 闪烁10次亮10次 */
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
break;
case 2:
/* 闪烁模式2 */
if (led_blink_count++ >= 20)
{
/* 闪烁20次后熄灭 */
led_blink_count = 0;
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
else if (led_blink_count < 5 || (led_blink_count >= 10 && led_blink_count < 15))
{
/* 闪烁5次亮5次,共闪烁20次 */
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
break;
default:
break;
}
/* 控制数码管显示 */
switch (digit_mode)
{
case 1:
/* 数码管显示模式1 */
if (digit_count++ >= 10)
{
/* 显示0-9,每个数字持续1s */
digit_count = 0;
digit_value++;
if (digit_value > 9)
{
digit_value = 0;
}
}
break;
case 2:
/* 数码管显示模式2 */
if (digit_count++ >= 10)
{
/* 显示0-9,每个数字持续100ms */
digit_count = 0;
digit_value++;
if (digit_value > 9)
{
digit_value = 0;
}
}
break;
default:
break;
}
set_digit_value(digit_value); // 设置数码管显示的值
}
}
```
5. 如果需要添加按键控制LED闪烁或数码管显示状态切换,则可以在中断函数中添加相应的处理代码。例如,可以使用外部中断方式控制按键:
```
/* 中断回调函数 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* 检测按键 */
if (GPIO_Pin == BUTTON_Pin)
{
/* 切换LED闪烁模式 */
if (led_mode == 1)
{
led_mode = 2;
}
else
{
led_mode = 1;
}
}
}
```
以上是基本实现步骤,具体实现细节可以根据实际情况进行调整。
阅读全文