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

STM32F103 - USB Vitrual Com Port

Камень STM32F103C8, среда Keil 4.74.

 

На основе ST'шной библиотеки USB-FS и примеров слепил рабочий проект виртуального Com-порта. Работает, но осталось так много неизвестного, что даже не знаю с чего начать.

Основная проблема в том, что при определённых изменениях (даже самых безобидных) в файлах библиотеки, перестаёт определяться USB-устройство (сбой запроса дескриптора устройства). Вот простейший пример.

 

Код из файла hw_config.c, функции инициализации Set_System и функция Delay_ms (которая нигде никогда не вызывается).

/*******************************************************************************
* Function Name  : Set_System
* Description    : Configures Main system clocks & power
* Input          : None.
* Return         : None.
*******************************************************************************/
void Set_System(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to

       system_stm32f10x.c file
     */

//  GPIO_InitTypeDef GPIO_InitStructure;
    //EXTI_InitTypeDef EXTI_InitStructure;
    
//    for(b = 0; b < 1425; b++);            //b < 257   b < 1426
    
    /* Enable USB_DISCONNECT GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

  /* Configure USB pull-up pin */
//  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
    
    GPIOB->CRH &= !(GPIO_CRH_CNF15_0 | GPIO_CRH_CNF15_1);
    GPIOB->CRH = GPIO_CRH_MODE15_1;
    GPIOB->BSRR = GPIO_BSRR_BS15;
    
    
    
//  /* Configure the EXTI line 18 connected internally to the USB IP */
//  EXTI_ClearITPendingBit(EXTI_Line18);
//  EXTI_InitStructure.EXTI_Line = EXTI_Line18;
//  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
//  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//  EXTI_Init(&EXTI_InitStructure);

    EXTI->IMR = 0x00040000;
    EXTI->EMR = 0x00000000;
    EXTI->RTSR = 0x00040000;
    EXTI->FTSR = 0x00000000;
}


//void Delay_ms(uint32_t ms)
//{
//    // В stm32f10x_conf.h установлена частота кварца для расчёта
//    volatile uint32_t nCount;
//    RCC_ClocksTypeDef RCC_Clocks;
//    RCC_GetClocksFreq (&RCC_Clocks);

//    nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
//    for (; nCount!=0; nCount--);
//}

 

Сейчас в неё напихан всякий хлам, это всё остатки былых экспериментов.

Так вот, если я вношу изменения, а именно:

раскомментирую функцию Delay_ms (по прежнему нигде не вызывается),

или поменяю инициализацию линии подтяжки (прямую запись в регистры убрать, структуру включить),

или включу пустой цикл for (причем b < 257 и более - устройство определяется, а b < 256 и менее - уже не определяется).

Не говоря уже о внесении изменений в конечные точки (хотел добавить дрыгалку ногой для отслеживания, но опять не определяется).

 

Ещё проблема частично описана здесь.

 

Совершенно не понимаю где копать.

 

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


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

Похоже на то что чип не успевает обслужить USB запросы из-аз задержек

Изменено пользователем jhm

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


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

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

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

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

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

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

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

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

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

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