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

    文章

    148

    浏览量

    2381
  • Air105
    +关注

    关注

    0

    文章

    48

    浏览量

    424
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32A030微控制定时器

    的脉冲宽度和周期、产生输出波形(PWM、单脉冲、插入死区时间 的互补PWM 等)。 2 通用定时器(GTIM1..4) 内部集成4 个通用定时器
    发表于 12-04 06:47

    CW32L010+定时器介绍

    :一组,专为低功耗应用而设计,能够在保持低功耗的同时实现定时功能。 高级控制PWM定时器:一组,支持PWM输出和高级控制功能,适用于需要精确
    发表于 12-01 07:53

    CW32L0开发板学习记录四,高级定时器ATIM学习

    通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和 PWM)。 低功耗定时器(LPTIM): 内部集成1个 16 位低功耗定时
    发表于 12-01 07:35

    CW32定时器中断介绍

    )或者产生输出波形(输出比较和 PWM)。 高级定时器:高级定时器 (ATIM) 由一个 16 位的自动重载计数
    发表于 12-01 07:08

    单片机定时器中断

    定时器/计数的工作方式寄存,确定工作方式和功能;TCON是控制寄存,控制T0,T1的启动和停止以及设置溢出标志。 加一计数的输入
    发表于 11-24 06:22

    PWM定时器、SysTick 区别及应用场景

    在单片机和嵌入式开发中,经常会遇到PWM(脉宽调制)、定时器、SysTick(系统滴答定时器)这几个词。很多初学者容易把它们混为一谈,以为都是“定时
    的头像 发表于 11-17 10:53 227次阅读
    <b class='flag-5'>PWM</b>、<b class='flag-5'>定时器</b>、SysTick 区别及应用场景

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数,计数每计数一次的时间为 1/SYSCLK,一般我们设置系统时
    的头像 发表于 09-23 09:50 1335次阅读
    SysTick系统滴答<b class='flag-5'>定时器</b>简介

    大彩讲堂:VisualHMI-LUA教程-定时器的使用指南

    定时器的使用
    的头像 发表于 08-31 16:59 850次阅读
    大彩讲堂:VisualHMI-LUA教程-<b class='flag-5'>定时器</b>的使用指南

    【沁恒CH585开发板免费试用体验】定时器操作

    与GPIO有挂钩使得它可以发挥强大的作用,比如可以输出不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 CH585有4 个 26 位定时器
    发表于 07-05 23:06

    第十二章 SysTick——系统定时器

    本章介绍了W55MH32的SysTick系统定时器,它是24位递减计数,含4个寄存,可配置定时中断,用于产生时基 等。
    的头像 发表于 05-22 17:16 831次阅读
    第十二章 SysTick——系统<b class='flag-5'>定时器</b>

    揭秘Air780EPM开发陷阱:20个避坑指南与最佳解决方案

    :www.air780epm.cn 问题01: Air780EPM在PSM+模式下,dtimer定时器可以开几个?   答案: 同一时间只能有64个定时器的任务;如果要支持超过64个
    的头像 发表于 05-21 16:04 599次阅读
    揭秘<b class='flag-5'>Air</b>780EPM<b class='flag-5'>开发</b>陷阱:20个避坑指南与最佳解决方案

    MCU定时器/计数

    架构与功能特性‌ 定时器类型与配置‌ 高级控制定时器‌:支持互补PWM输出与刹车功能,适用于电机驱动等高精度控制场景。通用定时器‌:集成输入
    的头像 发表于 04-27 13:54 592次阅读

    stm32同一个定时器不同的通道,可以不同时的输出pwm波形吗?

    请问,stm32的同一个定时器,不同的通道,可以不同时的输出pwm波形吗?比如tim1的ch1输出,延时几毫秒后tim1的ch2输出。 现在
    发表于 03-07 08:20

    定时器已安排!开发小白看过来~

    本文将为您详细介绍Air201定时器的基本操作与设置,确保您轻松上手,包教包会! 在Air201模组搭载的LuatOS系统中,定时器(timer)是一项基础且关键的服务。 它允许
    的头像 发表于 12-31 14:30 767次阅读
    <b class='flag-5'>定时器</b>已安排!<b class='flag-5'>开发</b>小白看过来~

    抄作业!看门狗定时器必备知识

    Air201在模组内部集成了硬件看门狗,今天就一起来聊聊~ 本文将带你了解看门狗的工作原理、应用架构、定时时间设置、软硬件看门狗的区别,以及看门狗定时器的典型应用场景及关键设计因素等内容。 同时通过
    的头像 发表于 12-30 14:44 1080次阅读
    抄作业!看门狗<b class='flag-5'>定时器</b>必备知识