找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1002|回复: 0
打印 上一主题 下一主题
收起左侧

AT32定时器

[复制链接]
跳转到指定楼层
楼主
一、定时器中断
定时器溢出中断是定时器最基础功能,进入中断的时间周期可由相关寄存器配置。
1、 定时器计数器值 TMRx_CVAL
2、 定时器预分频寄存器 TMRx_DIV
3、定时器周期寄存器(TMRx_PR)

配置流程
1  编写定时器溢出中断函数的应用程序
2  开启定时器外设时钟
3  配置定时器 TMRx_DIV 寄存器和 TMRx_PR 寄存器
4  配置定时器为向上计数方向
5 开启定时器溢出中断
6  开启 NVIC 溢出中断
7 开启定时器计数

int main(void)
{
/* 系统时钟配置 */
system_clock_config();
/* LED 延时函数等初始化 */
at32_board_init();
/* 获取系统时钟 */
crm_clocks_freq_get(&crm_clocks_freq_struct);
/* 点亮 LED2/LED3/LED4 */
at32_led_on(LED2);
at32_led_on(LED3);
at32_led_on(LED4);
/* 开启 TMR1 时钟 */
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
/* 配置定时器 TMRx_DIV 寄存器和 TMRx_PR 寄存器 */
/* systemclock/24000/10000 = 1hz */
tmr_base_init(TMR1, 9999, (crm_clocks_freq_struct.ahb_freq / 10000) - 1);
/*配置定时器为向上计数方向,如果选择向上计数也可以不配置该语句,
因为 TMR 默认就是向上计数模式 */
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
/* 开启定时器溢出中断 */
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
/* 开启 NVIC 溢出中断 */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 0, 0);
/* 开启定时器计数 */
tmr_counter_enable(TMR1, TRUE);
clkout_config();
while(1)
{

}
}


中断函数

void TMR1_OVF_TMR10_IRQHandler(void)
{
/* 判断溢出标志位是否置起 */
if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET)
{
/* 增加应用程序 */
at32_led_toggle(LED3);
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
}

实验效果LED3 1 秒翻转一次


公式.jpg (50.09 KB, 下载次数: 48)

公式.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表