STM32 FreeRTOS 7.6 TimerIRQ Semaphore Thread starten

Gast #4258118
Lesenswert?

Hallo,

ich komme nicht weiter und hoffe, das mir hier jemand helfen kann.

Zum Thema ich probiere mich gerade mit dem Evalboard STM32F3Discovery 
mit FreeRTOS 7.6 aus. Zu den Schnittstellen des CMSIS RTOS gibt es ja 
eine menge Anleitungen, wie man mit einem Semaphore aus einem ISR einen 
Thread "aktiveren" kann.

Der Thread an sich läuft und der Timer auch. Ausgaben via printf und SWV 
funktionieren.

Nur hier ist mein Problem.

Sobald ich versuche ein osSemaphoreRelease im TimerISR auszuführen 
bleibt der Controler komplett stehen.
Wenn ich osSemaphoreRelease zB in Threads oder im SysTick_Handler 
aufrufe, funktioniert alles wie gewollt.

Auschnitt aus stm32f3xx_it.c

/**
* @brief This function handles TIM7 global interrupt.
*/
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */
  osSemaphoreRelease(myBinarySem01Handle);
  /* USER CODE END TIM7_IRQn 1 */
}

Zu den Timer Initialiserungen:
Ausschnitt aus main.c
/* TIM7 init function */
void MX_TIM7_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;

  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 16000;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 1000;
  HAL_TIM_Base_Init(&htim7);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);

}

Ausschnitt aus stm32f3xx_hal_msp.c
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM7)
  {
  /* USER CODE BEGIN TIM7_MspInit 0 */

  /* USER CODE END TIM7_MspInit 0 */
    /* Peripheral clock enable */
    __TIM7_CLK_ENABLE();
  /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(TIM7_IRQn, 10, 0);
    HAL_NVIC_EnableIRQ(TIM7_IRQn);
  /* USER CODE BEGIN TIM7_MspInit 1 */

  /* USER CODE END TIM7_MspInit 1 */
  }

}

Stehen bleibt er bei Ausschnitt aus port.c

__asm unsigned long ulPortSetInterruptMask( void )
{
  PRESERVE8

  mrs r0, basepri
  mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
  msr basepri, r1
  bx r14  <---
}

Den meisten Code habe ich von STM32CubeMX erstellen lassen und editiert.

Habe ich evtl. etwas vergessen? Ich versuche gerade die Funktionsweise 
STM32 mit CMSIS zu verstehen.

Vielen Dank für eure Hilfe!
Gast #4258290
Lesenswert?

Danke für die Antwort.

Die ISR Prioritytät müsste sich ja über

HAL_NVIC_SetPriority(TIM2_IRQn, -->5<--, 0);

Und die RTOS Priorität sich über

#define configMAX_SYSCALL_INTERRUPT_PRIORITY

einstellen lassen?

Hier habe ich bereits mehrere Variationen ausprobiert gerade beim Timer 
zwischen 5 und 15.

Auch bei selber Priorität wie TIM2 funktioniert der Aufruf im SysTick 
immernoch.
Oder hab ich hier etwas falsch verstanden?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren