• 基于RT1052 Aworks 使能硬件定时器功能(九)


    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发

    在Aworks支持硬件定时器,所有的接口在aw_hwtimer.h当中,我们先通过如下两个函数来入门aw_hwtimer编程。一般来说CPU定时器类多很多种,有周期性中断,输入捕获,输出比较等类型,本文对周期性中断(即定时器)在Aworks下是如何使用的。

    /**
     * rief 从系统分配一个符合指定名字和设备单元号的定时器
     *
     * param[in] pname     定时器的名字
     * param[in] uint      定时器的设备单元号
     * param[in] time_no   定时器号码
     * param[in] pfunc_isr 定时器中断服务函数
     * param[in] p_arg     定时器中断服务函数参数
     *
     * 
    eturn 定时器句柄,AW_HWTIMER_NULL为无效的定时器句柄
     */
    extern aw_hwtimer_handle_t aw_hwtimer_alloc_byname (const char *pname,
                                                        uint8_t     uint,
                                                        uint8_t     time_no,
                                                        void      (*pfunc_isr) (void *p_arg),
                                                        void       *p_arg);
    /**
     * rief 使能定时器
     *
     * param[in] timer        要使能的定时器句柄
     * param[in] frequency_hz 定时中断频率
     *
     * 
    eturn AW_OK 为成功,其它错误码为失败
     */
    extern aw_err_t aw_hwtimer_enable (aw_hwtimer_handle_t timer, uint32_t frequency_hz);
    

    1. 定时器介绍

    本文使用GPT1当作普通定时器

    2. 设备资源及驱动适配

    2.1 设备资源的注册

    其设备资源的初始化awbl_hwconf_imx1050_gpt1.h文件当中
    其设备资源的注册在awbus_lite_hwconf_usrcfg.c文件中的g_awbl_devhcf_list结构体当中

        /* GPT1 */
        AWBL_HWCONF_IMX1050_GPT1
    

    2.2 设备驱动的注册

    其设备驱动的注册在如下位置

    aw_prj_param_auto_cfg.h
    
    #if defined AW_DEV_IMX1050_GPT1  || 
        defined AW_DEV_IMX1050_GPT2
    #define AW_DRV_IMX1050_GPT
    #endif
    
    aw_prj_config.c
    #ifdef AW_DRV_IMX1050_GPT
        awbl_imx10xx_gpt_drv_register();
    #endif
    

    2.3 设备宏开关

    使能GPT模块只需要在aw_prj_params.h 新增相关的宏即可,如下所示

    #define AW_DEV_IMX1050_GPT1
    

    至此我们就可以使用Aworks框架进行hwtimer编程。

    3. 如何测试

    测试代码在下面所示,需要注意的是定时器名字和定时器所在的总线ID号,需要改成GPT1的驱动名称和其总线ID.
    如下所示,可参考设备资源文件awbl_hwconf_imx1050_gpt1.h

    #define  __TEST_HWTIMER_DRV_NAME  AWBL_IMX10XX_GPT_DRV_NAME                /* 定时器名字 */
    #define  __TEST_HWTIMER_BUSID     IMX1050_GPT1_BUSID                  /* 定时器所在的总线ID */
    
    #include "aworks.h"
    #include "aw_int.h"
    #include "aw_hwtimer.h"
    #include "aw_vdebug.h"
    #include "aw_led.h"
    #include "aw_delay.h"
    #include "aw_demo_config.h"
    
    #define  __TEST_HWTIMER_DRV_NAME  AWBL_IMX10XX_GPT_DRV_NAME                /* 定时器名字 */
    #define  __TEST_HWTIMER_BUSID     IMX1050_GPT1_BUSID                  /* 定时器所在的总线ID */
    
    #define  LED  DM_LED
    
    /**
     * rief 硬件定时器中断服务函数。
     * param[in] p_arg : 任务参数
     */
    static void mytimer_isr (void *p_arg)
    {
        aw_led_toggle(LED);
    }
    
    /**
     * rief hwtimer 测试函数
     */
    aw_local void __task_handle (void *arg)
    {
        aw_hwtimer_handle_t mytimer;
    
        /* 分配名为 __TEST_HWTIMER_DRV_NAME 的定时器 */
        mytimer = aw_hwtimer_alloc_byname(__TEST_HWTIMER_DRV_NAME,  /* 定时器名字 */
                                          __TEST_HWTIMER_BUSID,     /* 定时器所在总线ID */
                                          0,                        /* 定时器编号 */
                                          mytimer_isr,              /* 中断回调函数 */
                                          NULL);                    /* 中断回调函数的参数 */
    
        if (mytimer) {
            aw_hwtimer_enable(mytimer, 16);                 /* 使能定时中断 16Hz */
        } else {
            aw_kprintf("Timer allocation fail!
    ");
        }
    
        for (;;) {
            aw_mdelay(1000);
        }
    
    }
    
    /******************************************************************************/
    void demo_hwtimer_byname (void)
    {
        aw_task_id_t    tsk;
    
        tsk = aw_task_create("Hwtimer byname demo",
                             12,
                             4096,
                             __task_handle,
                             NULL);
        if (tsk == NULL) {
            return;
        }
    
        aw_task_startup(tsk);
    
    }
    
    

    4. 总结

    在Aworks下硬件定时器编程 aw_hwtimer_alloc_byname的初始化还是AE支持的,希望大家遇到时别踩坑。文章越写到最后越觉得没有什么可以写的,抓住设备资源的注册和设备驱动的注册,及关注应用接口的使用,前提条件是默认总线驱动是没有BUG的,且Aworks框架之下已经相应的设备驱动。对于Aworks而言,其本身就是希望程序员更加专注于应用开发,而忘记底层代码的实现。

  • 相关阅读:
    【足迹C++primer】46、动态存储类
    java foreach循环为什么不能赋值
    使用apktool解包和打包apk
    杭电 HDU ACM Milk
    [SQL基础]入门
    [c#基础]泛型集合的自定义类型排序
    [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!(续)
    [c#基础]使用抽象工厂实现三层
    [c#基础]DataTable的Select方法
    Winform模拟post请求和get请求登录网站
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169465.html
Copyright © 2020-2023  润新知