Top.Mail.Ru

STM32 и USB. Использование интерфейса USB на примере STM32F3.

Продолжаем работать с интерфейсом USB, и сегодня пришло время практики. Как вы помните, теоретические аспекты мы уже рассмотрели (вот), так что сегодня возьмем в руки STM32 и напишем небольшой примерчик. Сразу скажу, что я решил поэкспериментировать с контроллером STM32F303 и, соответственно, с платой STM32F3Discovery.

На плате уже есть два USB разъема, один под ST-Link и второй для пользовательских задач, то есть как раз то, что нам надо.

С платой разобрались, теперь по поводу софта. STMicroelectronics любезно предоставили библиотеки для работы с USB для различных семейств микроконтроллеров, а кроме того, выпустили кучу примеров под разные отладочные платы. Но плат Discovery в этом списке нет, поэтому не станем вносить свои изменения в уже готовые проекты от ST, а лучше создадим свой новый проект, взяв из примеров и библиотек только то, что нам реально понадобится.

Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также несколько статей на смежную тему из нового курса:

Задача будет такая - по приему байта данных по USB, контроллер зажигает определенное количество светодиодов. Если пришел байт 0х01 - светится один диод, 0х02 - два, 0х03 - три, ну и так далее. Для того, чтобы реализовать отправку данных с компьютера, поставим драйвер виртуального ком-порта и будем общаться с платой через обычный терминал (я использую Advanced Serial Port Monitor).

Нужный драйвер без проблем можно скачать на официальном сайте STMicroelectronics. Устанавливается тоже без проблем и в итоге в диспетчере устройств появляется следующее:

USB устройство на STM32.

С этим разобрались, давайте теперь откроем какой-нибудь примерчик от ST и посмотрим как же вообще в их библиотеках устроен обмен данными по USB. Вот архив со всеми библиотеками и примерами - ST USB Library.

Заходим в папку с примерами и выбираем Virtual Com Port, там без труда находим нужную нам папку с проектом для Keil'а и запускаем его. Давайте сразу же посмотрим на файл main.c:

int main(void)
{
	Set_System();
	Set_USBClock();
	USB_Interrupts_Config();
	USB_Init();

	while(1)
	{
	}
}

Видим, что в теле цикла while(1) пусто, соответственно вся работа происходит в прерываниях. В функции main() всего лишь вызываются функции инициализации. Все эти функции реализованы в файле hw_config.c, его мы поправим под себя чуть позже. Для приема и передачи данных по USB в файле usb_endp.c предусмотрены соответствующие обработчики:

void EP1_IN_Callback (void)
void EP3_OUT_Callback(void)

Как вы помните из предыдущей статьи, транзакции IN нужны для передачи данных хосту (то есть ПК), а транзакции OUT для приема данных от хоста. Соответственно, для отправки данных используется конечная точка 1 (End Point 1), а для приема - End Point 3. Как программа попадает в эти обработчики? Сейчас разберемся! В файле stm32_it.c есть обработчик прерывания:

void USB_LP_CAN1_RX0_IRQHandler(void)

В его теле вызывается всего лишь одна функция - USB_Istr(), которая описана в файле usb_istr.c. Идем в этот файл и изучаем функцию... А там все в принципе просто, программа выясняет какое именно событие вызвало прерывание и в соответствии с этим происходит дальнейшая работа. Соответственно, при транзакциях IN или OUT вызываются именно те функции которые мы уже рассмотрели выше, а именно:

void EP1_IN_Callback (void)
void EP3_OUT_Callback(void)

Этот проект вообще по умолчанию адаптирован для контроллеров STM32F10x, да и файлов очень много лишних, так что давайте-ка создадим свой новый пустой проект и в нем уже будем работать. Напоминаю, что я буду работать с STM32F3Discovery, поэтому проект создаю для контроллера STM32F303VC. Забираем из папки с библиотеками и примерами все файлы, которые нам понадобятся. Вот их полный список:

Файлы библиотеки USB.

В папку SPL я просто запихал все файлы из Standard Peripheral Library для STM32F303. Не забываем в настройках проекта указать все пути к файлам и прописать подключение SPL ( в общем, все как тут - ссылка). Проект создан, файлы все на месте, давайте писать код. И начинаем с функций инициализации, расположенных в файле hw_config.c:

void Set_System(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	// Включаем тактирование нужной периферии
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);

	// Настройка пинов
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_15 |
	                              GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_Init(GPIOE, &GPIO_InitStructure);

	GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_14);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_14);

	// Внешнее прерывание, которое внутри контроллера подключено к 
	// функциям USB
	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);
}

Что за пины мы настраиваем тут? А вот:

Выводы для работы с USB в STM32.

С PA11 и PA12 разобрались, а все остальные ножки - это светодиоды, которые есть на плате.

Идем дальше... Из функций для работы с USART'ом я просто все удалил, поскольку мы приемопередатчиком пользоваться не будем. Настраиваем прерывания:

void USB_Interrupts_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_Init(&NVIC_InitStructure);
}

И еще я добавил небольшую функцию в этот же файл. Она просто гасит все светодиоды:

void GPIO_ResetLeds()
{
	GPIO_ResetBits(GPIOE, GPIO_Pin_8);
	GPIO_ResetBits(GPIOE, GPIO_Pin_9);
	GPIO_ResetBits(GPIOE, GPIO_Pin_10);
	GPIO_ResetBits(GPIOE, GPIO_Pin_11);
	GPIO_ResetBits(GPIOE, GPIO_Pin_12);
	GPIO_ResetBits(GPIOE, GPIO_Pin_13);
	GPIO_ResetBits(GPIOE, GPIO_Pin_14);
	GPIO_ResetBits(GPIOE, GPIO_Pin_15);
}

Не забываем в файл hw_config.h дописать прототип для этой функции:

void GPIO_ResetLeds(void);

С инициализацией вроде бы все. Открываем файл usb_endp.c. Мы будем только анализировать принятые от хоста данные, поэтому обработчик транзакций IN нам не понадобится:

void EP1_IN_Callback (void)
{
}

В обработчике транзакций OUT принимаем данные и в зависимости от того, какой байт принят зажигаем определенное количество светодиодов, которые у нас висят на GPIOE:

void EP3_OUT_Callback(void)
{
	uint16_t USB_Rx_Cnt;

	// Принимаем данные
	USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);

	// Анализируем принятый байт
	switch(USB_Rx_Buffer[0])
	{
		case 0x01:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x0100);
			break;

		case 0x02:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x0300);
			break;

		case 0x03:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x0700);
			break;

		case 0x04:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x0F00);
			break;

		case 0x05:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x1F00);
			break;

		case 0x06:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x3F00);
			break;

		case 0x07:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0x7F00);
			break;

		case 0x08:
			GPIO_ResetLeds();
			GPIO_Write(GPIOE, 0xFF00);
			break;
	}

	// Включаем прием данных для конечной точки 3
	SetEPRxValid(ENDP3);
}

Так... Ну вроде бы на этом все. Вот полный проект: Проект для USB

Прошиваем микроконтроллер и тестируем! Вот, что получилось:

Программа для работы с USB

Послали байт 0х04 - загорелось 4 светодиода, аналогично работает и для любого другого количества светодиодов. Так что, на сегодня, пожалуй все, но опыты с USB, на этом только начинаются!

Подписаться
Уведомить о
guest

141 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Kingrai
Kingrai
10 лет назад

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

userius
userius
10 лет назад

Огромный респект и спасибо автору. Начал практическое изучение МК с STM32, до этого была только теория. Очень интересует тема управления контроллером с компа по USB, прием-передача данных, настройка параметров периферии (например, задание частоты дискретизации АЦП). Опробовал Ваш проект из этой статьи на STM32F3Discovery. При компиляции выскочило 3 предупреждения, вот они:
..\source\hw_config.c(198): warning: #188-D: enumerated type mixed with another type
return 0;
..\source\usb_endp.c(74): warning: #550-D: variable "USB_Rx_Cnt" was set but never used
uint16_t USB_Rx_Cnt;
linking...
.\usb.axf: Warning: L6304W: Duplicate input file .\system_stm32f30x.o ignored.
Но все заработало на ура.
С нетерпением буду ждать новых (а лучше расширенного цикла) статей на эту тематику.

Илья
Илья
10 лет назад

Спасибо за описание, но проект по ссылке не полный нет файла самого проекта и он не собирается сразу.

Илья
Илья
10 лет назад

Сорри. Всё нормально. У меня архив чем-то порезало

pripoy08
pripoy08
10 лет назад

Доброе время суток! 🙂
очень хорошая статья! большое спасибо! вот начинаю пробовать работать с ЮСБ, очень интересно! вот только вопросы возникают! можно ли на 10х процессорах сделать преобразователь например в 2 кома, или сделать хид клавиатуры и мыши? или хотябы на 207?! по одному устройству примеры работоспособны. заранее спасибо!

pripoy08
pripoy08
10 лет назад

буду пробовать! 🙂

Сергей
Сергей
10 лет назад

Здравствуйте.
Спасибо за статью. Но появились проблемы при отладке. Постоянно возникает прерывание USB_LP_IRQHandler. Это нормально? При этом отладчик уходит в завис и прервать его можно только насильно. Процессор STM32F373V8, установленный в STM32F3Discovery вместо 303-го. Может в этом проблема кроется?
Пробовал и исходный проект от STM - тоже самое.

Daniil
Daniil
9 лет назад

Здравствуйте.
Подскажите пожалуйста, а как переменную типа uint32_t ( ADC_Result из вашей статьи Работа с ADC и DMA) можно передать по USB, так как в этом проэкте переменная которая передается по USB - типа uint8_t.
Заранее благодарен за ответ!

Andrew
Andrew
Ответ на комментарий  Daniil
7 лет назад

или так:

uint8_t tBuff[4];
uint32_t *tADC;

tADC = (uint32_t) tBuff;
*tADC = ADC->DATA;

Дмитрий
Дмитрий
9 лет назад

Здравствуйте.
Подскажите пожалуйста, программировал через Keil было все в норме потом вдруг стало. Error
No target connected.
Flash Download failed-Target DLL has beeh cancelled. На втором компе уже такое произошло. Дрова переустанавливал не помогло. Через STM32 ST-LINK Utility зашивает без проблем.

Дмитрий
Дмитрий
9 лет назад

Нет все настройки на месте. Сам не пойму почему так.

Дмитрий
Дмитрий
9 лет назад

Здравствуйте. А может уважаемый автор выложить проект под STM32F10x, который, как я понял, он брал за основу, а то чего-то проект собрать не получается.

Дмитрий
Дмитрий
9 лет назад

Да, и где в проекте вышеизложенная функция:
void EP3_OUT_Callback(void). Она в main.c отсутствует.

Дмитрий
Дмитрий
9 лет назад

И еще, можно по подробнее о функциях USB_SIL_Write и USB_SIL_Read, можно ли просто бит считать без всяких буферов?

Дмитрий
Дмитрий
9 лет назад

этот вопрос отпал)

Павел
Павел
Ответ на комментарий  Aveal
7 лет назад

Только пример от ST глюченый, мк без соединения с компом зависает намертво даже отладчик от него отваливается.

Avon
Avon
9 лет назад

Вроде бы, STM32 с нуля, а как его питать, шить и отлаживать статей нет. Все на готовых платах.

Avon
Avon
9 лет назад

Тогда это не STM32 с нуля, а программирование STM32 для начинающих.
С нуля, это как у буржуев, когда закрыта пропасть между МК и готовой платой, а в этой пропасти односторонняя макетка утюгом, прошивка всеми способами, моргание лампочкой, отладка и прочие радости.

Sasha
Sasha
9 лет назад

Скажите пож что делать Я запрограммировал STM32SISCOVERY проектом который вы выложили, но после этого не могу больше запрограммировать чип Программатор выдает : Internal command error Похоже , что где-то установилась защита по записи в чип. Спасибо

Bulat
Bulat
9 лет назад

Спасибо за статью. Наконец-то удалось запустить usb на stm32f3discovery. Возникла такая проблема. Если я использую библиотеки из Вашего проекта в своем проекте, то все работает нормально. Если же я беру исходные ST USB Library то проект не собирается, хотя список файлов, прикрепленных к проекту, идентичен. Нужно ли вносить какие-либо изменения в библиотеки, за исключением описанных Вами в статье? Хотел бы разобраться в этом вопросе, т к собираюсь использовать usb библиотеку для stm32f103.

Bulat
Bulat
9 лет назад

Посмотрел внимательнее - в Вашем проекте отличается заголовочный файл platform_config.h, раздел include. Но даже после его исправления проект не собрался, похоже есть еще какие-то различия.

X-Under
X-Under
9 лет назад

Установил все драйвера с официального сайта. USB ST-LINK работает исправно, а вот при подключении разъема USB USER в диспетчере устройств плата отображается как Unknown Device. Подскажите пожалуйста, в чем может быть проблема ?

masta
masta
9 лет назад

Добрый день, что означают эти строчки ?
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
Где можно почитать это?

masta
masta
9 лет назад

Могли бы Вы указать страницу даташита

masta
masta
9 лет назад

Разобрался

X-Under
X-Under
9 лет назад

Ставил, даже несколько разных скачивал

Taktik
Taktik
9 лет назад

Та же проблема - virtual com-port установил, com-порт не появился, при подключении USB USER появляется сообщение -> Unknown Device.
У меня Win 7 32 бит

Taktik
Taktik
9 лет назад

Сам понял свою ошибку - пытался подключить непрошитое устройство. После прошивки примера - все заработало и com-порт появился.

Slava
Slava
9 лет назад

Здравствуйте! Пытаюсь собрать проект в Keil, но выходят ошибки. Не подскажите в чём проблема.

src\hw_config.c(68): warning: #177-D: variable "GPIO_InitStructure" was declared but never referenced
GPIO_InitTypeDef GPIO_InitStructure;
src\hw_config.c(231): error: #20: identifier "EVAL_COM1_IRQn" is undefined
NVIC_InitStructure.NVIC_IRQChannel = EVAL_COM1_IRQn;
src\hw_config.c(257): error: #20: identifier "USB_DISCONNECT" is undefined
GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
src\hw_config.c(257): error: #20: identifier "USB_DISCONNECT_PIN" is undefined
GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
src\hw_config.c(261): error: #20: identifier "USB_DISCONNECT" is undefined
GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
src\hw_config.c(261): error: #20: identifier "USB_DISCONNECT_PIN" is undefined
GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
src\hw_config.c(291): warning: #223-D: function "STM_EVAL_COMInit" declared implicitly
STM_EVAL_COMInit(COM1, &USART_InitStructure);
src\hw_config.c(291): error: #20: identifier "COM1" is undefined
STM_EVAL_COMInit(COM1, &USART_InitStructure);
src\hw_config.c(294): error: #20: identifier "EVAL_COM1" is undefined
USART_ITConfig(EVAL_COM1, USART_IT_RXNE, ENABLE);
src\hw_config.c(376): warning: #223-D: function "STM_EVAL_COMInit" declared implicitly
STM_EVAL_COMInit(COM1, &USART_InitStructure);
src\hw_config.c(376): error: #20: identifier "COM1" is undefined
STM_EVAL_COMInit(COM1, &USART_InitStructure);
src\hw_config.c(395): error: #20: identifier "EVAL_COM1" is undefined
USART_SendData(EVAL_COM1, *(data_buffer + i));
src\hw_config.c(451): error: #20: identifier "ENDP1_TXADDR" is undefined
UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
src\hw_config.c(468): error: #20: identifier "EVAL_COM1" is undefined
USART_Rx_Buffer[USART_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1) & 0x7F;
src\hw_config.c(472): error: #20: identifier "EVAL_COM1" is undefined
USART_Rx_Buffer[USART_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1);
src\hw_config.c(495): error: #20: identifier "ID1" is undefined
Device_Serial0 = *(uint32_t*)ID1;
src\hw_config.c(496): error: #20: identifier "ID2" is undefined
Device_Serial1 = *(uint32_t*)ID2;
src\hw_config.c(497): error: #20: identifier "ID3" is undefined
Device_Serial2 = *(uint32_t*)ID3;
src\hw_config.c: 3 warnings, 15 errors
compiling stm32_it.c...
.\inc\hw_config.h(53): error: #20: identifier "FunctionalState" is undefined
void USB_Cable_Config (FunctionalState NewState);
.\inc\hw_config.h(56): error: #20: identifier "uint8_t" is undefined
void USB_To_USART_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes);
.\inc\hw_config.h(56): error: #20: identifier "uint8_t" is undefined
void USB_To_USART_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes);
src\stm32_it.c(187): error: #20: identifier "EVAL_COM1" is undefined
if (USART_GetITStatus(EVAL_COM1, USART_IT_RXNE) != RESET)
src\stm32_it.c(194): error: #20: identifier "EVAL_COM1" is undefined
if (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ORE) != RESET)
src\stm32_it.c: 0 warnings, 5 errors
compiling usb_endp.c...
src\usb_endp.c(89): error: #20: identifier "ENDP1_TXADDR" is undefined
UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
src\usb_endp.c(103): error: #247: function "NOP_Process" has already been defined
void EP3_OUT_Callback(void)
src\usb_endp.c: 0 warnings, 2 errors
compiling usb_prop.c...
src\usb_prop.c(173): error: #20: identifier "ENDP1_TXADDR" is undefined
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
src\usb_prop.c(179): error: #20: identifier "ENDP2_TXADDR" is undefined
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
src\usb_prop.c(185): error: #20: identifier "ENDP3_RXADDR" is undefined
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
src\usb_prop.c: 0 warnings, 3 errors
".\5.axf" - 25 Error(s), 3 Warning(s).

Илья
Илья
9 лет назад

Готовый ваш проект работает нормально, но если пытаюсь собрать сам, то лечу в ошибку:
system_stm32f30x.c: Error: C4065E: type of input file 'USB' unknown
И ещё, у вас в списке указаны файлы и около них стоят плюсики, а у меня их нет.
Так же в списке нет файла hw_config.h, хотя у вас написано:
"Не забываем в файл hw_config.h дописать прототип для этой функции:
void GPIO_ResetLeds(void);"
Похоже я упускаю где-то какую-то мелочь *think*.....

Artem
Artem
9 лет назад

Попробовал поработать к STM32L-Discovery. Однако нарвался на вопрос -
что делать с файлом platform_config,h? Он подключён в hw_config.h и содержит некоторые определения и инклюды, некорректные без использования тех Eval Board, для которых пример предназначен.

Cергей
Cергей
9 лет назад

Cпасибо за статью! не могли бы вы рассказать как сделать настройку на передачу данных в комп. никак не могу разобраться с USB_SIL_Write();

Cергей
Cергей
9 лет назад

Спасибо!

Андрей
Андрей
9 лет назад

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

Serge
Serge
9 лет назад

В статье, походу, используется более старая версия библиотек. Та же проблема. Или придется разбираться в новых, или юзай то, что автор положил.

Александр
Александр
8 лет назад

Здравствуйте! Приобрел программатор NAND на STM32F4. При коннекте определяется как linuxg_printer. Драйвер не могу найти и прогер работает без драйверов. Но запарило каждый раз это видеть. Что это за устройство? Может ему все-таки дрова дать? Найти их не могу, вот сведения об устройстве USBPRINT\LINUXG_PRINTER\7&2181D5ED&0&USB001

Валерий
Валерий
8 лет назад

Добрый день! Подскажите пожалуйста! Хочу Ваш пример адаптировать под свою плату. Она на STM32F107RCTx. Подскажите что нужно убрать и поправить в готовом проекте, не считая того что все ЧТО ДЛЯ STM32F4 заменить на STM32F1 ну там библиотеки и прочее. USB разъем совпадает полностью по схеме, а диоды у меня на РА4-7. Схему могу привести, если нужно. Главное что убирать, чтобы лишнего не было. А то я сделал сходу (то что изложил) и осталась одна ошибка: ..\Virtual_COM_Port\src\system_stm32f10x.c(261): error: #20: identifier "FLASH_BASE" is undefined

Валерий
Валерий
8 лет назад

Спасибо! Попробую!

Валерий
Валерий
8 лет назад

Сделал все свое! Не пойму что править или откуда брать - platform_config.h На него ссылается и ошибки выдает, там моей платформы нет, мне что там все закоментировать?

Валерий
Валерий
8 лет назад

Спасибо!

Валерий
Валерий
8 лет назад

Вылезла вот такая ошибка:
source\hw_config.c(70): error: #20: identifier "RCC_APB2Periph_SYSCFG" is undefined
Что не сделал или убрал лишнее?

Валерий
Валерий
8 лет назад

Я это прописал согласно настройкам в примере, где не описаны? Чего не хватает?

Валерий
Валерий
8 лет назад

Спасибо за подсказку! Рою далее.

Василий Hound
Василий Hound
8 лет назад

А как быть если нужно отправить 2 посылки хосту через УЗБ?
Например:
CDC_Send_DATA ("One", 3);
CDC_Send_DATA ("Two", 3);

То в терминалку приходит только последняя отправленная строка. Если выждать хотя бы 1мс, то обе посылки проходят нормально.

Василий Hound
Василий Hound
8 лет назад

Так, а как можно обойти это ожидание без "костылей"? Часто есть потребностью в подобной отправке данных, использовать ф-цию задержки выглядит как "костыль" при чем не очень хороший, вот с ЮАРТом все проще - отправили символ - ждем в цикле флаг. С УЗБ можно что-то подобное сделать?

Василий Hound
Василий Hound
8 лет назад

Это не всегда удобно. Так нет никакого флага на проверку того, что можно следующую порцию данных отправлять?

Василий Hound
Василий Hound
8 лет назад

А коллбеке - EP1_IN_Callback если выставлять флаг? По идее же эта ф-ция выполняется, когда данные были отправлены или я не прав?

Василий
Василий
8 лет назад

Да, так получилось.
Выставлю флаг в коллбеке EP1_IN_Callback, а в ф-ции отправки данных жду пока этот флаг выставиться.

AlStorm Prime
8 лет назад

Подскажите пожалуйста,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
Устанавливает "1" в RCC_APB2ENR, AFIOEN[0] бит.
AFIOEN: Alternate function IO clock enable
За что этот бит отвечает? Какие "Alternate function" он enable-ит?
Заранее - спасибо!

AlStorm Prime
Ответ на комментарий  AlStorm Prime
8 лет назад

Извиняюсь, моя вина.
Не в тот мануал заглянул.

AlStorm Prime
8 лет назад

Подскажите пожалуйста последовательность - какие прерывания генерирует USB, где находится обработчик этих прерываний и как вообще программа попадает в функции EP3_IN/OUT_Callback?

Артур
Артур
8 лет назад

Спасибо за статью, все работает. Возник небольшой вопрос, после прошивки и запуска отладчика, bDeviceState у меня равен 0 (UNCONNECTED) хотя плата сразу подключена к компу через usb и нормально отображается в устройствах. И для того чтобы bDeviceState сменился на рабочий CONFIGURED необходимо переткнуть usb. Подскажите, что необходимо вызывать для конфигурирования usb при инициализации в рабочий режим.

LEV
LEV
7 лет назад

Advanced Serial Port Monitor установилась вроде бы нормально но виртуальный COM порт в диспетчере устройств не отобразился. Пробовал на 3 компьютерах с разными версиями Windows и разрядностью системы. Одно и тоже... установку произвожу согласно файла readme.

И еще не совсем ясно могу возможно ли используя Advanced Serial Port Monitor осуществить обмен между ПК и МК как Вашей статье :

https://microtechnics.ru/qt-usb-custom-hid-biblioteka-libusb/

и

https://microtechnics.ru/stm32cube-usb-custom-hid-priem-i-peredacha-dannyx/

Вместо программы написанной на Qt.

141
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x