На STM32F103 я использую семафоры:
Прерывание:
Код
void EP2_OUT_Callback(void)
{
SetEPRxStatus(ENDP2, EP_RX_VALID);
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(xSemaphoreUSB_EP2_OUT, &xHigherPriorityTaskWoken );
}
Задача:
Код
void prvUSB( void *pvParameters )
{
uint8_t answer[64];
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//Set PA11,12 as USB_DM,DP
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; // set DAC1 pin as analog output
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
xSemaphoreUSB_EP2_OUT = xSemaphoreCreateBinary();
USB_Disconnect_Config();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while(1)
{
if(xSemaphoreUSB_EP2_OUT != NULL)
{
if( xSemaphoreTake( xSemaphoreUSB_EP2_OUT, portMAX_DELAY ) == pdTRUE )
{
// в answer получаем данные с хоста
USB_SIL_Read(EP2_OUT, answer);
// отправляем данные на хост
USB_SIL_Write(EP1_IN, answer, 64);
SetEPTxValid(ENDP1);
}
}
}
}