(七)arm裸机开发---EPIT定时器实验

本节主要介绍EPIT定时器,主要介绍CR,SR,CNR,CMPR的寄存器。

一、EPIT定时器

    EPIT定时器(Enhanced Periodic Interrupt Timer)是增强型周期中断定时器,只有周期性定时的功能。EPIT 定时器有两种工作模式: set-and-forget 和 free-running。
set-and-forget 模式:EPITx_CR(RLD )=1,计数器加载EPITx_LR中的值,计数到0再次加载EPITx_LR中的值。
free-running 模式:EPITx_CR(RLD )=0,当计数器计数到0以后会重新从0XFFFFFFFF开始计数。
    比较重要的寄存器有:寄存器 EPITx_LR、 EPITx_CMPR 和 EPITx_CNR 分别为加载寄存器、比较寄存器和计数寄存器
在这里插入图片描述
我们选择set-and-forget 模式。
1.我们选择ipg_clk时钟,所以EPITx_CR[25:24]=01;
2.设置分频,我们选择不分频EPITx_CR[15:4]=0;
3.设置set-and-forget 模式,EPITx_CR[3]=1;
4.打开比较中断使能,EPITx_CR[2]=1;
5.EPIT使能位,EPITx_CR[1]=1;EPITx_CR[0]=1;
6.中断标志位, EPITx_SR[0],读到1时即发生中断,写入1清除中断。
7.设置PIT1_LR 中的加载值和寄存器 EPIT1_CMPR 中的比较值。

二、定时器实验

定时器实验,使用EPIT产生定时中断,在中断函数中点亮LED,实现周期性的led灯的闪烁。

#include "bsp_epit_timer.h"

/*EPIT时钟初始化*/
void epit_init(unsigned int frac,int value){
    if(frac > 0XFFF){
        frac = 0XFFF;
    }
    EPIT1->CR = 0;                  //清零
    /*配置CR寄存器的值,按照上面的配置*/
    EPIT1->CR |= (1<<24) | (frac << 4) | (1 << 3) | (1 << 2) | (1 << 1);

    EPIT1->LR   = value;            //设置加载寄存器的值
    EPIT1->CMPR = 0;                //设置比较寄存器的值
    GIC_EnableIRQ(EPIT1_IRQn);      //初始化GIC对应的中断

	/*中断处理函数注册*/
    system_register_irq_handler(EPIT1_IRQn, epit1_irq_handler, NULL);
    EPIT1->CR  |= (1 << 0);         //打开定时器
}

/*中断处理函数*/
void epit1_irq_handler(unsigned int gicciar, void *param){
    static unsigned char status = 0;
    if (EPIT1->SR & 0x1)
    {   status = !status;
        led_switch(LED0,status);  	//点亮led
        EPIT1->SR = 0x1;			//复位中断标志位
    }
}

这一节比较简单,只需要配置EPIT的几个寄存器的设置,然后一个比较中断处理函数的编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值