Как подключить stm32f4discovery к компьютеру

Обновлено: 03.07.2024

stm32f4discovery и usb hid-устройство - быстрый старт.

stm32f4discovery и usb hid-устройство - быстрый старт.


Для работы только USB, очевидно, что не нужны "usart и spi". "tim" тоже, в общем-то, не понадобится.
"hid/src/usbd_hid_core.c" - тут самое важное - определение нашего USB, заголовки. Я поменял HID_MOUSE_ReportDesc на свой. Во-первых, предложенный в примере вариант мыши избыточен, а Во-вторых, мой с комментариями . Пример мыши типа Logitec

В "hid/inc/usbd_hid_core.h" надо поменять длину заголовка, который только что поменяли на

В "hid/src/usbd_hid_core.c" находится и функция "USBD_HID_Setup", в которой можно дописать свои доп. обработчики, вроде ответа на "HID_REQ_GET_REPORT" и т.п., или изменить отправку заголовка "HID_MOUSE_ReportDesc" на какой-то другой - все тут!
В "usbd_desc.c" находятся такие важные элементы как VID, PID и PRODUCT_*_STRING. Можно менять на что-то иное. Не забудьте только, что VID и PID надо покупать или использовать предоставленные, но помним, что их все используют!
В "stm32f4xx_it.c" Я заменил функцию вычисления сдвига курсора на пример из v-usb:

void SysTick_Handler(void)
uint8_t *buf;

if (TimingDelay != 0x00)
TimingDelay--;
>


Обработка "TimingDelay" тоже не нужна, но используется в другом месте - это далее.
Теперь начнем заполнять функцию "main()"

/* SysTick end of count event each 1ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);


Мы должны сперва проинициализировать тактирование нашего процессора, так чтобы заработал USB, тут есть масса тонкостей. Поскольку USB должен работать на 48MHz, что зависит и от др. настроек, поэтому не удивляйтесь, если при подключении к компу вы увидите "Устройство не опознано!" - у Вас, скорее всего, неверное тактирование. Чтобы наверняка вливаем из примера к себе файл "system_stm32f4xx.c" и будет нам счастье.
SysTick инициализируем на срабатывание прерывания 1 раз в одну милисекунду. Это самый удобный вариант для всех модулей, которые Вы возможно будете еще где использовать.
Например, реализация задержки:

void Delay(__IO uint32_t nTime)
TimingDelay = nTime;


1-й косяк примера. В примере SysTick настраивается на 10мсек., а в "Delay" это никак не упоминается и не корректируется, а ведь мы привыкли, что "nTime" для данной функции в милисекундах.
Добавим также функцию (ну и некоторые определения):

//uint16_t PrescalerValue = 0;

void Delay(__IO uint32_t nTime);

volatile __IO uint32_t TimingDelay;
volatile __IO uint32_t UserTimingDelay=0;

/* Private function prototypes -----------------------------------------------*/
static uint32_t USBConfig(void);
/* . */
static uint32_t USBConfig(void)
USBD_Init(&USB_OTG_dev,
USB_OTG_FS_CORE_ID,
&USR_desc,
&USBD_HID_cb,
&USR_cb);


Теперь в "main()" можно добавить "USBConfig();" и у нас ничего не компилируется. А просто в настройках компилятора надо еще проинициализировать константу "USE_USB_OTG_FS", например так "-DUSE_USB_OTG_FS;". Или другую "USE_USB_OTG_HS" - это просто выбор типа USB: Full speed или High Speed.
Теперь все должно компилироваться. Если нет, то скорее всего Вы не почистили все лишнее от использования "LIS302DL". Поэтому я предлагаю к использванию целиком мой пример для Coocox, в котором как и ранее используется USART и подключена SD карта по SPI2 (см. более ранние посты), зато из файлов для USB вырезано все к нему не относящееся.
2-й косяк примера. Я долго не мог понять почему SysTick не срабатывает как я хочу раз в 1мс. Оказалось, что есть еще файлик "usbd_usr.c", в котором при инициализации USB дергается функция "USBD_USR_Init". Вообще файлик видимо сделан для дополнительных пользовательских обработчиков, но что-то смысла использования именно его не вижу, чаще нужно что-то еще, собственно он есть. В общем, там вызывается:

void USBD_USR_Init(void)
<
/* Setup SysTick Timer for 40 msec interrupts
This interrupt is used to probe the joystick */
if (SysTick_Config(SystemCoreClock / 24))
<
// Capture error
while (1);
>
>


Ой, а это же перенастройка таймера на 41,(6) милисекунд. Какие там обещанные "40 msec"? Считать видимо не умеют, частота-то нашего МК 168MHz. Но блин, ЗАЧЕМ тогда инициализировали ранее на "10 msec"? Кто в лес, кто по дрова! Комментируем все это или удаляем!
В примере также есть файлик "selftest.c", который я не копировал. Ну не нужен он. Но там есть интересные функции. Например, "USB_Test()".

/**
* @brief Test USB Hardware.
* The main objectif of this test is to check the hardware connection of the
* Audio and USB peripheral.
* @param None
* @retval None
*/
void USB_Test(void)
GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA, GPIOC and GPIOD clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | \
RCC_AHB1Periph_GPIOD, ENABLE);

/* GPIOD Configuration: Pins 5 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Turn LED8 ON using PD5 */
GPIO_ResetBits(GPIOD, GPIO_Pin_5);

/* GPIOC Configuration: Pin 0 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 9 in input pull-up */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Turn LED7 ON using PC0 (5v) */
GPIO_ResetBits(GPIOC, GPIO_Pin_0);

/* Waiting delay 10ms */
Delay(1);

if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET)
Fail_Handler();
>

/* GPIOA Configuration: Pins 10 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Waiting delay 10ms */
Delay(1);

/* Check the ID level without cable connected */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_RESET)
Fail_Handler();
>

/* Turn LED7 OFF using PC0 */
GPIO_SetBits(GPIOC, GPIO_Pin_0);

/* GPIOA Configuration: Pins 11, 12 in input pull-up */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 9 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_9);

/* Waiting delay 10ms */
Delay(1);

/* Check PA11 and PA12 level without cable connected */
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET) || \
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET))
Fail_Handler();
>

/* GPIOA Configuration: Pins 12 in input pull-up */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 11 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_11);

/* Waiting delay 10ms */
Delay(1);

/* Check PA12 level without cable connected */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET)
Fail_Handler();
>

/* GPIOA Configuration: Pins 11 in input pull-up */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 12 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_12);

/* Waiting delay 10ms */
Delay(1);

/* Check PA12 level without cable connected */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET)
Fail_Handler();
>

/* GPIOA Configuration: Pins 9 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Turn LED7 ON using PA9 */
GPIO_SetBits(GPIOA, GPIO_Pin_9);

/* Turn Green LED ON: signaling Audio USB Test part1 PASS */
STM_EVAL_LEDOn(LED4);

/* Waiting User Button is pressed */
while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET)
<>

/* Waiting User Button is Released */
while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_RESET)
<>

/* Turn Green LED OFF: signaling the end of Audio USB Test part1 and switching to
the part2 */
STM_EVAL_LEDOff(LED4);

/* Turn LED7 OFF using PA9 */
GPIO_ResetBits(GPIOA, GPIO_Pin_9);

/* Turn LED8 OFF using PD5 */
GPIO_SetBits(GPIOD, GPIO_Pin_5);

/*********************************** USB Test *******************************/
/* Check the ID level with cable connected */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) != Bit_RESET)
Fail_Handler();
>

/* GPIOA Configuration: Pins 11, 12 in input pull-down */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 9 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_9);

/* Waiting delay 10ms */
Delay(1);

/* Check PA11 and PA12 level with cable connected */
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET) || \
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET))
Fail_Handler();
>

/* GPIOA Configuration: Pins 9, 12 in input pull-down */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 11 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_11);

/* Waiting delay 10ms */
Delay(1);

/* Check PA9 and PA12 level with cable connected */
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET)|| \
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET))
Fail_Handler();
>

/* GPIOA Configuration: Pins 9, 11 in input pull-down */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 12 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_12);

/* Waiting delay 10ms */
Delay(1);

/* Check PA9 and PA12 level with cable connected */
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET)|| \
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET))
Fail_Handler();
>

/* GPIOA Configuration: Pins 11, 12 in input pull-down */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOA Configuration: Pin 9 in output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Turn LED7 OFF using PA9 */
GPIO_ResetBits(GPIOA, GPIO_Pin_9);
>

void Fail_Handler(void)
/* Erase last sector */
FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);
/* Write FAIL code at last word in the flash memory */
FLASH_ProgramWord(TESTRESULT_ADDRESS, ALLTEST_FAIL);

while(1)
/* Toggle Red LED */
STM_EVAL_LEDToggle(LED5);
Delay(5);
>
>

Объясню, что она делает. Прежде чем инициализировать USB данная функция проверяет, что USB разъем не подключен, используя свойства схемы подключения USB на Discovery. Затем, ждет пока пользователь нажмет кнопку, но нажать он ее должен только после подключения шнурка USB. Как подключили шнурок от девайса к компу, нажмем кнопку и теперь эта функция начнет проверять подключили вы устройство к хосту. В случае, если что-то подключено или не подключено не вовремя, программа впадет в ступор на функции "Fail_Handler()".
Повторю, что данная функция ВООБЩЕ НЕ НУЖНА, но можно использовать как пример проверок подключения . Если Вы просто проинициализируете устройство USB, то не важно подключено оно или нет к хосту. Он просто начнет работать, а если подключите его к компу, то оно определится и будет работать, а вся эта доп. логика только сбивает пользователя. Ну какой дружественный интерфейс, когда надо знать за ранее процедуру включения проводка USB? Мы же привыкли, когда надо - включить, а когда не надо - выключить, а тут еще и в нужный момент кнопку надо нажать, а если что-то забыли, то все - намертво зависший контроллер.

Это пример чисто usb hid-устройства, а именно мышки. Легко теперь переделать на что-то другое, т.к. лишнего нет, но мы уже знаем, что и где надо искать в примерах, если что-то не получается
STM32, очень неплохо справляется со своими задачами

UPD: В проект включена библиотека от ChaN`а для поддержки файловой системы FAT. Подразумевается, что если подключить по SPI2 флешку, то ее можно будет прочитать или на нее что-то записать, а вся отладочная информация пойдет на настроенный UART. К самому примеру с мышкой не имеет никакого отношения. Получить доступ, эта библиотека, к файловой системе компа по интерфейсу USB мыши также никак не сможет Все что ее касается, а также все что касается UART, можно смело удалять и на работу мыши это никак не скажется!

stm32f4discovery и usb hid устройство быстрый старт

Помогите пожалуйста с внешним прерыванием Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то И в основной цикл не возвращается. Может кто знает в чем дело?

RCC->APB2ENR = RCC_APB2ENR_IOPCEN;
RCC->APB2ENR = RCC_APB2ENR_IOPAEN;

GPIOC->CRH = GPIO_CRH_MODE9;
GPIOC->CRH &= GPIO_CRH_CNF9;

GPIOA->CRL = GPIO_CRL_MODE0;
GPIOA->CRL &= GPIO_CRL_CNF0_0;

RCC->APB2ENR = RCC_APB2ENR_AFIOEN;
AFIO->EXTICR0 = AFIO_EXTICR1_EXTI0_PA;

EXTI->IMR = EXTI_IMR_MR0;
EXTI->EMR = EXTI_EMR_MR0;

GPIOC->BSRR = GPIO_BSRR_BS8;
for volatile int x=0; x<100000; x
GPIOC->BRR = GPIO_BRR_BR8;
for volatile int x=0; x<100000; x

подключение LCD (HD47780) к плате STM32F4- Discovery
Здравствуйте всем ! Подключил дисплей к плате написал простой код для проверки в mykroC использую.

Подключение STM32F4-Discovery к Simulink и Embedded Coder
Год назад записали видео про STM32, возможно вам будет интересно: &lt;ul&gt;&lt;li&gt;Короткий обзор самой.

кварцевые резонаторы для stm32(глупые вопросы)
Всем здравствовать желаю. И прошу простить холопа если подобные вопросы уже поднимались, но.

Глупые вопросы
Поскольку с меня электрик плохой как и электронщик хочу задать вопросы,вот допустим нужен Бп.

Не могу подключить STM32F4-Dyscovery к компьютеру. Диспетчер ругается на отсутствие драйвера. А Вы с какого конца F4-Dyscovery подключаете - mini-USB или micro-USB? Не могу подключить STM32F4-Dyscovery к компьютеру. Диспетчер ругается на отсутствие драйвера.

А Вы с какого конца F4-Dyscovery подключаете - mini-USB или micro-USB?

mini-USB, к программатору. Грешу на дрова, повидимому win8 они не нравятся, хотя и ставятся.

mini-USB, к программатору. Грешу на дрова, повидимому win8 они не нравятся, хотя и ставятся. mini-USB, к программатору. Грешу на дрова, повидимому win8 они не нравятся, хотя и ставятся.

не прокатило. Не Utility, не скачанные под ST-Link дрова на семерку.
Это косяк вылезает из-за програматора? То есть, можно перекинуть программатор с STM32VL на STM32F4?

не прокатило. Не Utility, не скачанные под ST-Link дрова на семерку.
Это косяк вылезает из-за програматора? То есть, можно перекинуть программатор с STM32VL на STM32F4? не прокатило. Не Utility, не скачанные под ST-Link дрова на семерку.
Это косяк вылезает из-за програматора? То есть, можно перекинуть программатор с STM32VL на STM32F4?

Должны быть, но вот моем случае какая бесовщина твориться.
Собственно, возможно я где-нибудь при подключении не прав. Как понял, плата готова к работе сразу из коробки? То есть втыкаем шнурок и радуемся жизни, без игр с джамперами?

плата готова к работе сразу из коробки? То есть втыкаем шнурок и радуемся жизни, без игр с джамперами?

Да, из коробки все джамперы и sotder bridges установлены так, чтобы сразу работать. Но для подключения платы к компьютеру через интерфейс отладчика, естественно, требуется установить или указать драйвер.

Попробуйте эксперимент. Когда STM32VL подключаете - какой драйвер винда находит? Запомните его, потом подключите плату STM32F4 вместо VL и попробуйте указать винде на тот драйвер от VL. Возможно, понадобится ещё VID/PID взять из *.inf-фала от драйвера F4.

плата готова к работе сразу из коробки? То есть втыкаем шнурок и радуемся жизни, без игр с джамперами?

Да, из коробки все джамперы и sotder bridges установлены так, чтобы сразу работать. Но для подключения платы к компьютеру через интерфейс отладчика, естественно, требуется установить или указать драйвер.

Попробуйте эксперимент. Когда STM32VL подключаете - какой драйвер винда находит? Запомните его, потом подключите плату STM32F4 вместо VL и попробуйте указать винде на тот драйвер от VL. Возможно, понадобится ещё VID/PID взять из *.inf-фала от драйвера F4.

Проблема выявлена, 8 не хочет ставить драйвер с inf файлом без цифровой подписи. В общем, проблема ушла в область войны с юзер-защищенностью восьмерки.

Согласен восьмерка очень хороша :) Работаю на ней с момента выхода. И дома и на работе проблем нет ни с одним устройством. (дома 64 бита, на работе 32).

Уже не первый раз встречаю вопросы, про работоспособность второй версии ST-Link/V2 под Wymdows 7 (8), вот мой вариант решения:

Согласен восьмерка очень хороша :) Работаю на ней с момента выхода. И дома и на работе проблем нет ни с одним устройством. (дома 64 бита, на работе 32).

Уже не первый раз встречаю вопросы, про работоспособность второй версии ST-Link/V2 под Wymdows 7 (8), вот мой вариант решения:

спасибо. Доберусь до дома, попробую. Похожий вариант пробовал, но не смог забраться в загрузчик без проверки подписи у драйвера:-)

У меня на win7 не хочет работать.
Перерыл весь интернет, что только не делал не хочет ST-Link на плате STM32F4Dysovery работать.
Вместе с тем плата на STM8SDyscovery работает.

Установил запускаю "STM32 ST-LINK Utility.ixi" делаю Target>Connect мне в ответ Cannot connect to ST-Link.
Где то нашел решение.
Нужно взять более старый STLinkUSBDryver.dll и заменить на него тот что установлен.
Сделал запускаю "STM32 ST-LINK Utility.ixi" делаю Target>Connect он начинает, что-то долго жевать и потом в конце выдает ту же ошибку.
Причем весь прикол в том, что в этот момент начинает мигать светодиод на приводе CD-DVD.
То что ST-Link не любит виртуальные дисководы я знаю даже снес DAEMON (правда безрезультатно).
Идем дальше пробую поменять букву в CD-DVD, ничего подобно при любой букве светодиод мигает.
Так хорошо полностью отключаю DVD светодиод естественно не мигает, но и ST-Link утилита ничего не пережевывает, а сразу вываливается с ошибкой.
Так же сразу вываливается с ошибкой если используется файл STLinkUSBDryver.dll тот что
был установлен в "ST-LINK Utility" т.е. новый.

При подключении платы STM32F4Dysovery к PC в диспетчере устройств ST-Link находится.

У меня STM32F4Dysovery установлен в материнскую плату на которой разведен полноценный JTAG. Подключаюсь J-Link v8 через интерфейс JTAG все работает c IAR загружаюсь и хожу по шагам.
Если подключится через SWD тоже ничего не работает.
Но тут есть отличие в поведении, смотрел осциллографом сигналы SWCLK и SWD, при попытке доступа через SWD J-Link обмен идет.
При соединении через ST-Link что на плате обмена нет, похоже "STM32 ST-LINK Utility.ixi" не находит драйвер St-Link.

Уже не знаю куда копать винду что ли переставить.
Чем бы посмотреть куда лезет "STM32 ST-LINK Utility.ixi" и что ей не нравится?

У меня на win7 не хочет работать.
Перерыл весь интернет, что только не делал не хочет ST-Link на плате STM32F4Dysovery работать.
Вместе с тем плата на STM8SDyscovery работает.

Установил запускаю "STM32 ST-LINK Utility.ixi" делаю Target>Connect мне в ответ Cannot connect to ST-Link.
Где то нашел решение.
Нужно взять более старый STLinkUSBDryver.dll и заменить на него тот что установлен.
Сделал запускаю "STM32 ST-LINK Utility.ixi" делаю Target>Connect он начинает, что долго жевать и потом в конце выдает ту же ошибку.
Причем весь прикол в том, что в этот момент начинает мигать светодиод на приводе CD-DVD.
То что ST-Link не любит виртуальные дисководы я знаю даже снес DAEMON (правда безрезультатно).
Идем дальше пробую поменять букву в CD-DVD, ничего подобно при любой букве светодиод мигает.
Так хорошо полностью отключаю DVD светодиод естественно не мигает, но и ST-Link утилита ничего не пережевывает, а сразу вываливается с ошибкой.
Так же сразу вываливается с ошибкой если используется файл STLinkUSBDryver.dll тот что
был установлен в "ST-LINK Utility" т.е. новый.

При подключении платы STM32F4Dysovery к PC в диспетчере устройств ST-Link находится.

У меня STM32F4Dysovery установлен в материнскую плату на которой разведен полноценный JTAG. Подключаюсь J-Link v8 через интерфейс JTAG все работает c IAR загружаюсь и хожу по шагам.
Если подключится через SWD тоже ничего не работает.
Но тут есть отличие в поведении, смотрел осциллографом сигналы SWCLK и SWD, при попытке доступа через SWD J-Link обмен идет.
При соединении через ST-Link что на плате обмена нет, похоже "STM32 ST-LINK Utility.ixi" не находит драйвер St-Link.

Уже не знаю куда копать винду что ли переставить.
Чем бы посмотреть куда лезет "STM32 ST-LINK Utility.ixi" и что ей не нравится?

откатить все назад, поставить начисто утилити и посмотреть, что выдает диспетчер устройств при подключении. У меня определяет драйвер и долго долго его ставит(проверял в пятницу на ноуте с win7)
если будет ругаться на отсутствие цифровой подписи, поискать как отключается эта проверка в win7. постом выше есть для win8 инструкция, но я пока не проверял, времени пока не было, возможно там же лежит и для win7 инструкция

Рано или поздно у каждого разработчика появляется необходимость подключить свое устройство к компьютеру. Для этого можно использовать LPT, COM или USB порты. Если первый морально устарел и зачастую отсутствует на материнских платах, а последний слишком сложен для начинающего, то COM порт является наиболее подходящим. Он все еще есть на материнских платах, и он относительно прост в использовании. Как и раньше, я не буду очень сильно углубляться в теоретические дебри, которых уйма на просторах интернета, а постараюсь максимально доступно объяснить основы работы на практике.

Постановка задачи:
1) Подключить STM32F4Discovery к компьютеру через COM порт;
2) Реализовать режим echo;
3) Набираемые символы должны сохраняться в текстовую переменную, по нажатию Enter в консоль должна вернуться полная строка;
4) При отправки строки “led” должны загореться 4 светодиода на плате.
Подключение к компьютеру является наиболее сложной частью задачи. У UART есть 2 основных вывода: Rx (Received Data) и Tx (Transmitted Data). Главная проблема – согласование уровней напряжения, так как в порте компьютера оно составляет 12В, а в порте микроконтроллера - 3,3В. Для решения этой проблемы используется микросхема MAX3232. Схема переходника показана на рисунке.

Диод VD1 – индикатор питания, светодиод в корпусе 0805, VD2 – защита от переполюсовки, можно взять любой маломощный. Микросхема – MAX3232 в корпусе SO16.

К статье прилагается проект платы в Sprint Layout.

Плата выполнена на одностороннем стеклотекстолите толщиной 2мм. Ответная часть для COM порта берется для монтажа на провод и одевается на текстолит, получается компактно и аккуратно.
Заранее отмечу, что я не изготавливал этот переходник для урока, так как у меня уже есть платка с аналогичной микросхемой, но такие переходники мною делались ранее.
У переходника 4 вывода:
1) Vcc – подключается к 3В питанию на отладочной плате;
2) Rx – подключается к Rx UART2 (PA3) микроконтроллера;
3) Tx – подключается к Tx UART2 (PA2);
4) GND – подключается к «земле» на плате.
Для связи с компьютером используется программа-терминал Putty.

Настройка:
Во вкладке Session выбираем Serial.
В строке Serial line пишем номер порта, к которому вы подключили плату.
В строке Speed пишем 9600 – это скорость работы.
Переходим во вкладку Serial.

Data bits ставим 8.
Stop bits – 1.
Parity и Flow control надо выставить None.
Нажимаем Open и получаем консоль.

Если подключить переходник к COM порту, выводы Vcc и GND подключить к плате, а Tx и Rx соединить, тогда то, что вы будете писать в консоли, будет возвращаться в нее же. Если при нажатии клавиш ничего не происходит и консоль остается чистой – ищите и исправляйте ошибку.

Итак, с подключением вроде справились. Теперь начинаем писать программу.
Первым делом нужно инициализировать UART, для этого создается функция:

Готово, теперь для инициализации достаточно написать usart_init() в main.
В этой функции UART настраивается по дефолтным значениям. Для более тонкой настройки вместо:

Теперь надо научится отправлять в COM порт байты, а потом и строки.

Принцип работы прост: send_to_uart отправляет в COM порт байт, а send_str пересылает строку по байту в send_to_uart.


И самое главное – функция обработки прерываний UART:

Вот и все, теперь запускаем консоль, прошиваем плату, подключаем и набираем строку, а затем жмем Enter и наслаждаемся результатом. Команды led0, led1, led2, led3 управляют светодиодами на плате. Как это все работает видно на видео. Исходники и плата прикреплены к статье.

Хочется отметить, что все наработки по данным урокам будут реализованы в плате расширения для STM32F4discovery о разработке которой можно почитать в этой теме


Программирование STM32VLDiscovery через Keil.

Подключаем нашу платку к USB, и ждем пока она определится как внешний носитель. Если Windows не увидел вашу плату (как было у меня), то советую проверить в первую очередь кабель и разъем для него на плате. У меня, например, отошел контакт на Discovery и я очень долго пытался понять, почему же плата не работает 🙂

Но чаще всего подключение проходит без проблем, так что двигаемся дальше. Идем в папку с Keil’ом и находим драйвер для USB. Он лежит вот тут:

  • ARM\STLink\USBDriver (это в папке, куда установлен Keil)

Первый этап позади!

Запускаем Keil и открываем там проект, который будем заливать в железку. Открываем меню Flash-Configure Flash Tools. Во вкладке Debug выбираем Use ST-Link Debugger и ставим галочку Run to main():

Теперь открываем вкладку Utilities и тоже выбираем ST-Link Debugger.

Думаете все? А вот нет, танцы с бубном только начинаются! Нажимаем кнопку Settings и в появившемся окне нужно добавить Programming algorithm для нашего девайса:

В этом же окне открываем вкладку Debug, находим поле Port и вместо JTAG ставим SW:

С настройкой закончили, но и это еще не все. Открываем файл stm32f10x.h и находим в районе 45-55 строк такой текст:

Не забываем в настройках проекта попросить компилятор генерировать hex:

Собираем проект и нажимаем кнопку Load. В случае удачной прошивки видим строки:

Если все-таки почему-то у вас не вышло прошить плату через Keil, то есть второй способ.

Программирование STM32VLDiscovery через STM32 ST-Link Utility.

  • STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility

В принципе, это все! Запускаем утилиту, ну а дальше все прозрачно – кнопка Connect для подключения, меню Open File – для выбора файла прошивки. В общем, все понятно 🙂

Итак, мы рассмотрели два способа прошивки STM32VLDiscovery, выбирайте любой на свой вкус! 🙂

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

Хорошая статья. только не понятно, зачем подменять STLinkUSBDriver.dll вашим вариантом? интересно:вижу,что размер ее много больше родной, а что там? и еще вопрос: можно ли слить hex-файл с отладочной платы?

Просто часто не заводится ST-Link, если файл не подменить, хотя у меня на работе, например, и с новым (это тот, который меньше) нормально работало. Слить можно, если не установлен бит защиты

Ну вообще у меня один раз в жизни только ST-Link Utility не увидела девайс, в итоге оказалось, что разъем на плате для мини USB не контачит ) Если все норм с подключением, то в моем компьютере платка должна как флэш-накопитель определяться

Здравствуйте. Пожалуйста подскажите как сделать следующее в Keil. Пример для PIC PORTB=0x10010001; установка сигналов на порту B. Спасибо.

У STM32 свои регистры, отличающиеся от PIC. Надо смотреть в reference manual какой регистр и за что отвечает.

Если есть возможность вставьте кусок кода, а под свой контроллер я сам подгоню. Просто не до конца понимаю как в порты загонять данные. Спасибо.

Поздравляю всех с праздником великой победы!

Не надо истерик 😉
Несколько лет назад была распространенная проблема с неработающим ST-LINK. В итоге, какими то людьми в интернете был создан/найден/придуман файл подменяющий стандартный. Конкретно у меня только на одном ПК не завелся ST-LINK за все время использования. Все исправилось подменой файла. Если у Вас работает, то это очень хорошо)

ок, скорее всего это файл от старой версии железа.

Вопрос, можно ли с помощью st-linka от stm32f4discovery прошивать чипы с питанием 1.8 вольт? (LIS331EB) Достаточно ли поставить пару резисторов для падения напряжения в разрыв swdio и swclk ?

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

Проблема решается легко:

1.Подключить дискавери к компу.
2.Отключить usb шнур от дискавери.
3.Закоротить вывод boot0 и Vdd.
4.Подключить usb шнур к дискавери.
5.Снять перемычку с boot0 и Vdd.
6.Утилитой или из Keil дать команду Erase.

Спасибо! Действительно помогло!

Доброго дня! Есть ли возможность слить прошивку с контроллера stm32f100 VDT6B. Если да, то как это сделать? нужна помощь специалиста с щедрой оплатой!

Через ST-Link Utility можно в том случае, если прошивка не защищена от чтения тем, кто ее зашивал в контроллер.

Отладочную плату ипользуем ту же: STM32F4-DISCOVERY.

Проект создаём из проекта I2CLCD80. Назовем его USB_OTG_CDC. Запустим проект в Cube, включим USB_OTG_FS в режим Device_Only

image00

В USB_DEVICE в разделе Class For FS IP выберем пункт Communication Device Class (Virtual Port Com).

image02

Лапки портов PD4-PD7, PB8, PB9 отключим, это пережиток прошлых занятий

image01

В Clock Configuration выберем следующие делители (нажмите на картинку для увеличения изображения)

image04_0500

В Configuration ничего не трогаем, т.к. прерывания там выставились сами.

Сгенерируем и запустим проект, подключим lcd.c и настроим программатор на автоперезагрузку.

У нас скорей всего устройство установится с ошибкой (код 10)

image03

Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле usbd_cdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке:

Соберём, прошьём и увидим, что ошибка исчезла.

Начнём писать код.

Сначала попытаемся передать данные на ПК.

Для этого мы сначала откроем файл usbd_cdc_if.c и исправим там в 2х строчках 4 на 64

В файле main.c закомментируем весь пользовательский код кроме инициализации и очистки дисплея

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

Также в main.c подключим файл usbd_cdc_if.h для видимости функций приема и передачи

/* USER CODE BEGIN Includes */

Немного изменим в главной функции строковую переменную, убавив в ней размер и добавив префикс tx

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

В файле usbd_cdc_if.c добавим прототип функции передачи, скопировав объявление из реализации данной функции в том же файле

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

В main() внесём данные в строку

/* USER CODE END 2 */

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

/* USER CODE END WHILE */

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе.

Вроде передать нам что-то удалось. Теперь попробуем что-нибудь принять. Здесь чуть посложнее, т.к. для этого используется уже обработчик прерывания, коим является в файле usbd_cdc_if.c функция CDC_Receive_FS.

Добавим ещё одну строковую глобальную переменную в main()

/* USER CODE BEGIN PV */

/* USER CODE END PV */

Объявим её также и в файле usbd_cdc_if.c

/* USER CODE BEGIN PRIVATE_VARIABLES */

extern char str_rx[21];

/* USER CODE END PRIVATE_VARIABLES */

В функцию CDC_Receive_FS в этом же файле добавим некоторый код и кое-что закомментируем

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)

/* USER CODE BEGIN 6 */

Добавим переменную в main()

/* USER CODE BEGIN 1 */

Занесенные в наш буфер данные попробуем вывести на дисплей, для этого в бесконечном цикле в функции main() добавим определённый код

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

Соберём проект. Прошьём код и посмотрим результат, вводя в терминальной программе и отправляя в порт USB какие-нибудь строки.

STM32 HAL. USB. Virtual Com Port

22 комментария на “ STM Урок 33. HAL. USB. Virtual Com Port ”

Просто измените размер кучи (Minimum Heap Size) в настройка CubeMX. Вместо значения 0x200 задайте 0x400.

И комп увидит устройство без ошибок.

При инициализации структур компилятору элементарно не хватает места, заданного по умолчанию, для выделения памяти.

Пардон, очепятка вышла. Не компилятору, а функции malloc.

Спасибо, так действительно проще.

Спасибо.Я сделал так.В хидер usbd_cdc_if.h добавил две строчки
extern uint8_t UserRxBufferFS[1000];
uint8_t receiveBufLen;
В метод CDC_Receive_FS добавил перед return receiveBufLen = *Len;
И в main ловил данные просто одним условием
if(receiveBufLen > 0)// если получены данные от ПК
HAL_Delay(250);
CDC_Transmit_FS((uint8_t*) UserRxBufferFS,receiveBufLen);
// эхо для наглядности
receiveBufLen = 0;// сброс получения
>
Всё просто,а UserRxBufferFS чистить не нужно от мусора,он сам чистится.

может в usbd_cdc_if.c ?

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

Скорей всего придется делать конкатенацию передаваемых строк с помощью strcat. Была аналогичная проблема при использовании CDC. Автор применял этот метод в одном из уроков.

Здравствуйте
А если я хочу передавать данные с микроконтроллера на компьютер?

Константин:
А мы их туда и передали.

Установил различные драйвера VCP от STM, но при этом плата не определяется при подключении её к компьютеру. только виден STLink Virtual COM Port. Кто уже сталкивался с такой проблемой.

Оказалась, что проблема с дровами. Надо их полностью сносить и устанавливать заново.

You can use(for example):

where ADC_Data is your ADC value.

могу скачать драйвера для виртуального ком порта. У меня STM32F415RG, может есть у кого?

Читайте также: