У меня несколько плат Olimexino-STM32 (ссылка на описание). Поскольку они заточены под Maple (Arduino), то напрямую через USB я не перепрошиваю. Использую для прошивки ST-Link в платах STM32VLDiscovery. Простые примеры типа дергания ног и мигания светодиодами у меня работают.
А вот примеры из указанной библиотеки не работают, хоть и нормально компилируются и с сайта ST (с поправками для IAR 6.21 с исключением CMSIS из проекта, так как он уже встроен в IAR) и из папки примеров в IAR'е.
Например, пример виртуального COM порта VirtualCOMPort:
Код
int main(void)
{
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while (1)
{
if ((count_out != 0) && (bDeviceState == CONFIGURED))
{
USB_To_USART_Send_Data(&buffer_out[0], count_out);
count_out = 0;
}
}
}
{
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while (1)
{
if ((count_out != 0) && (bDeviceState == CONFIGURED))
{
USB_To_USART_Send_Data(&buffer_out[0], count_out);
count_out = 0;
}
}
}
Смотрю регистры отладчиком при старте. Регистры USB по нулям.
После Set_USBClock() в регистре USB_CNTR устанавливаются биты FRES и PDWN.
После USB_Interrupts_Config() регистры USB не изменяются (да и в исходном коде их ничто не меняет). Изменяются только в NVIC.
После USB_Init() в регистре USB_CNTR снимаются биты FRES,PDWN, устанавливаются SOFM,RESETM и CTRM. В регистре USB_ADDR устанавливается бит EF.
И все больше ничего с регистрами USB не происходит. Enumeration не производится и соответственно не комп не видит устройство. Прерывание USB_Istr вызывается только один раз, да и то видимо из USB_Init().
Подскажите, что делать.