您现在的位置是:首页 >技术教程 >IMX6ULL裸机篇之GPT定时器中断实验网站首页技术教程

IMX6ULL裸机篇之GPT定时器中断实验

凌雪舞 2023-07-13 20:00:02
简介IMX6ULL裸机篇之GPT定时器中断实验

一.   GPT定时器

之前实验有学习IMX6ULL芯片中的EPIT定时器,除此之外,IMX6ULL还有其他的定时器,GPT定时器就是另一种定时器。

GPT1定时器与之前的 EPIT定时器一样都有定时中断功能。除此之外,还有其他的功能,例如,溢出中断等。

这里我们使用 GPT1定时器。

本文使用 GPT定时器实现:500ms 定时闪烁LED灯。

该实验所要做的工作如下:

1.  设置定时器GPT1的软件复位,时钟源,工作模式,计数器值等。涉及 GPT1-CR 寄存器。

2. 设置GPT1的分频值,配置输出比较值。

3.  打开GPT1输出比较通道中断。

4.  使能 GIC 控制器IRQ中断。

5. 注册中断服务程序。

6.  打开GPT1 定时器,涉及 GPT1-CR 寄存器。

7.  实现 GPT1定时器中断服务函数。

二.   GPT定时器中断实验

 

在 "定时器消抖实验" 工程中,在 /bsp/delay目录下的 bsp_delay.c文件中进行添加,添加关于GPT定时器代码,这里我们使用 GPT1定时器。

bsp_delay.c 文件代码如下:

#include "bsp_delay.h"
#include "imx6ull.h"
#include "bsp_int.h"
#include "bsp_led.h"


/* GPT1定时器初始化 */
void GPT1_delay_init(void)
{
    GPT1->CR = 0;
    //软件复位使能
    GPT1->CR |= (1 << 15);
    while((GPT1->CR >> 15) & 0X01); //等待复位结束

   /*
    *设置时钟源为ipg_clk=66MHZ,工作模式(restart-mode)
    *默认计数器值从 0开始
    */
    GPT1->CR |= (1 << 1) | (1 << 6);

    //设置分频值为66MHZ  
    //频率为 66MHZ/66 = 1Mhz
    GPT1->PR |= 65; 

    //设置计数器值
    GPT1->OCR[0] = 1000000/2; //500ms

    //开启GPT1输出通道1比较中断
    GPT1->IR |= (1 << 0);

    /* 使能GIC控制器 */
    GIC_EnableIRQ(GPT1_IRQn);
    /* 注册中断服务函数 */
    system_register_irqhandler( GPT1_IRQn, GPT1_irq_handler, NULL);     
    
    //打开GPT1定时器
    GPT1->CR |= (1 << 0);
}

/* GPT1定时器的中断服务函数 */
void GPT1_irq_handler(unsigned int gicciar, void* param)
{  
    static unsigned int state = OFF;

    if((GPT1->SR & 0X01)) //中断是否发生
    {
        state = !state;
        led_switch(LED0, state);
    }
    //清除中断标志位
    //注意:写1清除中断标志位
    GPT1->SR |= (1 << 0);
}

//短延时
void short_delay(volatile unsigned int n)
{
    while(n--)
    {

    }
}

//延时 
//一次循环大概 1ms,在主频 396 MHZ时候
//n : 延时毫秒数
void delay(volatile unsigned int n)
{
    while(n--)
    {
        short_delay(0X7FF);
    }
}

bsp_delay.h 文件添加上以上函数的声明即可。

至此,完成 GPT1定时器中断实现 500ms LED闪烁。

实验需要注意点如下:

1.   一般带有软件复位功能的,我们需要使能软件复位功能。

2.   对于 GPT1->SR寄存器,即中断标志位,写中1 清除断标志位

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。