完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在Aworks支持硬件定时器,所有的接口在aw_hwtimer.h当中,我们先通过如下两个函数来入门aw_hwtimer编程。一般来说CPU定时器类多很多种,有周期性中断,输入捕获,输出比较等类型,本文对周期性中断(即定时器)在Aworks下是如何使用的。
/** * brief 从系统分配一个符合指定名字和设备单元号的定时器 * * param[in] pname 定时器的名字 * param[in] uint 定时器的设备单元号 * param[in] time_no 定时器号码 * param[in] pfunc_isr 定时器中断服务函数 * param[in] p_arg 定时器中断服务函数参数 * * return 定时器句柄,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); /** * brief 使能定时器 * * param[in] timer 要使能的定时器句柄 * param[in] frequency_hz 定时中断频率 * * return 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文件当中 /* GPT1 */ AWBL_HWCONF_IMX1050_GPT1 设备注册 其设备驱动的注册在如下位置 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 */ 1 2 #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 /** * brief 硬件定时器中断服务函数。 * param[in] p_arg : 任务参数 */ static void mytimer_isr (void *p_arg) { aw_led_toggle(LED); } /** * brief 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!n"); } 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而言,其本身就是希望程序员更加专注于应用开发,而忘记底层代码的实现。 |
|
|
|
只有小组成员才能发言,加入小组>>
2384 浏览 0 评论
8888 浏览 4 评论
36462 浏览 18 评论
4980 浏览 0 评论
24278 浏览 34 评论
1367浏览 2评论
1616浏览 1评论
2005浏览 1评论
1430浏览 0评论
1863浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 18:35 , Processed in 1.100233 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号