STM32F429I-DISC1【板载LED呼吸灯】
一、硬件介绍
本次开发使用的是STM32F429I-DISC1开发板,是基于STM32F429ZIT6U的MCU,具有Arm Cortex-M4内核,配备2.4英寸QVGA TFT LCD、64-Mbit SDRAM、ST-MEMS陀螺仪(I3G4250D)、USB OTG接口(Micro-USB)、6个LED灯 和 2个按键(User / Reset),带有ST-LINK/V2-B,支持Mbed,同时具有虚拟串口和U盘功能。
LD1:用于USB串口通信 (默认状态 / 通讯)
LD2:电源Power指示灯
两个用户LED:LD3 (PG13)、LD4 (PG14)
两个USB_OTG LED:LD5 和 LD6(红色 / 过流指示灯)
USER_Button / WAKE-UP Button:PA0
原理图:
二、功能实现思想
实现效果:通过控制板载的LED亮度随时间逐渐增强再逐渐衰减,以实现呼吸灯的效果;
板载LED:其中能自定义控制的LED灯有两个用户LED:LD3 (PG13)、LD4 (PG14);
LD3、LD4对应的引脚并没硬件定时器功能;
主要实现方法:
1、定时器中断模拟PWM
2、SysTick中断模拟PWM
本次采用通过SysTick定时器来改变LED亮度;
SysTick定时器是存在于系统内核的一个滴答定时器;
SysTick 定时器
此定时器专用于实时操作系统,但也可用作标准递减计数器。
• 24位递减计数器
• 自动重载功能
• 当计数器计为 0 时,产生可屏蔽系统中断
• 可编程时钟源。
当SYSTEM_CLOCK为100MHz下,SysTick最短定时计算:
最短定时时间=1SysTick时钟频率=1100,000,000Hz=10ns最短定时时间= \frac{1}{SysTick时钟频率} = \frac{1}{100,000,000Hz} = 10ns 最短定时时间=SysTick时钟频率1=100,000,000Hz1=10ns
因此,可以配置为1us用于定时;
三、功能实现步骤
在上次例程的基础上更改为Task_2.ioc,并打开项目继续进行相关配置;
1、配置LD3、LD4引脚
2、配置NVIC优先级
3、打开生成好的项目代码
编写相关主要代码
main.c:/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */void SysTick_Init(void){//计数值配置if (HAL_SYSTICK_Config(SystemCoreClock / 1000000U)) //1us{printf("SysTick_Init ERROR\r\n");}}volatile uint32_t pwm_duty = 0;
volatile int8_t direction = 1; // +表示增加亮度, -表示减小亮度 线性呼吸灯static uint32_t counter = 0;
const uint32_t pwm_period = 1000; // T = pwm_period * 1us * (direction * pwm_period * 2)void Pwm_Led(void) {counter++;if (counter >= pwm_period) { // t = pwm_period * 1us = 1ms 改变一次占空比counter = 0;// 更新PWM占空比 T = 2 * direction * pwm_period * tpwm_duty += direction;// 改变方向 direction * pwm_period * tif (pwm_duty >= pwm_period) { pwm_duty = pwm_period;direction *= -1; // -} else if (pwm_duty <= 0) {pwm_duty = 0;direction *= -1; // +}}// 根据当前占空比控制LEDif (counter < pwm_duty) {HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_SET);} else {HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_RESET);}
}/* USER CODE END 0 */int main(void)
{HAL_Init();SystemClock_Config();SysTick_Init();MX_GPIO_Init();MX_USART1_UART_Init();while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
stm32f4xx_it.c:/*** @brief This function handles System tick timer.*/
void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 */Pwm_Led();/* USER CODE END SysTick_IRQn 1 */
}
四、实验现象
1s内逐渐由暗到亮、1s再由亮到暗,LD3、LD4循环呼吸效果显示;