您现在的位置是:首页 >技术教程 >IMX6ULL裸机篇之GPT定时器中断实验网站首页技术教程
IMX6ULL裸机篇之GPT定时器中断实验
简介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 清除断标志位。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。