Перейти к содержанию
    

STM32F103, Keil RTX и USB

Здравствуйте, господа!

Недавно сделали плату с микроконтроллером 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             */
}

Код с использованием 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);
}

После перевода примера на RTX при настройке прерывания USB контроллера, программа вываливает в HardFault. Увеличение объема стека задачи или heap не помогло. Кто-нибудь решал такую проблему или проще просто использовать RL-USB?

Заранее благодарен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас случаем не это происходит?

Также это почитайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас случаем не это происходит?

Очень похоже, но проверить советы смогу только в понедельник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Получилось запустить обоими способами - оставил включение прерываний чере SVC - показалось, что более корректно, хотя не знаю. Но пока будет так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...