stm32f103系列用串口实现呼吸灯
时间: 2023-09-29 12:09:27 浏览: 120
基于STM32F103的呼吸灯
呼吸灯是通过改变LED的亮度来实现的,可以通过PWM信号来实现。在STM32F103系列中,可以使用定时器来产生PWM信号,然后将其输出到LED上。
以下是使用串口实现呼吸灯的代码示例:
1. 首先需要初始化串口模块:
```c
#include "stm32f10x.h"
#include "stdio.h"
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
// 使能 USART1 和 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// 配置 USART1 引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 USART1
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStruct);
// 使能 USART1
USART_Cmd(USART1, ENABLE);
}
```
2. 初始化定时器,使其产生PWM信号:
```c
#include "stm32f10x.h"
void TIM3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
// 使能 TIM3 和 GPIOB 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置 GPIOB 引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// 配置 TIM3
TIM_InitStruct.TIM_Prescaler = 7200 - 1; // 时钟预分频
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 100 - 1; // 计数器自动重装载值
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
// 配置 TIM3 的 PWM 输出通道
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比为0
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
// 启动 TIM3
TIM_Cmd(TIM3, ENABLE);
}
```
3. 在主函数中,不断改变PWM信号的占空比,从而实现呼吸灯效果:
```c
#include "stm32f10x.h"
#include "stdio.h"
int main()
{
USART1_Init();
TIM3_Init();
uint16_t pwm_value = 0;
uint16_t step = 5;
while (1)
{
pwm_value += step;
if (pwm_value >= 100)
{
pwm_value = 100;
step = -5;
}
else if (pwm_value <= 0)
{
pwm_value = 0;
step = 5;
}
TIM_SetCompare1(TIM3, pwm_value); // 改变 PWM 占空比
printf("PWM value: %d%%\r\n", pwm_value);
delay_ms(50);
}
}
```
注意:在使用串口输出时,需要实现delay_ms函数,以避免串口输出速度过快。可以在SysTick中断中实现该函数:
```c
void SysTick_Handler(void)
{
static uint32_t ticks = 0;
ticks++;
}
void delay_ms(uint32_t ms)
{
uint32_t ticks = ms * 1000 / SysTick_Config(SystemCoreClock / 1000);
while (ticks--);
}
```
以上是使用串口实现呼吸灯的示例代码,仅供参考。
阅读全文