STM32使用TIM闪烁LED——输出比较方式
STM32定时器输出比较器可以直接操作对应的GPIO,在计数器值等于比较寄存器的值时,对应的GPIO可以有以下四种动作
无动作
激活
取消激活
翻转
激活电平由输出极性寄存器决定
将LED置于定时器输出比较对应的GPIO上,对它的操作将非常方便,完全由硬件完成,不消耗CPU时间,无需中断,每个定时器都对应有4个输出比较,可以轻松实现4个LED的流水灯效果
宏定义部分如下
#define USER_TIM_PSC 36000-1 #define USER_TIM_PERIOD 1000-1 #define USER_TIM_PULSEA 0 #define USER_TIM_PULSEB 500 #define USER_TIM TIM2 #define USER_TIM_RCC RCC_APB1Periph_TIM2 #define USER_TIM_RCC_CMD RCC_APB1PeriphClockCmd #define USER_TIM_GPIO GPIOA #define USER_TIM_GPIO_RCC RCC_APB2Periph_GPIOA #define USER_TIM_PINA GPIO_Pin_1 #define USER_TIM_PINB GPIO_Pin_0
定时器配置如下
TIM_TimeBaseInitTypeDef tim_timebase_struct; TIM_OCInitTypeDef tim_oc_struct; GPIO_InitTypeDef gpio_struct; GPIO_RCC_CMD(USER_TIM_GPIO_RCC, ENABLE); USER_TIM_RCC_CMD(USER_TIM_RCC, ENABLE); gpio_struct.GPIO_Mode = GPIO_Mode_AF_PP; gpio_struct.GPIO_Speed = GPIO_Speed_2MHz; gpio_struct.GPIO_Pin = USER_TIM_PINA | USER_TIM_PINB; GPIO_Init(USER_TIM_GPIO, &gpio_struct); TIM_TimeBaseStructInit(&tim_timebase_struct); tim_timebase_struct.TIM_CounterMode = TIM_CounterMode_Up; tim_timebase_struct.TIM_Prescaler = USER_TIM_PSC; tim_timebase_struct.TIM_Period = USER_TIM_PERIOD; tim_timebase_struct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(USER_TIM, &tim_timebase_struct); TIM_OCStructInit(&tim_oc_struct); tim_oc_struct.TIM_OCMode = TIM_OCMode_Active; tim_oc_struct.TIM_OCPolarity = TIM_OCPolarity_Low; tim_oc_struct.TIM_OutputState = TIM_OutputState_Enable; tim_oc_struct.TIM_Pulse = USER_TIM_PULSEA; TIM_OC2Init(USER_TIM, &tim_oc_struct); tim_oc_struct.TIM_Pulse = USER_TIM_PULSEB; TIM_OC1Init(USER_TIM, &tim_oc_struct); TIM_OC2PreloadConfig(USER_TIM, TIM_OCPreload_Disable); TIM_OC1PreloadConfig(USER_TIM, TIM_OCPreload_Disable); TIM_ARRPreloadConfig(USER_TIM, ENABLE); TIM_Cmd(USER_TIM, ENABLE);
本工程使用的野火MINI开发板只有两个LED灯且都不在定时器的输出比较对应GPIO上,所以本工程使用了TIM2的CH1和CH2实现两个LED的流水灯效果,一次流水完为1秒,通过杜邦线将输出引到LED,可以观察到效果
定时器的输出比较功能对GPIO的激活和取消激活功能的应用场景不知道是怎样的,因为只要第一次激活或者取消激活,后续它的状态将保持,所以在这里用于操作LED是不方便的,但是确实可以观察到明显的一次流水效果。它们的功能有待后续发掘
在实现了单个LED的闪烁,多个LED的流水灯效果,还可以用定时器的PWM模式实现呼吸灯效果,玩转LED,待续
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?