[ST NUCLEO-WBA52CG] 7 - 在BLE协议栈的后台处理函数中添加自己的代码
<div class='showpostmsg'><p>前面测评的时候,提到了BLE的协议栈是使用sequencer来实现后台任务的管理的,除了sequence以外还提供了定时器函数。因此如果我们想添加自己的任务时,就需要借助sequence或者Tim_serv了。</p><ul>
<li>Sequence用于添加一些常用后台任务,尤其是需要事件去触发的任务。</li>
<li>Tim_serv用于添加周期性的任务,或者需要延时一段时间之后在启动的任务。</li>
</ul>
<h3>Sequencer的用法</h3>
<p>使用sequence的时候,需要用到2个函数UTIL_SEQ_RegTask()和UTIL_SEQ_SetTask()函数。前者是将一个任务注册到后台中,但是此时它还没有运行,需要调用UTIL_SEQ_SetTask()才能运行。两个函数的原型如下:</p>
<pre>
<code>/**
* @brief This function registers a task in the sequencer.
*
* @param TaskId_bm The Id of the task
* @param Flags Flags are reserved param for future use
* @param Task Reference of the function to be executed
*
* @note It may be called from an ISR.
*
*/
void UTIL_SEQ_RegTask( UTIL_SEQ_bm_t TaskId_bm, uint32_t Flags, void (*Task)( void ) );</code></pre>
<p>第一个参数为我们自定义的ID号,第2个参数没有使用,第3个参数则是注册执行的任务函数。需要注意的是ID最多是32个,因为在后台中使用了一个uint32_t的数据,这个数据的每1位代表一个任务。所以要注意限制注册函数的数量。在代码中,我们自定义的函数都是放在一个enum变量中的。</p>
<pre>
<code>/**
* @brief This function requests a task to be executed
*
* @param TaskId_bm The Id of the task
* It shall be (1<<task_id) where task_id is the number assigned when the task has been registered
* @param Task_Prio The priority of the task
* It shall a number from 0 (high priority) to 31 (low priority)
* The priority is checked each time the sequencer needs to select a new task to execute
* It does not permit to preempt a running task with lower priority
*
* @note It may be called from an ISR
*
*/
void UTIL_SEQ_SetTask( UTIL_SEQ_bm_t TaskId_bm , uint32_t Task_Prio );</code></pre>
<p>这个函数的第一个参数是将要执行的任务ID,第2个参数为优先级。</p>
<h3>Tim_serv的用法</h3>
<p>使用tim_serv时,首先需要创建 UTIL_TIMER_Create(),然后调用开始函数UTIL_TIMER_Start()或者UTIL_TIMER_StartWithPeriod()。这个库里还包括其它的控制或者设置函数。</p>
<p>比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。</p>
<pre>
<code>UTIL_TIMER_Object_t led_timer_ob; //创建tim_serv的句柄
void blue_led_toggle(void *parameter) //定时执行的任务
{
HAL_GPIO_TogglePin(Blue_Led_GPIO_Port, Blue_Led_Pin);
}
//在void APP_BLE_Init(void)函数中添加以下代码
UTIL_TIMER_Create(&led_timer_ob,500,UTIL_TIMER_PERIODIC,&blue_led_toggle,0);
UTIL_TIMER_Start(&led_timer_ob);</code></pre>
<p>这样就可以实现蓝色LED的闪烁</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>使用tim_serv时,首先需要创建 UTIL_TIMER_Create(),然后调用开始函数UTIL_TIMER_Start()或者UTIL_TIMER_StartWithPeriod()。这个库里还包括其它的控制或者设置函数。</p>
<p>比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。</p>
页:
[1]