使用STM32开发板制作LED灯控制器

在本篇文章中,将详细介绍如何使用STM32开发板制作一个LED灯控制器。我们将使用STM32CubeIDE作为集成开发环境,并通过GPIO来控制LED灯的亮灭。以下是本文的主要内容:

  1. STM32CubeIDE的安装和配置

  2. STM32开发板的连接与准备工作

  3. GPIO控制LED灯的亮灭

  4. 使用定时器实现LED闪烁功能

  5. 使用外部中断控制LED灯的开关

  6. 使用串口通信控制LED灯的亮灭

  7. STM32CubeIDE的安装和配置

首先,我们需要下载并安装STM32CubeIDE。该集成开发环境是STM32微控制器的官方开发工具,可以用于编译、调试和烧录STM32项目。

安装完成后,打开STM32CubeIDE并进行一些配置。首先,选择合适的编程语言,例如C语言。然后,选择适当的目标板型号,在本例中我们使用的是STM32F103开发板。最后,选择适当的工作区路径。

  1. STM32开发板的连接与准备工作

将STM32开发板连接到计算机,并确保开发板已正确连接到电源。使用USB数据线将开发板与计算机进行连接。

为了方便开发,我们可以连接一个LED灯到开发板上。找到开发板上的一个GPIO引脚,例如PB12,并将LED的正极连接到该引脚上,将LED的负极连接到开发板的GND引脚上。

  1. GPIO控制LED灯的亮灭

首先,创建一个新的STM32CubeIDE工程。选择合适的板级支持包和启动文件,然后选择合适的编译器。

在工程中,打开main.c文件,并添加以下代码:

#include "stm32f1xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    HAL_Delay(1000);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_Delay(1000);
  }
}

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_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    while (1);
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    while (1);
  }
}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

以上代码首先初始化了系统时钟,然后配置了GPIOB引脚12作为输出模式,并设置为低速频率。在主循环中,LED灯会依次亮和灭1秒钟。

编译并下载程序到开发板上,你将能看到LED灯以1秒的间隔闪烁。

  1. 使用定时器实现LED闪烁功能

在前面的示例中,我们使用了延时函数来实现LED闪烁的效果。然而,在实际的应用中,我们可能需要同时执行其他任务,因此使用延时函数可能不是一个好的选择。

另一个更好的方法是使用定时器来控制LED的亮灭。首先,我们需要配置一个定时器来发出固定时间间隔的中断。然后,在中断函数中切换LED的状态。

修改上面的代码,添加以下内容:

首先,需要重新配置定时器的时钟源和分频系数。在SystemClock_Config()函数中添加以下代码:

RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 7200 - 1;
TIM3->ARR = 10000 - 1;
TIM3->DIER |= TIM_DIER_UIE;
TIM3->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM3_IRQn);

然后,在main函数中添加中断处理函数:

void TIM3_IRQHandler(void)
{
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
  TIM3->SR &= ~TIM_SR_UIF;
}

编译并下载程序到开发板上,你将看到LED灯以1秒的间隔闪烁。

  1. 使用外部中断控制LED灯的开关

有时候,我们可能希望通过外部事件来控制LED灯的开关。例如,可以连接一个按键到开发板上,按下该按键时,LED灯亮起;再次按下时,LED灯熄灭。

首先,修改MX_GPIO_Init()函数,将GPIOB引脚12的模式设置为输入模式:

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

然后,添加以下代码来配置外部中断的触发方式和使能中断:

EXTI->FTSR |= EXTI_FTSR_TR12;
EXTI->IMR |= EXTI_IMR_MR12;
NVIC_EnableIRQ(EXTI15_10_IRQn);

接下来,在main函数中添加外部中断处理函数:

void EXTI15_10_IRQHandler(void)
{
  if (EXTI->PR1 & EXTI_PR1_PIF12)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
    EXTI->PR1 = EXTI_PR1_PIF12;
  }
}

编译并下载程序到开发板上,你将能通过按下按键来控制LED灯的开关。

  1. 使用串口通信控制LED灯的亮灭

最后,我们可以通过串口通信来控制LED灯的亮灭。例如,当接收到字符“ON”时,LED灯亮起;当接收到字符“OFF”时,LED灯熄灭。

首先,需要配置串口通信。在MX_GPIO_Init()函数中添加以下代码:

__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

然后,在main函数中添加以下代码来配置串口:

UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    while (1);
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大黄鸭duck.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值