zoukankan      html  css  js  c++  java
  • GPT定时器中断实现—基于I.MX6UL嵌入式SoC

    1、前言

    在前面的文章《GPT定时器实现高精度延时—基于I.MX6UL嵌入式SoC》中,链接如下:

    https://www.cnblogs.com/Cqlismy/p/13234708.html

    主要介绍了GPT定时器的基本内容,并实现了如何使用GPT定时器实现高精度的延时实例,本文将简单介绍如何去使用GPT定时器的中断,关于GPT定时器的更详细内容可以参考上面给出的链接。

    2、GPT定时器中断实现

    GPT定时器具有一个32bit的递增计数器,具有三路可编程输出模式的输出比较通道,GPT定时器输出比较中断使用编程步骤如下:

    • 设置GPT定时器的时钟源,可以通过设置GPTx_CR寄存器中的CLKSRC(bit[8:6]),选择GPT定时器的时钟来源;
    • 设置GPT定时器的工作模式,可以通过设置GPTx_CR寄存器中的FRR(bit9),选择GPT定时器的工作模式;
    • 设置GPT定时器的预分频值,可以通过设置GPTx_PR寄存器中的PRESCALER(bit[11:0]),配置GPT定时器时钟的分频值;
    • 设置GPT定时器输出比较通道寄存器中的比较值,该值将决定输出比较事件将什么时候发生,可以通过配置GPTx_OCRy寄存器去实现;
    • 使能GPT定时器的输出比较中断功能,可以通过设置GPTx_IR寄存器中的相关bit去实现;
    • 实现GPT定时器的中断处理服务函数;
    • 使能GPT定时器以及GPT对应的中断。

    接下来,在前面的裸机基础上进行编程开发:

    进入到工程的bsp目录,新创建gptint目录:

    $ cd bsp/bsp
    $ mkdir gptint
    $ cd gptint
    $ touch bsp_gptint.h
    $ touch bsp_gptint.c

    新创建的bsp_gptint.h文件内容如下所示:

    #ifndef __BSP_GPTINT_H
    #define __BSP_GPTINT_H
    
    #include "imx6ul.h"
    
    void gpt2_init(unsigned int prescalar, unsigned int value);
    void gpt2_irqhandler(unsigned int giccIar, void *userParam);
    
    #endif

    在该文件中主要是一些函数的声明,相关函数的实现在bsp_gptint.c,该文件的内容如下:

    #include "bsp_gptint.h"
    #include "bsp_int.h"
    #include "bsp_led.h"
    
    /**
     * gpt2_init() - GPT2定时器初始化函数
     * 
     * @prescalar: 分频值,能设置的范围为1~4096
     * @value: 装载值 
     * 
     * @return: 无
     */
    void gpt2_init(unsigned int prescalar, unsigned int value)
    {
        if (prescalar > 4096)
            prescalar = 4096;
        
        GPT2->CR = 0;           /* GPT2_CR寄存器清0 */
        GPT2->CR |= 1 << 15;    /* GPT2定时器进入软复位状态 */
        while ((GPT2->CR >> 15) & 0x01);    /* 等待软复位完成 */
    
        /**
         * 配置GPT2_CR寄存器相关位
         * bit[22:20]: 000 输出比较功能关闭
         * bit[9]: 0 GPT2定时器工作于Restart模式
         * bit[8:6]: 001 GPT2时钟源选择ipg_clk=66MHz
         */
        GPT2->CR |= (1 << 6);
    
        /**
         * 配置GPT2_PR寄存器,设置时钟分频系数
         * bit[11:0]: 分频值,0x000~0xFFF代表1~4096分频
         */
        GPT2->PR = prescalar - 1;
    
        /**
         * 配置GPT2_OCR1寄存器,输出比较1的计数值
         */
        GPT2->OCR[0] = value;
    
        /**
         * 配置GPT2_IR寄存器,使能输出比较1中断
         * bit[0]: 1 输出比较1中断使能
         */
        GPT2->IR |= 1 << 0;
    
        GIC_EnableIRQ(GPT2_IRQn);    /* 使能GIC相应的GPT2中断 */
    
        /* 注册GPT2的中断服务函数 */
        system_register_irqhandler(GPT2_IRQn,
            (system_irq_handler_t)gpt2_irqhandler, NULL);
    
        GPT2->CR |= 1 << 0; /* 使能GPT2定时器 */
    }
    
    /**
     * gpt2_irqhandler() - GPT2中断服务处理函数
     * 
     * @giccIar: 中断号
     * @userParam: 用户参数 
     * 
     * @return: 无
     */
    void gpt2_irqhandler(unsigned int giccIar, void *userParam)
    {
        static unsigned char led1_state;
    
        led1_state = !led1_state;
        if (GPT2->SR & (1 << 0))
            led_switch(LED1, led1_state);
    
        GPT2->SR |= 1 << 0; /* 清除GPT2输出比较1中断标志位 */
    }

    bsp_gptint.c文件中实现了两个函数gpt2_init()和gpt2_irqhandler(),分别是GPT2定时器的初始化函数和GPT2定时器中断处理服务函数,主要是使用到GPT2定时器中的输出比较中断功能,函数比较简单,就不介绍了。

    app.c文件中的内容如下:

    #include "bsp_clk.h"
    #include "bsp_delay.h"
    #include "bsp_gpio.h"
    #include "bsp_led.h"
    #include "bsp_key.h"
    #include "bsp_int.h"
    #include "bsp_epit.h"
    #include "bsp_gptdelay.h"
    #include "bsp_gptint.h"
    
    /**
     * main() - 主函数
     */
    int main(void)
    {
        unsigned char led2_state = ON;
    
        interrupt_init();           /* 中断初始化 */
        imx6ul_clk_init();          /* 初始化相关时钟 */
        system_clk_enable();        /* 系统外设时钟使能 */
        delay_init();               /* 硬件定时器延时初始化 */
        led_init();                 /* LED灯初始化 */
        gpt2_init(66, 1000000);     /* EPIT1定时器初始化 */
    
        while (1) {
            led2_state = !led2_state;
            led_switch(LED2, led2_state);
            delay_ms(1000);
        }
    
        return 0;
    }

    在main()函数中需要调用gpt2_init()函数进行GPT2定时器的初始化,最后,编译相应的文件生成可执行的.imx文件,烧写到I.MX6UL目标板中验证即可。

    3、小结

    本文主要简单介绍了I.MX6UL嵌入式SoC中的GPT定时器中断使用实例。

  • 相关阅读:
    ubuntu服务器全部署
    果蝇优化算法(FOA)
    小波神经网络(WNN)
    R语言预测实战(第二章--预测方法论)
    ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)
    R语言预测实战(第一章)
    卷积神经网络(CNN)
    RSS(简易信息聚合)和jieba(第三方分词组件)
    第四章--基于概率论的分类方法:朴素贝叶斯--新闻分类(三)
    第四章--基于概率论的分类方法:朴素贝叶斯--过滤垃圾邮件(二)
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/13414003.html
Copyright © 2011-2022 走看看