1027|1

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

[ST NUCLEO-WBA52CG] 7 - 在BLE协议栈的后台处理函数中添加自己的代码 [复制链接]

前面测评的时候,提到了BLE的协议栈是使用sequencer来实现后台任务的管理的,除了sequence以外还提供了定时器函数。因此如果我们想添加自己的任务时,就需要借助sequence或者Tim_serv了。

  • Sequence用于添加一些常用后台任务,尤其是需要事件去触发的任务。
  • Tim_serv用于添加周期性的任务,或者需要延时一段时间之后在启动的任务。

Sequencer的用法

使用sequence的时候,需要用到2个函数UTIL_SEQ_RegTask()和UTIL_SEQ_SetTask()函数。前者是将一个任务注册到后台中,但是此时它还没有运行,需要调用UTIL_SEQ_SetTask()才能运行。两个函数的原型如下:

/**

* [url=home.php?mod=space&uid=159083]@brief[/url] 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 ) );

第一个参数为我们自定义的ID号,第2个参数没有使用,第3个参数则是注册执行的任务函数。需要注意的是ID最多是32个,因为在后台中使用了一个uint32_t的数据,这个数据的每1位代表一个任务。所以要注意限制注册函数的数量。在代码中,我们自定义的函数都是放在一个enum变量中的。

/**

* @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 );

这个函数的第一个参数是将要执行的任务ID,第2个参数为优先级。

Tim_serv的用法

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

比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。

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);

这样就可以实现蓝色LED的闪烁

此帖出自RF/无线论坛

最新回复

使用tim_serv时,首先需要创建 UTIL_TIMER_Create(),然后调用开始函数UTIL_TIMER_Start()或者UTIL_TIMER_StartWithPeriod()。这个库里还包括其它的控制或者设置函数。 比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。   详情 回复 发表于 2023-9-2 11:23
点赞 关注
 

回复
举报

6968

帖子

11

TA的资源

版主

沙发
 

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

比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。

此帖出自RF/无线论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表