Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 - USB Vitrual Com Port
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
JonBAL
Камень 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 и менее - уже не определяется).
Не говоря уже о внесении изменений в конечные точки (хотел добавить дрыгалку ногой для отслеживания, но опять не определяется).

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

Совершенно не понимаю где копать.
jhm
Похоже на то что чип не успевает обслужить USB запросы из-аз задержек
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.