定时器控制流水灯

先跟着这篇文章学习基础理论
keynote:

1、时间计算公式
在这里插入图片描述
attention:如果要10000分频,则预分频器的值为10000-1
在这里插入图片描述

2、定时器分类:

以STM32F103系列产品拥有的定时器类型:
4个通用定时器(TIM2~TIM5)
2个高级控制定时器(TIM1和TIM8),功能更强大
2个基本定时器(TIM6和TIM7),主要用于产生DAC触发信号
1个实时时钟(RTC)
2个看门狗定时器
1个系统滴答定时器(SysTick时钟),主要用于精确延时(delay函数)

开始实操
建立新工程,然后设置
在这里插入图片描述
在这里插入图片描述
然后开始配置时钟树,设置如下图所示,使定时器主频为72MHz。而TIM2是挂接在APB1上的,所以也就是要让APB1这儿最终为72MHz(没太搞懂)
在这里插入图片描述
在这里插入图片描述
学这篇,跟我用的更贴切一些,跟着上一篇的中断事件略长,可以自己计算,也可以设置这个数
在这里插入图片描述
在这里插入图片描述
再设GPIO的灯
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这篇讲HAL的定时器的函数的,就可以知道中断调回函数的作用
这篇讲GPIO的,一些GPIO的函数功能,及使用和GPIOx和pin的对应规则

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于在STM32上实现流水灯效果,可以使用定时器控制LED的闪烁频率。以下是一个基本的流水灯示例程序,使用了TIM2定时器控制LED的闪烁频率: ```c #include "stm32f4xx.h" void GPIO_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStruct); } void TIM2_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler = 41999; // 设置预分频值,得到1ms的定时周期 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_InitStruct.TIM_Period = 999; // 设置计数器最大值,得到1s的定时周期 TIM_InitStruct.TIM_ClockDivision = 0; TIM_InitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_InitStruct); TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { static uint8_t ledIndex = 0; static uint16_t ledValue = GPIO_Pin_12; GPIO_SetBits(GPIOD, ledValue); if (ledIndex == 0) { GPIO_ResetBits(GPIOD, GPIO_Pin_15); ledValue = GPIO_Pin_12; } else { GPIO_ResetBits(GPIOD, ledValue >> 1); ledValue <<= 1; } if (++ledIndex > 3) { ledIndex = 0; } TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } int main(void) { GPIO_Init(); TIM2_Init(); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); while (1) { } } ``` 上述代码中,我们首先初始化了GPIOD的引脚作为输出,用于连接LED。然后,我们初始化了TIM2定时器,设置了预分频和计数器最大值,使得定时器的计数周期为1ms。在定时器中断处理函数中,控制LED的闪烁效果。最后,在主函数中使能了TIM2的中断,并进入了一个无限循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值