Skip to main content
Greg_
Associate II
Aug 19, 2021 12:30 PM UTC
Question

STM32WB55 - how many concurrent timers may be provided by timer server?

As an example, the following code is provided, the timers are started and stopped in app_ble.c.

I can run two of the three leds using two different timers and they work properly, but when I add the third one than the leds start working in an unexpected way. I tried to find details about the concurrent work in AN5289 but I couldn't find any information. I also played a bit with periods, but this also didn't give me any clarity of the server behaviour. May I ask for some support?

OK, with some changes it works much better now :)

#include "leds_task.h"
//#include "main.h"
 
//#define PERIOD_S (1 * 1000 * 1000 / CFG_TS_TICK_VAL) //1s
//#define PERIOD_S (20 * 1000 * 1000 / CFG_TS_TICK_VAL)//20s
 
 
#define PERIOD_LED_BLUE (1 * 1000 * 1000 / CFG_TS_TICK_VAL)//1s
#define PERIOD_BLUE_LED_OFF (1 * 1000 / CFG_TS_TICK_VAL)//1ms
 
#define PERIOD_LED_GREEN (1 * 1270 * 1000 / CFG_TS_TICK_VAL)//1s
#define PERIOD_GREEN_LED_OFF (1 * 1000 / CFG_TS_TICK_VAL)//100ms
 
#define PERIOD_LED_RED (5 * 1000 * 1000 / CFG_TS_TICK_VAL)//1s
#define PERIOD_RED_LED_OFF (1 * 1000 / CFG_TS_TICK_VAL)//500ms
 
 uint8_t LEDSTimerId_BLUE_LED_R;
 uint8_t LEDSTimerId_BLUE_LED;
 
 uint8_t LEDSTimerId_GREEN_LED_R;
 uint8_t LEDSTimerId_GREEN_LED;
 
 uint8_t LEDSTimerId_RED_LED_R;
 uint8_t LEDSTimerId_RED_LED;
 
 
 
 void RegisterLED_BLUE(void)
 {
 HW_TS_Create(CFG_TIM_LED_BLUE, &LEDSTimerId_BLUE_LED_R, hw_ts_Repeated, TIM_SW_LED_BLUE);//creating repeated timer for blue led blinking period
 HW_TS_Start (LEDSTimerId_BLUE_LED_R, PERIOD_LED_BLUE);//starting the timer for blue led blinking period
 }
 
 void RegisterLED_GREEN(void)
 {
 HW_TS_Create(CFG_TIM_LED_GREEN, &LEDSTimerId_GREEN_LED_R, hw_ts_Repeated, TIM_SW_LED_GREEN);//creating repeated timer for green led blinking period
 HW_TS_Start (LEDSTimerId_GREEN_LED_R, PERIOD_LED_GREEN);//starting the timer for green led blinking period
 }
 
 void RegisterLED_RED(void)
 {
 HW_TS_Create(CFG_TIM_LED_RED, &LEDSTimerId_RED_LED_R, hw_ts_Repeated, TIM_SW_LED_RED);//creating repeated timer for red led blinking period
 HW_TS_Start (LEDSTimerId_RED_LED_R, PERIOD_LED_RED);//starting the timer for red led blinking period
 }
 
 
 
 void TIM_SW_LED_BLUE(void)
 {
	HW_TS_Create(CFG_TIM_LED_BLUE_OFF, &LEDSTimerId_BLUE_LED, hw_ts_SingleShot, BLUE_LED_OFF);//creating single shot timer for blue led blinking ratio
 	HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, SET);
 	HW_TS_Start (LEDSTimerId_BLUE_LED, PERIOD_BLUE_LED_OFF);//starting the timer
 }
 
 void TIM_SW_LED_GREEN(void)
 {
	HW_TS_Create(CFG_TIM_LED_GREEN_OFF, &LEDSTimerId_GREEN_LED, hw_ts_SingleShot, GREEN_LED_OFF);//creating single shot timer for green led blinking ratio
 	HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, SET);
 	HW_TS_Start (LEDSTimerId_GREEN_LED, PERIOD_GREEN_LED_OFF);//starting the timer
 }
 
 void TIM_SW_LED_RED(void)
 {
	HW_TS_Create(CFG_TIM_LED_RED_OFF, &LEDSTimerId_RED_LED, hw_ts_SingleShot, RED_LED_OFF);//creating single shot timer for red led blinking ratio
 	HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, SET);
 	HW_TS_Start (LEDSTimerId_RED_LED, PERIOD_RED_LED_OFF);//starting the timer
 }
 
 
 
 void BLUE_LED_OFF(void)
{
 HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, RESET);
 HW_TS_Delete(LEDSTimerId_BLUE_LED);
}
 
 void GREEN_LED_OFF(void)
{
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, RESET);
 HW_TS_Delete(LEDSTimerId_GREEN_LED);
}
 
 void RED_LED_OFF(void)
{
 HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, RESET);
 HW_TS_Delete(LEDSTimerId_RED_LED);
}
 
 
void LEDS_START(void)
{
	RegisterLED_BLUE();
	RegisterLED_GREEN();
	RegisterLED_RED();
}
 
void LEDS_STOP(void)
{
 HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, RESET);
	HW_TS_Delete(LEDSTimerId_BLUE_LED_R);
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, RESET);
	HW_TS_Delete(LEDSTimerId_GREEN_LED_R);
 HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, RESET);
	HW_TS_Delete(LEDSTimerId_RED_LED_R);
}
 
 
 
void LEDS_ON(void)
{
 HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, SET);
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, SET);
 HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, SET);
}
 
void LEDS_OFF(void)
{
 HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, RESET);
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, RESET);
 HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, RESET);
}

This topic has been closed for replies.

1 reply

Remi QUINTIN
ST Technical Moderator
Aug 20, 2021 1:58 PM UTC

Max numbers of timers is 255.