RS232 (UART) на STM32F4-Discovery (STM32F429ZIT6) с библиотекой HAL?

Фон

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

Мой единственный опыт работы со встроенной системой - это Raspberry Pi, который сильно отличается от STM32F4 Discovery.

Я мог бы реализовать программирование чтения / записи UART, используя стандартную библиотеку Linux C на Raspberry Pi, которая подключена к ПК с помощью адаптера USB-RS232 с преобразователем напряжения IC.

Мое устройство и среда разработки

  • Плата STM32F429I-DISCO с MCU STM32F429ZIT6
  • Кабель USB-RS232 и микросхема преобразователя напряжения, которая неплохо работает на Raspberry Pi.
  • Keil uVision 5 IDE.

Чего я хотел бы достичь

Я хотел бы реализовать программу на плате обнаружения STM32F429, которая могла бы отправлять / получать сообщения на / с ПК. (Например, отправьте строку на ПК. И когда получите строку от ПК, загорится светодиод на плате)

Что я сделал прямо сейчас

Теперь я настроил свою Keil uVision IDE и мог скомпилировать / запустить пример мигающего светодиода, я также мог бы отредактировать этот пример, чтобы управлять светодиодом так, как я хочу. (Например, включить светодиод при нажатии кнопки пользователя и выключить его при отпускании кнопки)

Итак, светодиодная часть в значительной степени готова, недостающая часть - это то, как взаимодействовать с платой обнаружения STM32F4 с помощью кабеля RS232.

Мой вопрос

  1. Во-первых, я хотел бы знать, правильно ли я понимаю определение PIN-кода этой платы. Согласно этому таблице данных, я должен соединить вывод TX на DB9 с PD2 (UART5_RX), вывод RX на DB9 с PC12 (UART5_TX), вывод VCC на DB9 на 3,3 В и GND на DB9 на GND. Это соединение правильное?

  2. Есть ли какой-нибудь пример кода того, как использовать UART в новой библиотеке HAL из последней версии Keil uVision? Я искал в Интернете, но большинство примеров кода или tutorial используется функция с именем RCC_AHB1PeriphClockCmd, которая, похоже, не существует в новой библиотеке HAL от Keil uVision.

Обновить

  1. У меня адаптер USB-Serial 067b:2303 Prolific Technology, Inc. PL2303 Serial Port и к нему прилагается микросхема переключения уровня. Выглядит так:  введите описание изображения здесь

  2. При подключении к Raspberry Pi я следил за этим инструкция, поэтому VCC / GND на IC подключен к 3.3V / GND на Raspberry Pi, я не уверен, нужно это или нет.

  3. Под библиотекой "HAL" я подразумеваю этот stm32f4xx_hal_usart.c файл, согласно заявлению о лицензии в комментариях, похоже, он принадлежит STMicroelectronics. Хотя в этом файле есть некоторые инструкции, мне все еще довольно сложно понять, как использовать этот драйвер. Например, я не могу отличить Enable USARTx interface clock от Enable the clock for USART GPIOs, и я не знаю, как мне достичь этой функции. Так что, если есть пример кода, это будет большим подспорьем, поскольку я мог бы сравнить его с этими инструкциями.

введите здесь описание изображения  введите описание изображения здесь


person Brian Hsu    schedule 22.01.2016    source источник
comment
вы можете просто пойти по «голому железу», зачастую так же быстро и легко, как попытаться заставить работать некоторую библиотеку github.com/dwelch67 / stm32_samples У меня нет такой платы, но периферийные устройства stm32 больше похожи, чем различаются между чипами.   -  person old_timer    schedule 22.01.2016
comment
почему задействовано 5В? это вообще не нужно, ни для Raspberry Pi. Какой у вас USB-кабель? Уровни напряжения RS232 разрушат любой из этих чипов, вы никогда не сможете использовать RS232. или вы неправильно используете термин RS232, подразумевая последовательный протокол вместо стандарта напряжения. Я использую разветвители и кабели на основе usb ftdi, которые обеспечивают интерфейс uart 3.3 В, действительно нужно подключать только rx и tx, действительно хочу использовать один и тот же компьютер для обоих, чтобы избежать плавающих заземлений, и вам действительно не нужно подключать заземление. если что-то rx, tx и земля, если вы чувствуете необходимость.   -  person old_timer    schedule 22.01.2016
comment
если вы хотите использовать их библиотеки, обратитесь в службу технической поддержки st и / или пролистайте код и выясните это.   -  person old_timer    schedule 22.01.2016
comment
да UART5_TX использует PC12, альтернативную функцию 8, а UART5_RX использует альтернативную функцию PD2 8. есть другие uarts. Базовый адрес uart5: 0x40005000 Базовый адрес GPIOC: 0x40020800, базовый адрес GPIOD: 0x40020C00. Бит 20 RCC_APB1ENR должен быть установлен для включения uart5, биты 2 и 3 RCC_AHB1ENR включают логику GPIOC и D. базовый адрес rcc - 0x40023800 и так далее, и так далее ...   -  person old_timer    schedule 22.01.2016
comment
библиотека написана для Keil, для GNU или другого? Это вопрос о том, что я хочу использовать другой компилятор для HAL, или это вопрос о том, что я не знаю, как использовать HAL.   -  person old_timer    schedule 22.01.2016
comment
это cortex-m4, поэтому вы можете использовать таймер systick и светодиод, чтобы получить хорошее представление о том, с какой скоростью работают часы, чтобы вы могли определить делитель для uart, это действительно единственная сложная часть всего этого и тем не менее, использование таймера и светодиода делает это несколько тривиальным ... или просто поместите осциллограф на uart tx и измерьте, что выходит, на основе выбранного вами делителя. и оттуда отрегулируйте.   -  person old_timer    schedule 22.01.2016
comment
Я рекомендую вам использовать USART1_TX и USART1_RX на PA9 и PA10, вместо этого это контакты, на которых вы обычно находите uart на части stm32, и если вы посмотрите на схему паяльных мостов SB15 и SB11, вы подключитесь к концу stlink платы. что теоретически означает, что вам не понадобятся другие решения USB для uart. хотя мой опыт работы с этими досками удачен или отсутствует в отношении того, действительно ли это работает. у некоторых моделей платы есть, у некоторых нет. вы можете вставить скрепку в отверстия tx / rx (jp4) и просто посмотреть, отдается ли это эхом, если нет, то паяные перемычки не помогут.   -  person old_timer    schedule 22.01.2016
comment
@dwelch Я обновил свой вопрос. Я не знаком с этими спецификациями, поэтому мои условия могут быть неточными. Спасибо за вашу помощь, и я посмотрю на образцы, которые вы предоставили. :)   -  person Brian Hsu    schedule 22.01.2016
comment
вам понадобится 3,3 В и земля (а также приемник и приемник), а не 5 В. так же, как Raspberry Pi (или должен был быть), это части на 3,3 В, даже если они иногда допускают 5 В.   -  person old_timer    schedule 22.01.2016
comment
Я не использую эти hals или cmsis или что-то в этом роде, поэтому действительно не могу помочь на этом фронте.   -  person old_timer    schedule 22.01.2016
comment
да, SB11 и SB15 помечены как зарезервированные, не модифицируемые, поэтому вы не можете пройти отладочную часть платы и избежать дополнительного usb для uart. NUCLEO F411RE и F401RE и некоторые другие виртуальный COM-порт через отладочную часть платы работает. но еще один NUCLEO, который я только что получил, основан на stm32f0, он не работает.   -  person old_timer    schedule 22.01.2016


Ответы (1)


Я отправил код этого ответа на следующий адрес github.

Код тривиален, отвечает на вопрос и в основном был сгенерирован STM-Cube. Вы также можете изменить файл .ioc.

Есть ряд других периферийных устройств, готовых к использованию, но не проверенных, в том числе

USB VCport 
Timers set for RC hobby servos, just change pulse width 500-1500
ADC  in DMA mode
SPI  for flash etc
I2C  for port expansion or whatever

Я разделяю разочарование OP, который потратил много дней, недель и месяцев на борьбу за то, чтобы этот материал работал как со старыми, так и с новыми библиотеками. Наконец-то, в 2016 году ST, похоже, немного прояснился, и я могу приступить к созданию реальных приложений для этих замечательных досок.

Фактически, при выполнении этой задачи мне пришлось переустановить свой куб и все его библиотеки, прежде чем он заработал должным образом, это могло вызвать беспокойство у других.

Я добавлю ЖК-экран и сенсорный экран в этот «шаблон», чтобы сделать отличный маленький «дроидлет».

Я обычно подключаю модуль bluetooth к одному из UARTS и отлаживаю его через него.

Энди Браун Энди Браун имеет несколько отличных библиотек C ++ для некоторых ST. Похоже, они основаны на библиотеках StdPeripheral и нуждаются в обновлении, чтобы мы могли использовать их через Cube и HAL на новых (и старых) устройствах. Как сообщество мы могли бы делать это более эффективно. Есть идеи и сторонники?

Повеселись.


Каноническое решение

Update your Cube and HAL libraries to the latest
Generate a cube project
Setup all your peripherals in the dialogs
Generate code
Compile
Add your application
Test  & Debug
Optimise
Release

Вам нужно только позаботиться о том, чтобы похожие периферийные устройства в разных семействах имели несоответствия, например АЦП на F0 отличается от F1 и F4. F3 потенциально имеет 16-битный АЦП.


Вероятно, вы все делаете правильно, кроме RTFM. (Прочтите Fineprint в Руководстве)

Если вы не хотите бороться с UART, вам лучше реализовать демонстрацию Virtual Comport, в которой используется стандартный USB-кабель. Пусть ST будет устройством.

Получите копию STCube, найдите в каталоге проектов / периферийных устройств USB и виртуальный компорт. Библиотека HAL такая же и тоже имеет этот код.

Выполняя работу на любой из плат Discovery, запустите копию STM32 Cube (free from ST) и создайте там свою конфигурацию. Он показывает вам, что используется, а что бесплатно, отличный инструмент и в качестве бонуса настроит USB.

Затем с помощью генератора кода создайте каркас проекта KEIL. Скомпилируйте, запустите, добавьте код вашего приложения и :-)

вы можете посмотреть здесь Embitz.org, у них отличная IDE и даже лучшие примеры F429iDisco или ST AC6 IDE и страница ST, где приведены другие примеры. Эти IDE не имеют ограничений по размеру кода, с чем вы столкнетесь, используя ЖК-дисплей, касаясь и т. Д. На этом устройстве.


Остальная часть ответа

К сожалению, STM по необходимости назначил большую часть контактов на этом открытии ЖК-дисплею, сенсорному экрану и микросхемам памяти на борту. Осталось очень мало функции Async - они, вероятно, думали, что USB будет в порядке.

Q1) - Как они обычно отмечены, вам нужно будет «пересечь», подключив Rx к TX и наоборот.

Проверьте свой код, подключив «шлейф» к контактам UART и проверьте светодиоды.

Q2) - STM Cube сгенерирует для вас рабочий проект Keil.

Есть демонстрационный код, который будет компилироваться и запускаться в stm32cube_fw_f4_v130 \ STM32Cube_FW_F4_V1.3.0 \ Projects \ STM32F429I-Discovery \ Examples \ UART с проектом Keil (MDK-ARM). Вам нужно будет перейти на UART5 - он настроен для USART1 PA9 (Tx) / PA10 (RX), после рабочего переключения на UART5 или локально протестируйте USART1 -> UART5.

Протестируйте, подключив RX к Tx при обнаружении, настройте Rx, затем TX, строка должна работать, и Rxbuffer должен это отразить.

Затем подключите к адаптеру все должно работать., Светодиоды должны мигать.

Если нет, поменяйте местами Tx и Rx.

Проверьте шлейф на DB9.

Если у вас есть модем или ПК на DB9, вам нужно будет управлять сигналами управления модемом, прежде чем что-либо из этого сработает. (RTC, CTS, DCD, DTR, DTE) См. Здесь. Raspberry сделает это за вас.

Отключите STM от адаптера и проверьте шлейф от ПК на DB9, затем на выводах Tx Rx.

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


Ниже приведено открытие 407 (первоначальное открытие) - извиняюсь, сначала не было видно, что у вас есть 429 - мы склонны говорить о F4Discovery против F429i-Discovery. Теперь есть и другие платы на базе F4.

На плате F4-Discovery - UART5 недоступен, конфликтует с I2S3D, который используется CS43L422 (микрофон) на PC12. Та же проблема с перегрузкой контактов, что и у F429.

Также используются другие UART и USART1.

Либо - настройте для USART2 или USART3

Положительным моментом является то, что USARTS 2 и 3 имеют встроенные линии RTS / CTS, которые вы можете использовать.

ИЛИ

Для отключения микрофона необходимо припаять / отпаять перемычки на плате.

Я создал много проектов с USARTS на нескольких разных платах STM32, и все они работают безупречно. К сожалению, программисты HAL предоставляют драйверы только фиксированной длины с таймаутом или без него, интерфейса Readline нет.

person ChrisR    schedule 25.01.2016
comment
Спасибо, ваш ответ мне очень помогает. Я успешно создал проект из STM Cube и теперь могу отправлять / получать сообщение UART. :-) - person Brian Hsu; 27.01.2016
comment
@ Брайан: Спасибо, вчера я сделал то же самое. ST ДЕЙСТВИТЕЛЬНО улучшили Cube и Ac6 (я не использую Keil из-за стоимости лицензии). В Cube "может быть" проблема с конфигурацией RCC делителей часов для некоторых комбинаций периферийных устройств - скорее всего, это идиот, нажимающий клавиши на моей клавиатуре :-) Я не публиковал сообщения, пока не был уверен в том, что происходит, и может воспроизвести результаты. Затем я отправлю сообщение сюда и на Github. Что ты нашел?. - person ChrisR; 27.01.2016