Недавно сделали плату с микроконтроллером STM32F103, подключив к нему USB и несколько светодиодов. Попробовал на нем запустить немного видоизмененный пример HID от Keil MCBSTM32 - убрал работу с LCD, изменил выводы подключения светодиодов и вывод, к которому подключен транзистор, подтягивающий D+ к плюсу питания. Пример нормально заработал.
Захотелось запустить его под RTX.
Код, работающий без RTX:
Код
int main (void) {
/* configure Push Buttons */
RCC->APB2ENR |= ((1 << 2)); /* enable GPIOA clock */
GPIOA->CRL &= ~0x000000F0; /* PA1 clear */
GPIOA->CRL |= 0x00000080; /* PA1 is Floating Input */
GPIOA->ODR |= 0x02; /* PA1 pull-up */
/* configure LEDs */
RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */
GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */
GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */
USB_Init(); /* USB Initialization */
USB_Connect(__TRUE); /* USB Connect */
while (1); /* Loop forever */
}
/* configure Push Buttons */
RCC->APB2ENR |= ((1 << 2)); /* enable GPIOA clock */
GPIOA->CRL &= ~0x000000F0; /* PA1 clear */
GPIOA->CRL |= 0x00000080; /* PA1 is Floating Input */
GPIOA->ODR |= 0x02; /* PA1 pull-up */
/* configure LEDs */
RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */
GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */
GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */
USB_Init(); /* USB Initialization */
USB_Connect(__TRUE); /* USB Connect */
while (1); /* Loop forever */
}
Код с использованием RTX:
Код
void init_task (void)
{
/* configure Push Buttons */
RCC->APB2ENR |= ((1UL << 2) | (1UL << 4)); /* enable GPIOA, GPIOC clock*/
GPIOA->CRL &= ~0x000000F0; /* PA.1 clear */
GPIOA->CRL |= 0x00000040; /* PA.1 is Floating Input */
/* configure LEDs */
RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */
GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */
GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */
USB_Init(); /* USB Initialization */
USB_Connect(__TRUE); /* USB Connect */
while(1);
}
/*----------------------------------------------------------------------------
MAIN function
*----------------------------------------------------------------------------*/
int main (void)
{
os_sys_init(init_task);
}
{
/* configure Push Buttons */
RCC->APB2ENR |= ((1UL << 2) | (1UL << 4)); /* enable GPIOA, GPIOC clock*/
GPIOA->CRL &= ~0x000000F0; /* PA.1 clear */
GPIOA->CRL |= 0x00000040; /* PA.1 is Floating Input */
/* configure LEDs */
RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */
GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */
GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */
USB_Init(); /* USB Initialization */
USB_Connect(__TRUE); /* USB Connect */
while(1);
}
/*----------------------------------------------------------------------------
MAIN function
*----------------------------------------------------------------------------*/
int main (void)
{
os_sys_init(init_task);
}
После перевода примера на RTX при настройке прерывания USB контроллера, программа вываливает в HardFault. Увеличение объема стека задачи или heap не помогло. Кто-нибудь решал такую проблему или проще просто использовать RL-USB?
Заранее благодарен