manhuami2007 发表于 2023-9-2 11:02

[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&lt;&lt;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(&amp;led_timer_ob,500,UTIL_TIMER_PERIODIC,&amp;blue_led_toggle,0);

UTIL_TIMER_Start(&amp;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>

lugl4313820 发表于 2023-9-2 11:23

<p>使用tim_serv时,首先需要创建 UTIL_TIMER_Create(),然后调用开始函数UTIL_TIMER_Start()或者UTIL_TIMER_StartWithPeriod()。这个库里还包括其它的控制或者设置函数。</p>

<p>比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。</p>
页: [1]
查看完整版本: [ST NUCLEO-WBA52CG] 7 - 在BLE协议栈的后台处理函数中添加自己的代码