Use STM32 interrupt with FreeRTOS

I'm confused in using HAL-defined interrupts with FreeRTOS. I'm trying to implement "6.3 Deferred Interrupt Processing" in the guide of FreeRTOS, but I don't know how to do it.

The problem is how to use the peripherals of the STM32 with FreeRTOS. Should I give a semaphore to another task (which read and treat the values) within the irqn "ADC_IRQHandler()" for the ADC or the callback "HAL_ADC_ConvCpltCallback()" for the ADC or just read values with the HAL functions and treat them with FreeRTOS tasks (this one works, but it does not seem to use the RTOS power)?

The manual I talk about: 6.3 Deferred Interrupt Processing (PDF)

• First of all, don't use "nop" loops to create delays. Use vTaskDelay macro. Also you should check where actually your code doesn't run, if the problem is in the freertos or in the ADC commands. – olltsu Mar 6 '17 at 5:56
• What kind of guide? – Bence Kaulics Mar 6 '17 at 7:54
• the code of the ADC work alone and create something like the PWM the brightness of the led change by changing the potentiometer. And for the guide: freertos.org/Documentation/… – shi Mar 6 '17 at 12:42

BaseType_t xHigherPriorityTaskWoken = pdFALSE;


At the end of the function it seems that "HAL_ADC_ConvCpltCallback" is also an ISR when I use xSemaphoreGive( xBinarySemaphore);. With it the program crashes.

It is also important to set the priority of the IRQHandler numerically higher than configMAX_SYSCALL_INTERRUPT_PRIORITY, in my case '80', by adding (5 for example). HAL_NVIC_SetPriority(ADC_IRQn, 5, 0);, priority 5 ? 15 in my case. You can check this for more information: http://www.freertos.org/RTOS-Cortex-M3-M4.html.

Anyway this code is working and takes the ADC init from https://visualgdb.com/tutorials/arm/stm32/adc/.

Code

#include "stm32f4xx.h"
#include "stm32f4_discovery.h"

#include <stdlib.h>
#include <string.h>

#include "FreeRTOS.h"
#include "timers.h"
#include "semphr.h"

SemaphoreHandle_t xBinarySemaphore=NULL;

void SystemClock_Config(void);
static void ledL( void*); // Task to change the brightness of the LED 12 of GPIOD when changing the value of potentiometer
static void vHandlerTask( void*); // Task to toggle GPIOD 13 every time a conversion is achieved and sleep for 300 ms

int main(void){

HAL_Init();
SystemClock_Config();

GPIO_InitTypeDef GPIO_InitStructure;
__GPIOD_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_12|GPIO_PIN_13;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);

vSemaphoreCreateBinary(xBinarySemaphore);

if( xBinarySemaphore != NULL ){

}

for(;;){}
}

//ISR
}

//CALLBACK CALLED WHEN CONVERTION COMPLETE

}

static void vHandlerTask( void *pvParameters ){

for( ;; ){
xSemaphoreTake( xBinarySemaphore, portMAX_DELAY );
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

}
}

static void ledL( void *pvParameters ){
for (;;)
{
int offTime = 4096 - onTime;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
for (int i = 0; i < onTime; i++)
asm("nop");

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
for (int i = 0; i < offTime; i++)
asm("nop");
}
}

void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 288;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 6;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
SystemCoreClockUpdate();

if (HAL_GetREVID() == 0x1001)
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
}

{
GPIO_InitTypeDef gpioInit;

__GPIOC_CLK_ENABLE();

gpioInit.Pin = GPIO_PIN_1;
gpioInit.Mode = GPIO_MODE_ANALOG;
gpioInit.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &gpioInit);