基于stm32f103的简单小项目
时间: 2023-08-12 14:05:51 浏览: 138
好的,基于STM32F103的简单小项目有很多,下面我为您介绍一种基于STM32F103控制LED灯的简单小项目,希望能对您有所帮助。
项目名称:基于STM32F103控制LED灯
项目描述:使用STM32F103控制一个LED灯,通过调节PWM信号控制LED灯的亮度和闪烁频率。
硬件需求:
- STM32F103开发板
- LED灯
- 杜邦线
- 220欧姆电阻
软件需求:
- Keil MDK
- STM32CubeMX
步骤:
1. 使用STM32CubeMX配置GPIO口和定时器,生成HAL库代码。
2. 在HAL库代码中,使用定时器输出PWM信号控制LED灯的亮度和闪烁频率。
3. 编写主程序,初始化系统、GPIO口和定时器,并在主循环中不断调节PWM信号,控制LED灯的亮度和闪烁频率。
代码:
```
#include "stm32f1xx.h"
void SystemClock_Config(void);
void Error_Handler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim;
htim.Instance = TIM2;
htim.Init.Period = 7199;
htim.Init.Prescaler = 999;
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim);
TIM_OC_InitTypeDef sConfig;
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
sConfig.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&htim, &sConfig, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
while (1)
{
for (int i = 0; i < 1000; i++)
{
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, i);
HAL_Delay(1);
}
for (int i = 1000; i >= 0; i--)
{
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, i);
HAL_Delay(1);
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
while (1)
{
}
}
```
以上代码中,使用TIM2定时器输出PWM信号,控制PC13口对应的LED灯的亮度和闪烁频率。在主循环中,使用for循环不断调节PWM信号,实现LED灯的呼吸灯效果。
注意事项:
- 接线时需要将LED灯的正极连接到GPIO口,负极连接到220欧姆电阻上,再将电阻的另一端连接到GND。
- 程序中需要使用HAL库函数,因此需要在Keil MDK中配置好HAL库路径和头文件路径。
- 程序中使用了HAL_Delay函数,需要在程序中包含stm32f1xx_hal.h头文件。
希望这个项目对您有所启发,如果您有任何问题或需要更多帮助,请随时联系我。