0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【合宙Air105开发板试用体验】Air105的定时器, 定时器中断和PWM输出

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-12-02 11:23 次阅读
本文来源电子发烧友社区,作者:Michael, 帖子地址:https://bbs.elecfans.com/jishu_2287621_1_1.html

Air105 的timer


定时器

  • 1 个 Timer 单元,包含 8 个独立定时器: Timer0,Timer1,Timer2,Timer3,Timer4,Timer5,Timer6,Time7
  • 8 个定时器中断源独立,每个定时器单独占 1 个中断源
  • 使用 PCLK 时钟频率作为定时器计时钟源
  • 定时器采用向下计数方式


PWM

  • 每个 Timer 单元定时器都支持 PWM 模式
  • PWM 模式最高频率 PCLK/2
  • PWM 单次触发(one shot)功能


定时器相关代码

以下代码基于 air105_projecthttps://gitee.com/iosetting/air105_project的库函数

定时器模块结构

在Air105中, 全局只有一个定时器模块, TIMM0


  1. typedef struct
  2. {
  3. TIM_TypeDef TIM[TIM_NUM];
  4. __Iuint32_t TIM_IntStatus;
  5. __Iuint32_t TIM_EOI;
  6. __Iuint32_t TIM_RawIntStatus;
  7. __Iuint32_t TIM_Comp;
  8. __IO uint32_t TIM_ReloadCount[TIM_NUM];
  9. } TIM_Module_TypeDef;
复制代码


这个 TIMM0 的地址定义在 air105.h 中


  1. #define TIMM0 ((TIM_Module_TypeDef *)TIMM0_BASE)
  2. #define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */
  3. #define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000)
  4. #define TIMM0_BASE (AIR105_APB0_BASE + 0x3000)
复制代码

地址 = 0x40000000UL + 0x10000 + 0x3000 = 0x4001 3000
范围 [0x4001_3000, 0x4001_3FFF]

定时器初始化

定时器的初始化只需要两个参数: TIMx, 周期(时钟数), 为配合定时器使用, 还需要定义中断


  1. void Timer_Init(void)
  2. {
  3. TIM_InitTypeDef TIM_InitStruct;
  4. NVIC_InitTypeDef NVIC_InitStructure;
  5. // 开启定时器的外设时钟
  6. SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  7. SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  8. // 定时器的时钟是 PCLK, 计数间隔为 1ms 对应的时钟数
  9. TIM_InitStruct.TIM_Period = SYSCTRL->PCLK_1MS_VAL;
  10. // 使用 定时器0
  11. TIM_InitStruct.TIMx = TIM_0;
  12. // 初始化
  13. TIM_Init(TIMM0, &TIM_InitStruct);
  14. // 开启定时器0的中断
  15. TIM_ITConfig(TIMM0, TIM_InitStruct.TIMx, ENABLE);
  16. //NVIC
  17. NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19. NVIC_InitStructure.NVIC_IRQChannel = TIM0_0_IRQn;
  20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  22. NVIC_Init(&NVIC_InitStructure);
  23. // 启动定时器0
  24. TIM_Cmd(TIMM0, (TIM_NumTypeDef)TIM_0, ENABLE);
  25. }
复制代码



定时器中断处理

Air105对应每个定时器, 各有一个中断处理函数, 可以查看 startup.air105.s 中的中断向量定义


  1. TIM0_0_IRQHandler
  2. TIM0_1_IRQHandler
  3. TIM0_2_IRQHandler
  4. TIM0_3_IRQHandler
  5. TIM0_4_IRQHandler
  6. TIM0_5_IRQHandler
  7. TIM0_6_IRQHandler
  8. TIM0_7_IRQHandler
复制代码


对应 Timer0 的中断处理, 写在 air105_it.c. TIM_ClearITPendingBit 和 NVIC_ClearPendingIRQ 是必须调用的, 用于清除中断


  1. void TIM0_0_IRQHandler(void)
  2. {
  3. TIM_ClearITPendingBit(TIMM0, TIM_0);
  4. NVIC_ClearPendingIRQ(TIM0_0_IRQn);
  5. }
复制代码


下面加入处理逻辑的例子, 每秒调用一次 timer_handler(), 注意不要在中断处理中使用耗时的工作


  1. extern uint32_t timer_count;
  2. extern void timer_handler(void);
  3. void TIM0_0_IRQHandler(void)
  4. {
  5. timer_count++;
  6. if (timer_count >= 1000)
  7. {
  8. timer_count = 0;
  9. timer_handler();
  10. }
  11. TIM_ClearITPendingBit(TIMM0, TIM_0);
  12. NVIC_ClearPendingIRQ(TIM0_0_IRQn);
  13. }
复制代码


定时器示例代码

使用Timer0控制板载LED每隔一秒闪烁
https://gitee.com/iosetting/air105_project/tree/master/Demos/Timer/Timer_Blink

Air105 的 PWM

Air105 的8个独立定时器均可编程产生PWM信号. 当用户设定TimerNControlReg中PWM比特位为1后,定时器进入PWM工作模式. 此时 PWM 由 TimerNLoadCount2 和 TimerNLoadCount 寄存器分别控制高电平及低电平周期翻转输出.

频率和占空比设置

高电平周期 = (TimerNLoadCount2 + 1) * PCLK_Period
低电平周期 = (TimerNLoadCount + 1) * PCLK_Period

PWM 相关代码

PWM初始化也只需要三个参数 TIMx 和高低电平两个周期, 两者之和就是一个PWM周期


  1. typedef struct
  2. {
  3. TIM_NumTypeDef TIMx;
  4. uint32_t TIM_LowLevelPeriod;
  5. uint32_t TIM_HighLevelPeriod;
  6. }TIM_PWMInitTypeDef;
复制代码


用Timer5初始化


  1. void TimerPWM_Init(void)
  2. {
  3. TIM_PWMInitTypeDef TIM_PWMInitStruct;
  4. SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  5. SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
  6. //Timer5 -> PWM5
  7. TIM_PWMInitStruct.TIM_HighLevelPeriod = SYSCTRL->PCLK_1MS_VAL;
  8. TIM_PWMInitStruct.TIM_HighLevelPeriod = 0;
  9. TIM_PWMInitStruct.TIMx = TIM_5;
  10. TIM_PWMInit(TIMM0, &TIM_PWMInitStruct);
  11. TIM_Cmd(TIMM0, TIM_5, ENABLE);
  12. }
复制代码


将 PB5 功能复用为 PWM5


  1. GPIO_InitTypeDef gpio;
  2. gpio.GPIO_Pin = GPIO_Pin_5;
  3. gpio.GPIO_Mode = GPIO_Mode_Out_PP;
  4. gpio.GPIO_Remap = GPIO_Remap_2;
  5. GPIO_Init(GPIOB, &gpio);
复制代码


实时调节占空比, 后两个参数代表PCLK时钟周期个数


  1. TIM_SetPWMPeriod(TIMM0, TIM_5, period - high_period, high_period);
复制代码


PWM示例代码

使用PWM5(Timer5)控制LED产生呼吸灯效果
https://gitee.com/iosetting/air105_project/tree/master/Demos/PWM/PWM_FadeLED

示例接线:

根据开发板的BOMPCB查看https://wiki.luatos.com/_static/bom/Air105.html
Timer5对应的PWM5输出, 对应开发板的SP2_MI, 开发板上的PWM5对应的是PC7, 要注意, 别接错了.
运行示例, 将一个LED串接一个1-5K的电阻, 接在SP2_MI和GND之间, 就能看到呼吸灯的效果了。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 合宙通信
    +关注

    关注

    0

    文章

    120

    浏览量

    1537
  • Air105
    +关注

    关注

    0

    文章

    48

    浏览量

    269
收藏 人收藏

    评论

    相关推荐

    一个定时器可以同时中断定时输出pwm吗?

    一个定时器可以同时中断定时输出pwm
    发表于 05-08 08:14

    STM32同一定时器PWM输出定时,会影响我的PWM输出吗?

    求助各位大佬 ,我用定时器2通道1输出PWM 定时器设置为TIM2_PERIODE (1000-1) TIM2_PRESCALER 36,现在还想开启2的
    发表于 03-26 07:23

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择器、时钟脉冲发生器等。这也可用于各种应用,如精确定时、顺序
    的头像 发表于 02-25 15:16 453次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    单片机定时器中断应用案例

    定时器中断,顾名思义就是在规定的时间内发送中断请求,要实现定时器中断,单片机需要能够正确地计算时间,单片机是如何进行计时的呢?
    发表于 10-31 14:49 782次阅读
    单片机<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>应用案例

    RA2E1定时器带死区互补PWM中断延时问题分析

    RA2E1定时器带死区互补PWM中断延时问题分析
    的头像 发表于 10-27 10:56 423次阅读
    RA2E1<b class='flag-5'>定时器</b>带死区互补<b class='flag-5'>PWM</b><b class='flag-5'>中断</b>延时问题分析

    如何不关闭定时器停止PWM输出

    定时器PWM输出四通道控制步进电机,现在功能中需要电机停转一段时间,但是在此时间内,定时器不能关闭,因为在中断里还要做其他事情 依赖于
    发表于 10-20 07:08

    高精度定时器与高级控制定时器 PWM 封波后再恢复的区别

    高精度定时器与高级控制定时器 PWM 封波后再恢复的区别
    的头像 发表于 10-17 16:52 345次阅读
    高精度<b class='flag-5'>定时器</b>与高级控制<b class='flag-5'>定时器</b> <b class='flag-5'>PWM</b> 封波后再恢复的区别

    使用MM32F0270 定时器DMA方式输出PWM

    使用MM32F0270 定时器DMA方式输出PWM
    的头像 发表于 10-17 14:47 551次阅读
    使用MM32F0270 <b class='flag-5'>定时器</b>DMA方式<b class='flag-5'>输出</b><b class='flag-5'>PWM</b>

    定时器中断程序怎么写

    定时器中断程序怎么写  在嵌入式系统中,定时器被广泛应用于各种任务。它们在实时系统中可用于轮询,计时等任务。定时器可以被配置为周期性定时器
    的头像 发表于 09-01 10:17 1277次阅读

    Air001在Arduino下的测试IIC工程

    本帖最后由 大懒猫54 于 2023-8-23 11:57 编辑 测试使用Air001开发板,使用PF0,PF1对应的IIC接口,测试0.96英寸的OLED。下载器使用
    发表于 08-23 11:56

    使用定时器PWM输出功能的方法

    PWM(脉冲宽度调制)可用于电机的调速、LED的亮度调节、无源蜂鸣器输出音调等,是嵌入式系统开发中经常采用的方法。本期内容以一个用无源蜂鸣器播放音乐的例子,带领大家了解使用定时器
    发表于 08-16 06:13

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出
    的头像 发表于 08-01 00:13 207次阅读
    使用瑞萨e² studio FSP基于RA2E1<b class='flag-5'>定时器</b>配置<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>

    定时器中断是什么意思,定时器中断的工作原理

    定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1。STM32中共有11个
    的头像 发表于 07-23 09:45 4043次阅读

    STM32定时器(二)定时器中断

    常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2~TIM5,TIM9~TIM14)、高级定时器(TIM1&TIM8)
    的头像 发表于 07-21 14:54 2007次阅读
    STM32<b class='flag-5'>定时器</b>(二)<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>

    STM32定时器(一)PWM输出

    STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器
    的头像 发表于 07-21 14:51 2816次阅读
    STM32<b class='flag-5'>定时器</b>(一)<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>