QN902X在KEIL中使用定时器中断流程记录
仅以此篇,记录蓝牙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的蓝牙定时器中断功能就可以愉快的使用了。
QN902X在KEIL中使用定时器中断流程记录相关推荐
- 深入浅出地理解STM32中的定时器工作原理
深入浅出地理解STM32中的定时器工作原理 一.如何实现延时 1 纯硬件电路 2 纯软件编程 3 可编程定时/计数器 二.可编程定时/计数器有哪些功能? 三.STM32F103 的定时器有哪些 1 基 ...
- 【CubeMX配置stm32定时器中断】
CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...
- 【MCU】基于STM32CubeMX定时器中断实现LED闪烁
基于STM32CubeMX定时器中断实现 LED 闪烁 本实验基于STM32CubeMX实现对STM32开发板的配置,通过定时器中断实现 LED 闪烁. Table of Contents 基于STM ...
- stm32 TIM定时器中断
一.TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断: 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 ...
- linux内核定时器死机,浅析linux内核中timer定时器的生成和sofirq软中断调用流程
浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...
- 51单片机中断与定时器计数器,基于普中科技教学视频学习记录
目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...
- 【嵌入式编程踩坑记】 - 裸机 -定时器中断中套
定时器是嵌入式裸机编程常用的片上外设,一般是按照一定时间产生一次中断.中断到了代表时间到了.这样,嵌入式工程师就可以用定时器,在特定的时间,做一些事情.这里,以每秒钟打印"hello\r\n ...
- 普中开发板定时器中断
普中开发板的定时器中断C语言实现,间隔时间可能比一秒短,可以改变最下面的n值来修改间隔时间还有就是显示前六位后两位可以复制代码 #include "reg52.h" sbit LS ...
- 定时器中断控制LED闪烁(每隔1s)---普中科技开发仪
定时器中断o,利用中断控制LED闪烁每隔1s闪烁一次(精确的1s) notes: (1)工作方式寄存器TMOD ,低四位用于To,高四位用于T1,(GATE,C/T- ,M1,M0) 一般让GATE ...
最新文章
- 第一篇:BPE算法(附加)
- Spring框架学习day_03:对于读取文件方式的补充/关于spring框架知识点的学习方式
- 克莱门特公司在俄罗斯一个数据中心安装其新型冷却系统
- 《实用技巧》——让你的网站变成响应式的3个简单步骤
- vs python opencv_VsCode+Anaconda+OpenCV开发环境搭建
- java jna调用dll文件_关于java jna调用dll的问题
- svn 修改文件的可执行权限
- 机器学习爬大树之(GBDT原理)--回归篇
- Qlik 助力安井食品实现企业智能决策、高效运营
- Bootstrap下拉菜单标题
- 【词向量】从Word2Vec到Bert,聊聊词向量的前世今生(一)
- navicat导入成功但是没有数据_数据库能建立成功,但是还报错,应该怎么处理...
- 在mybatis里面设置不同数据库运行环境和适应性问题
- cvCanny() 边缘检测
- 【光学】基于Matlab模拟光流场
- 工业相机基础知识详述 —— 焦平面,像平面,弥散圆,光圈,分辨率,景深,接口,靶面尺寸
- java实现图片上传后裁剪,把白色背景变成透明图(电子印章)
- BigDecimal四舍五入保留两位小数
- MODBUS RTU转PROFIBUS DP 转换器怎么接线远创智控
- 【C语言】C语言概述