stm32f103c8t6hal库按键控制led灯亮度
时间: 2024-04-14 18:23:58 浏览: 540
STM32F103C8T6是一款常用的单片机,它基于ARM Cortex-M3内核,具有丰富的外设资源。HAL库(Hardware Abstraction Layer)是ST公司提供的一套硬件抽象层库,可以简化对STM32外设的操作。
要实现按键控制LED灯亮度,可以按照以下步骤进行:
1. 初始化GPIO:首先需要初始化按键和LED所连接的GPIO引脚。使用HAL库提供的函数可以方便地进行GPIO初始化,设置引脚为输入或输出模式。
2. 配置中断:为了实现按键的响应,可以配置外部中断。当按键按下时,触发中断,并执行相应的中断服务函数。
3. 编写中断服务函数:在中断服务函数中,可以编写代码来控制LED的亮度。可以通过改变LED的PWM占空比来实现不同的亮度调节。
4. 启动中断:在主函数中,启动外部中断,使其开始监听按键的状态变化。
下面是一个简单的示例代码,演示了如何使用STM32F103C8T6和HAL库实现按键控制LED灯亮度:
```c
#include "stm32f1xx_hal.h"
// 定义LED引脚和按键引脚
#define LED_PIN GPIO_PIN_13
#define LED_PORT GPIOC
#define KEY_PIN GPIO_PIN_0
#define KEY_PORT GPIOA
// 定义PWM相关参数
#define PWM_PERIOD 1000 // PWM周期
#define PWM_CHANNEL TIM_CHANNEL_1 // 使用的PWM通道
// 全局变量
TIM_HandleTypeDef htim;
uint32_t pwmValue = 0; // PWM占空比
// 按键中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == KEY_PIN)
{
// 按键按下时,增加PWM占空比
pwmValue += 100;
if (pwmValue > PWM_PERIOD)
{
pwmValue = 0;
}
__HAL_TIM_SET_COMPARE(&htim, PWM_CHANNEL, pwmValue);
}
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 初始化时钟
SystemClock_Config();
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
// 初始化定时器
__HAL_RCC_TIM3_CLK_ENABLE();
htim.Instance = TIM3;
htim.Init.Prescaler = 0;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = PWM_PERIOD - 1;
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = pwmValue;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, PWM_CHANNEL);
HAL_TIM_PWM_Start(&htim, PWM_CHANNEL);
// 启动中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
// 主循环
}
}
// 系统时钟配置函数
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__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)
{
Error_Handler();
}
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)
{
Error_Handler();
}
}
```
阅读全文