QN902X在KEIL中使用定时器中断流程记录

news/2024/11/20 4:28:31/

仅以此篇,记录蓝牙BLE(QN902x)开发过程中,使用ke_timer_set ((p_ke_timer_set)(_ke_timer_set))的流程;

首先,我们要使用这个函数,必须先了解它能干什么,需要什么条件才能使用

第一步:找到函数原型(盘它)

/******************************************************************************************* @brief Set a timer.** The function first cancel the timer if it is already existing, then* it creates a new one. The timer can be one-shot or periodic, i.e. it* will be automatically set again after each trigger.* 这个函数首先取消已经存在的定时器,然后创建一个新的。定时器可以是一次性的,也可以是周期性的,也就 * 是说每次触发后会自动设置一次* When the timer expires, a message is sent to the task provided as* argument, with the timer id as message id.* 当计时器到期时,一个消息被发送到任务提供的参数,与计时器id作为消息id* The timer is programmed in time units (TU is 10ms).* 定时器编程的时间单位(TU是10ms)* @param[in] timer_id      Timer identifier (message identifier type).* @param[in] task_id       Task identifier which will be notified* @param[in] delay         Delay in time units.*****************************************************************************************/
typedef void (*p_ke_timer_set)(ke_msg_id_t const timer_id, ke_task_id_t const task, uint16_t const delay);

使用示例:ke_timer_set(DEVICE_TIMER,TASK_APP,1);

从上面的示例中,可以分析出使用这个函数需要一个ID参数(上面定义中的参数原型是:ke_msg_id_t const timer_id),一个TASK参数,一个延时时间参数(这个时间代表的是  从此处开始,延时这个时间后执行这个函数里面的代码!)

第二步:定义应用程序消息接口

何为应用程序消息接口?

根据蓝牙BLE特有的性质,这个应用程序消息接口也就是消息ID(示例中的第一个参数:DEVICE_TIMER),有了这个ID,就能找到ID对应的定时器响应函数;所以接下来我们要去定义这个ID以及它对应的响应函数了。

如何定义这个ID?

进入app_task.h这个文件里:

/// App Message Interface 应用程序消息接口
enum
{/// Debug UART received dataAPP_SYS_UART_DATA_IND = KE_FIRST_MSG(TASK_APP),APP_ADV_INTV_UPDATE_TIMER,APP_SYS_RCO_CAL_TIMER,APP_SYS_32K_XTAL_WAKEUP_TIMER,APP_SYS_TIME_CHECK_TIMER,//add by john for krait
#if  (defined(KRAIT_9021_EVB)||defined(KRAIT_9020_EVT))APP_KBS_SEND_DATA_DELAY_TIMER,APP_KBS_BLE_CONN_WAIT_TIMER,KRAIT_TIMEOUT_TIMER,RESTART_OV788,UVC_START,TEST_TIMEOUT_TIMER,
#ifdef OV_DELAY_TIMERKRAIT_OV_DELAY_TIMER,
#endif
#endif	APP_HTPT_PERIOD_MEAS_TIMER,APP_HTPT_IDLE_CONNECTION_TIMEOUT_TIMER,APP_PROXR_ALERT_STOP_TIMER,APP_BLPS_PRESSURE_TIMER,APP_HRPS_TIMER,APP_TIPS_CURRENT_TIME_TIMER,APP_SCPPS_SCAN_REFRESH_TIMER,APP_BASS_BATT_LEVEL_TIMER,APP_GLPS_MEAS_SEND_TIMER,APP_RSCPS_MEAS_SEND_TIMER,APP_CSCPS_MEAS_SEND_TIMER,APP_PASPS_UPDATE_ALERT_STATUS_TIMER,APP_PASPS_UPDATE_RINGER_TIMER,APP_HOGPD_BOOT_KB_IN_REPORT_TIMER,APP_HOGPD_BOOT_MOUSE_IN_REPORT_TIMER,APP_HOGPD_REPORT_TIMER,APP_MSG_MAX,YUNQI_THREAD_1_TIMER,YUNQI_THREAD_2_TIMER,YUNQI_THREAD_3_TIMER,YUNQI_THREAD_4_TIMER,YUNQI_THREAD_5_TIMER,YUNQI_AUDIO_TIMER,
//designed by selfDEVICE_TIMER,
};

在这个枚举里面添加自己定义的ID,我这里定义的是DEVICE_TIMER,就是设备定时器的意思。

现在定义好了ID,如何添加这个ID对应的中断响应函数呢?

第三步:添加ID对应的中断响应函数

进入app_task.c这个文件里:

/* default State handlers definition. 默认状态处理程序定义*/
const struct ke_msg_handler app_default_state[] =
{xxxx......#if BLE_QPP_SERVER{QPPS_DISABLE_IND,                  	(ke_msg_func_t) app_qpps_disable_ind_handler},{QPPS_ERROR_IND,                    	(ke_msg_func_t) app_qpps_error_ind_handler},{QPPS_DATA_SEND_CFM,                	(ke_msg_func_t) app_qpps_data_send_cfm_handler},{QPPS_CFG_INDNTF_IND,               	(ke_msg_func_t) app_qpps_cfg_indntf_ind_handler},{QPPS_DAVA_VAL_IND,         	        (ke_msg_func_t) app_qpps_data_ind_handler},{QPPS_CREATE_DB_CFM,                	(ke_msg_func_t) app_qpps_create_db_cfm_handler},//Task_DIY{DEVICE_TIMER,							(ke_msg_func_t) motor_timer_handler},
#endifxxxx......
};

在const struct ke_msg_handler app_default_state[] 这个数组中添加以下数据:

        数据格式:{    ID    ,    ID对应的响应函数    }

参考上述格式写出我们ID对应的响应函数,此处我编写的代码如下:

{DEVICE_TIMER,                            (ke_msg_func_t) motor_timer_handler},

到这一步了,应该知道如果我们执行了语句ke_timer_set(DEVICE_TIMER,TASK_APP,1);

我们的程序就会在10ms后调用motor_timer_handler()这个中断响应函数,具体响应函数怎么编写,就可以根据实际的需求而定了

第四步:编写定时器中断响应函数

int motor_timer_handler(ke_msg_id_t const msgid, void const *param,ke_task_id_t const dest_id, ke_task_id_t const src_id)
{/*需要实现的功能代码*///在响应函数中重复调用ke_timer_set(DEVICE_TIMER,TASK_APP,1)语句,是为了实现每10ms执行一次此函数,你也可以删除此语句,那么程序会执行一次就退出ke_timer_set(DEVICE_TIMER,TASK_APP,1);//10ms后调用return (KE_MSG_CONSUMED);//这一步是为了释放定时器资源
}

至此,QN902x的蓝牙定时器中断功能就可以愉快的使用了。


http://www.ppmy.cn/news/404465.html

相关文章

论文阅读:VoltJockey: Breaching TrustZone by Software-Controlled Voltage Manipulation over

这里写目录标题 论文题目TrustzoneDVFSSoC基于电压的硬件故障攻击方法 论文题目 VoltJockey: Breaching TrustZone by Software-Controlled Voltage Manipulation over Multi-core Frequencies Side Channels CCS ’19, November 11–15, 2019, London, United Kingdom Volt…

半导体初创企业中的RISC-V

link 资讯 半导体初创企业中的RISC-V 半导体初创企业中的RISC-V 来源:电子发烧友网 发布时间:2022-01-05 分享至微信 电子发烧友网报道(文/周凯扬)在去年涌现出来的一众半导体初创企业中,RISC-V似乎成了一个热门技术。这些企业或收获了可观的…

QCA-WIFI无线芯片介绍

QCA无线芯片介绍 mips系列ARM系列PCIE系列 mips系列 MIPS系列: 芯片名参数AR9344(Wasp)n/a MIPS 74Kc 560 MHz abgn 2x2:2 DB120 2011-10-31 PCIe host,USB 2.0 hostQCA9558(Scorpion)MIPS 74Kc 720 MHz abgn 3x3:3 AP135 2013-01-04 NOR/N…

指令集架构、arm内核、SoC、处理器、CPU、GPU等的关系

指令集架构如:ARMv5、ARMv6、ARMv7-A/R、ARMv8-A [28] ARM内核如:ARM7、ARM9、ARM11(v6)、到cortex-A7、A8、A9、A12、A15(v7-A/R)、到cortex-A53、A57(V8)、A72、A73。缓存(cache)就是在内核中的[4]。这些…

Kruskal 算法介绍

一 点睛 构造最小生成树还有一种算法,即 Kruskal 算法:设图 G(V,E)是无向连通带权图,V{1,2,...n};设最小生成树 T(V,TE),该树的初始状态只有 n 个节点而无边的非连通图T…

GitKraKen——安装及基本使用

GitKraKen 一、安装并破解 GitKraKen是收费工具,有能力的朋友请支持正版 1.下载最新版 2.将系统中release.gitkraken.com api.gitkraken域名屏蔽掉 这个目的是为了防止更新gitkraken,若不屏蔽掉这个域名,那么每次打开GitKraken是默认去检…

安卓实战开发之——使用 WIFI 进行设备搜索并获取相应信息

目录 一、前言 二、准备条件 三、功能要求 四、显示效果 五、关键代码 一、前言 此玩意是本人很早很早(记不清有多早了,反正很早)做过的一个课程任务了,无意之中翻到了,所以把它放上来。不愿再找以前写的代码了…

scroll 元素滚动到指定位置(包含app和网页)

使用VueScrollTo实现网页平滑滚动效果 VueScrollTo是一个基于Vue的平滑滚动插件,实现网页中元素点击后平滑滚动到目标位置的效果。在很多情况下,我们需要在网页中使用锚点链接,但是默认的锚点跳转方式可能会出现跳动或者瞬间跳转的情况&…