Опыт использования USART3 в STM32F100C6

Как известно виновники многих открытий — случайности.
Так и я не обратил внимания, что у STM32F100C6 по документации всего два USART и развел третий. Запустил обмен на передачу, все замечательно работало. Однако когда начал налаживать прерывание на прием обнаружил, что в STM32F10x_StdPeriph_Driver для этого МК прерывание не настраивается. Что такое думаю, как так. Открыл даташит и смотрю, а их два.
Ну думаю раз на передачу работает дело за тем, что бы допилить STM32F10x_StdPeriph_Driver.
Выполнил следующие доработки (компилятор KEIL)
В файле stm32f10x.h в разделе #ifdef STM32F10X_LD_VL добавил строку
USART3_IRQn = 39, /*!< USART3 global Interrupt */
которую скопировал из раздела
#ifdef STM32F10X_MD

Далее в фале запуска startup_stm32f10x_ld_vl.s
добавил обработчик прерывания от USART3
Прием заработал.
Оба отредактированных файла прилагаю.

На передачу USART3 работал долго и уверено, а вот когда наладил прерывание через некоторое время, после активного обмена МК перестал работать. Прошивается, но не работает. Под отладчиком посмотреть, что там происходит, возможности нет из-за особенности схемы.

Обращаю внимание функция сия выходит не документированная и использовать ее можно скорее для экспериментов или для каких то разовых работ.
  • +3
  • 09 сентября 2015, 20:57
  • molchec
  • 1
Файлы в топике: file.zip

Комментарии (12)

RSS свернуть / развернуть
Не знаю, как у них система сборки организована, но может просто дефайн зыбыли переткнуть) Судя по тому, какой у них модельный конвеер, немудрено это. А вообще, там вполне на кристалле может быть полно периферии, а разница между моделями — фикция, лишь в документации и в схеме разварки по корпусам, такой маркетинговый ход.
Да и вообще, там должна быть целая орава интересных, но незадокументированных регистров для тестирования и прочего, это я тебе как разработчик говорю =)
0
Проверь сколько там ещё недокументированной памяти :)
we.easyelectronics.ru/pteriks/realnyy-obem-pamyati-v-stm32.html
обратил внимание что на stm32f103C8 он читает не 64 килобайта а 128 килобайт
В STM32F100C4 реально 32к флеша
0
памяти то как раз хватает.
Как говорится «не долго музыка играла»
Вчера при ночных экспериментах с приемом камень в какой то момент перестал работать.
Пробовал перепрошить — не помогает.
Странно на передачу до этого долго его мучал.
0
Поправь тогда название темы и в начале текста сообщи об этом… иначе пересказы и слухи загубят камни и у других экспериментаторов:
Рекомендую не пользоваться недокументированными возможностями STM32

Хотя камень мог сдохнуть и по естественным причинам.
+1
Смотрим документацию.
Даташит на 100C6:
The STM32F100xx value line embeds three universal synchronous/asynchronous receiver
transmitters (USART1, USART2 and USART3).
Как видим, все три усарта есть. Это я про фразу «по документации всего два USART».

Теперь смотрим референс мануал на всю сотую серию. RM0041, страница 131, таблица прерываний:
37 44 settable USART1 USART1 global interrupt 0x0000_00D4
38 45 settable USART2 USART2 global interrupt 0x0000_00D8
39 46 settable USART3 USART3 global interrupt 0x0000_00DC
40 47 settable EXTI15_10 EXTI Line[15:10] interrupts 0x0000_00E0
Опять получается, что и модуль есть, и прерывания от него предусмотрены.

Там же есть строчка «Low-density value line devices are STM32F100xx microcontrollers where the Flash
memory density ranges between 16 and 32 Kbytes.», значит 100C6 точно относится к серии LD_VL.

Переходим к файлам SPL.
Смотрим стартап-файл на LD_VL:
DCD     USART1_IRQHandler             ; USART1
DCD     USART2_IRQHandler             ; USART2
DCD     0                             ; Reserved
DCD     EXTI15_10_IRQHandler          ; EXTI Line 15..10
О, нестыковка. USART3 обделили.
Теперь, по вашим стопам, в stm32f10x.h:
USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
То же самое.
Делаем вывод, что скорее всего проблема в строчке
"Author             : MCD Application Team"
в начале этих файлов.
Так что USART3 — документированная возможность STM32F100, и лишний повод не использовать SPL, или постоянно перепроверять их.

Я сам недавно испугался, заложив в проект USART3 (и даже сделал серию плат), а потом обнаружил эту странность в SPL. Но оказалось что всё хорошо.
+3
По документации и по конфигуратору в Кубе в этой модели USART3 нет
-1
Спасибо, два раза повторять было необязательно. В даташите есть места, где утверждается обратное. Я говорю, что вижу своими глазами.
0
Повторю трижды — Up to N означает «до N»
Up to 8 communications interfaces
– Up to two I2C interfaces (SMBus/PMBus)
– Up to 3 USARTs (ISO 7816 interface, LIN,
IrDA capability, modem control)
– Up to 2 SPIs (12 Mbit/s)
— Up to 80 fast I/O ports
Up to 80 fast I/O ports — ну никак нельзя запихнуть 80 портов в 48 ног :)
+1
Смотрю сюда
www.st.com/web/en/resource/technical/document/datasheet/CD00251732.pdf
страница 11, для STM32F100CX с флешь 32 кБ нет USART3 (сноска 4)
+1
Возникает ощущение, что ST сначала не хотела ставить UART3 в эти кристаллы, и в последний момент передумала. Поэтому команда MCD не успела внести изменения в SPL, да и сама ST не весь даташит поправила. А может и наоборот всё было, решили убрать.
В errata, кстати, ни слова про это нет, однако USART3 там посвящено несколько глав (наверное, относительно F100Vx).
Кому верить — не знаю, я предпочитаю верить своим глазам.
0
Да мутная история выходит.
Скачал свежие либы с сайта ST (датированы июнем 2015 г.) там USART3 есть для всех F100.
+2
а в stm32f101 есть USB, работает. по документации — его там нет. и работает не на 36 мгц а на 72. просто отбраковка от 103ей серии. имхо.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.