登录
【合宙Air105开发板试用体验】Air105的定时器, 定时器中断和PWM输出
开发板试用精选
2022-12-02
1006
分享海报
开发板试用精选
807 文章
87w阅读
143粉丝
+关注
描述
本文来源电子发烧友社区,作者:Michael, 帖子地址:
https://bbs.elecfans.com/jishu_2287621_1_1.html
Air105 的
ti
mer
定时器
1 个 Timer 单元,包含 8 个独立定时器: Timer0,Timer1,Timer2,Timer3,Timer4,Timer5,
Timer6,Time7
8 个定时器中断源独立,每个定时器单独占 1 个中断源
使用 PCLK 时钟频率作为定时器计时钟源
定时器采用向下计数方式
PWM
每个 Timer 单元定时器都支持 PWM 模式
PWM 模式最高频率 PCLK/2
PWM 单次触发(one shot)功能
定时器相关代码
以下代码基于 air105_project
https://gitee.com/iosetting/air105_project
的库函数
定时器模块结构
在Air105中, 全局只有一个定时器模块, TIMM0
typedef struct
{
TIM_TypeDef TIM[TIM_NUM];
__I uint32_t TIM_IntStatus;
__I uint32_t TIM_EOI;
__I uint32_t TIM_RawIntStatus;
__I uint32_t TIM_Comp;
__IO uint32_t TIM_ReloadCount[TIM_NUM];
} TIM_Module_TypeDef;
复制代码
这个 TIMM0 的地址定义在 air105.h 中
#define TIMM0 ((TIM_Module_TypeDef *)TIMM0_BASE)
#define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */
#define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000)
#define TIMM0_BASE (AIR105_APB0_BASE + 0x3000)
复制代码
地址 = 0x40000000UL + 0x10000 + 0x3000 = 0x4001 3000
范围 [0x4001_3000, 0x4001_3FFF]
定时器初始化
定时器的初始化只需要两个参数: TIMx, 周期(时钟数), 为配合定时器使用, 还需要定义中断
void Timer_Init(void)
{
TIM_InitTypeDef TIM_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
// 开启定时器的外设时钟
SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
// 定时器的时钟是 PCLK, 计数间隔为 1ms 对应的时钟数
TIM_InitStruct.TIM_Period = SYSCTRL->PCLK_1MS_VAL;
// 使用 定时器0
TIM_InitStruct.TIMx = TIM_0;
// 初始化
TIM_Init(TIMM0, &TIM_InitStruct);
// 开启定时器0的中断
TIM_ITConfig(TIMM0, TIM_InitStruct.TIMx, ENABLE);
//NVIC
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = TIM0_0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
// 启动定时器0
TIM_Cmd(TIMM0, (TIM_NumTypeDef)TIM_0, ENABLE);
}
复制代码
定时器中断处理
Air105对应每个定时器, 各有一个中断处理函数, 可以查看 startup.air105.s 中的中断向量定义
TIM0_0_IRQHandler
TIM0_1_IRQHandler
TIM0_2_IRQHandler
TIM0_3_IRQHandler
TIM0_4_IRQHandler
TIM0_5_IRQHandler
TIM0_6_IRQHandler
TIM0_7_IRQHandler
复制代码
对应 Timer0 的中断处理, 写在 air105_it.c. TIM_ClearITPendingBit 和 NVIC_ClearPendingIRQ 是必须调用的, 用于清除中断
void TIM0_0_IRQHandler(void)
{
TIM_ClearITPendingBit(TIMM0, TIM_0);
NVIC_ClearPendingIRQ(TIM0_0_IRQn);
}
复制代码
下面加入处理逻辑的例子, 每秒调用一次 timer_handler(), 注意不要在中断处理中使用耗时的工作
extern uint32_t timer_count;
extern void timer_handler(void);
void TIM0_0_IRQHandler(void)
{
timer_count++;
if (timer_count >= 1000)
{
timer_count = 0;
timer_handler();
}
TIM_ClearITPendingBit(TIMM0, TIM_0);
NVIC_ClearPendingIRQ(TIM0_0_IRQn);
}
复制代码
定时器示例代码
使用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周期
typedef struct
{
TIM_NumTypeDef TIMx;
uint32_t TIM_LowLevelPeriod;
uint32_t TIM_HighLevelPeriod;
}TIM_PWMInitTypeDef;
复制代码
用Timer5初始化
void TimerPWM_Init(void)
{
TIM_PWMInitTypeDef TIM_PWMInitStruct;
SYSCTRL_APBPeriphClockCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
SYSCTRL_APBPeriphResetCmd(SYSCTRL_APBPeriph_TIMM0, ENABLE);
//Timer5 -> PWM5
TIM_PWMInitStruct.TIM_HighLevelPeriod = SYSCTRL->PCLK_1MS_VAL;
TIM_PWMInitStruct.TIM_HighLevelPeriod = 0;
TIM_PWMInitStruct.TIMx = TIM_5;
TIM_PWMInit(TIMM0, &TIM_PWMInitStruct);
TIM_Cmd(TIMM0, TIM_5, ENABLE);
}
复制代码
将 PB5 功能复用为 PWM5
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Remap = GPIO_Remap_2;
GPIO_Init(GPIOB, &gpio);
复制代码
实时调节占空比, 后两个参数代表PCLK时钟周期个数
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
示例接线:
根据
开发板
的BOM
PCB
查看
https://wiki.luatos.com/_static/bom/Air105.html
Timer5对应的PWM5输出, 对应开发板的SP2_MI, 开发板上的PWM5对应的是PC7, 要注意, 别接错了.
运行示例, 将一个LED串接一个1-5K的电阻, 接在SP2_MI和GND之间, 就能看到呼吸灯的效果了。
打开APP阅读更多精彩内容
点击阅读全文
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
合宙通信
Air105
合
宙
MCU系列
Air105
开发板
免费
试用
2022-03-15
0
【
合
宙
Air105
开发板
试用
体验】+初识
Air105
开发板
2022-05-22
0
【
合
宙
Air105
开发板
试用
体验】
Air105
开发板
入门体验
2022-05-23
0
【
合
宙
Air105
开发板
试用
体验】小小
定时器
,能有大作用!
2022-05-26
0
【
合
宙
Air105
开发板
试用
体验】
Air105
的时钟和延迟函数
2022-06-18
0
【
合
宙
Air105
开发板
试用
体验】
Air105
的
定时器
,
定时器
中断
和
PWM
输出
2022-06-18
0
【
合
宙
Air105
开发板
试用
体验】当
AIR105
遇上RT-Thread
2022-06-21
0
【
合
宙
Air105
开发板
试用
体验】用MDK Keil
开发
呼吸灯应用
2022-06-30
0
【
合
宙
Air105
开发板
试用
体验】
开发
环境搭建
2022-12-02
2002
【
合
宙
Air105
开发板
试用
体验】Ari
105
开发板
开箱,及摄像头使用
2022-12-05
5369
尺寸仅有21mm*51mm,板边采用邮票孔设计,
合
宙
Air105
核心
板
开发
总结
2023-03-28
1243
【免费
试用
】
合
宙
MCU系列
Air105
开发板
,免费申请
试用
!
2022-03-21
857
全部
0
条评论
快来发表一下你的评论吧 !
发送
登录/注册
×
20
完善资料,
赚取积分