Форум РадиоКот https://radiokot.ru/forum/ |
|
Настройка USART в STM32 (STM32F103VBT6), Assembler. https://radiokot.ru/forum/viewtopic.php?f=59&t=101516 |
Страница 1 из 3 |
Автор: | Вадиматоричик [ Вс мар 09, 2014 09:59:07 ] | ||
Заголовок сообщения: | Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Здравствуйте, уважаемые коты. Научившись "профессионально" программировать под AVR на ассемблере решил перейти на STM32. Так же на ассемблере (Разубеждать нет смысла, не помогает). Намучившись с созданием отладочной платы (Завершена на 70%. Все готовое, типа STMDiscavery или Arduino не признаю, так что слепил свою.) и морганием светодиодом (Ушло около недели, чтобы добиться желаемого результата), прочел книгу "Джозеф Ю. Ядро Cortex-M3 компании ARM. Полное руководство", дабы иметь представление о структуре ядра. Пишу в keil 4. Сейчас решил связать МК с компьютером по средствам переходника USART<->USB (FT232). Раньше имел дело с USART-ом на AVR. Проблема: При передачи 8-ми битного пакета, флаг TC никак не реагирует. Перерыл даташит, пересмотрел кучу примеров на разных языках. Вот мой код инициализации в Keil. Код: 1 get stm32f10x.asm ;Заголовочный файл. 2 AREA |.text|,CODE,READONLY ;В памяти кода. 3 Reset_Handler 4 fck equ 24000000 ;Частота USART. 5 baudrate equ 9600 ;Скорость передачи. 6 mov R10,#0 ;Константы. 7 mov R11,#1 8 ;---------- UART1.---------- 13 ;Разрешаем тактирование порта A и USART.---------- 14 ldr R0, =RCC_APB2ENR 15 ldr R1, =RCC_APB2ENR_IOPAEN|RCC_APB2ENR_USART1EN|RCC_APB2ENR_AFIOEN 16 str R1, [R0] 17 ;PA9 выход push-pull в альтернативном режиме. Частота 50 МГц. PA10 вход без подтяжки.---------- 18 ldr R0, =GPIOA_CRH 19 ldr R1, =GPIO_CRH_MODE9|GPIO_CRH_CNF9_1|GPIO_CRH_CNF10_0 20 str R1, [R0] 21 ;Настройка скорости USART. 22 ldr R0, =USART1_BRR ;11:0 - целая, 3:0 - дробная. 23 ldr R1, =0x341 ;Формула рассчета. 24 str R1, [R0] 25 ;UE - включить USART; TE - вкл. передатчик; RE - вкл. приемник. 26 ldr R0, =USART1_CR1 27 ldr R1, =USART_CR1_UE|USART_CR1_TE|USART_CR1_RE 28 str R1, [R0] 29 30 ;Отправляем байт по USART 31 K ldr R0, =USART1_DR 32 mov R1,#'F' 33 str R1, [R0] 34 35 ;Считываем бит TC (6). Ждем 0------------------------------------------- 36 SR ldr R0, =(USART1_SR&0x00FFFFFF)*0x20+0x42000000+6*4 37 ldr R1, [R0] 38 cmp R1, R10 39 bne SR 40 b K 41 END Цикл становиться бесконечным. Если вручную сбросить бит, то отправится следующий пакет, TC = 1, и снова бесконечный цикл ожидания.
|
Автор: | Вадиматоричик [ Вс мар 09, 2014 12:51:39 ] |
Заголовок сообщения: | Re: Настройка USART1 в STM32 (STM32F103VBT6), Assembler. |
Решил перенести на USART3. Но эффект тот же. Вот код. Код: 8 ;---------- UART1.----------
9 ldr R0, =RCC_APB2ENR ;Регистр настройки шины APB2. 10 ldr R1, =RCC_APB2ENR_IOPBEN ;Включаем PORTB. 11 str R1, [R0] 12 ldr R0, =RCC_APB1ENR ;Регистр настройки шины APB1. 13 ldr R1, =RCC_APB1ENR_USART3EN ;Включаем USART3. 14 str R1, [R0] 15 ldr R0, =GPIOB_CRH ;Настраиваем PB10 (TX - выход) и PB11 (RX - вход). 16 ldr R1, =GPIO_CRH_MODE10|GPIO_CRH_CNF11_0 17 str R1, [R0] 18 ldr R0, =USART3_CR1 ;Включаем USART, прием-передатчик. 19 ldr R1, =USART_CR1_UE|USART_CR1_TE|USART_CR1_RE 20 str R1, [R0] 21 ldr R0, =USART3_BRR ;Выставляем скорость USART. 22 ldr R1, =0x34D 23 str R1, [R0] 24 25 ;Отправляем байт по USART 26 K ldr R0, =USART3_DR 27 mov R1,#'L' 28 str R1, [R0] 29 30 ;Считываем бит TC (6). Ждем 0------------------------------------------- 31 SR ldr R0, =(USART3_SR&0x00FFFFFF)*0x20+0x42000000+6*4 32 ldr R1, [R0] 33 cmp R1, R10 34 bne SR 35 b K 36 END |
Автор: | shads [ Вс мар 09, 2014 16:44:41 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Сразу говорю - разубеждать не буду ![]() Просто интересно, какова причина перехода на STM32... Если точнее сформулировать - какие у вас есть реальные потребности которые не решает AVR и которые решает STM32? Насколько я знаю, для STM32 намного сложнее писать на асме чем для AVR... Т.е. это я к тому что, может вы себе усложняете жизнь переходя на STM32... если например AVR решает все ваши задачи..... |
Автор: | Вадиматоричик [ Вс мар 09, 2014 17:36:08 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Мне все говорят, что это безумие, но в этом весь я. Начнем с того, что задачи весьма сложные, например: анализировать изображения, получаемые с камеры HD разрешения, выполнять роль сервера, иметь собственную ОС и т.д. Под Atmega16 начал писать свою ось. Дело шло нормально. Пока не решил добавить вышеперечисленные задачи по работе с графикой (ОС была в консольном режиме. А графику уже не смола вытянуть). Знаю, что правильнее было бы создать свою сборку "компьютера на одной плате" (пользоваться чужим не стану), но я надеюсь написать все, как впрочем и всегда, на чистом асеме. Без макросов и библиотек. Что даст мне куда больше возможностей. А теперь на счет USART-а. Вот мой алгоритм, может я что забыл? 1. В APB2 включил тактирование PORTB (На нем USART 3 весит). 2. В APB1 включаю USART3. 3. Настраиваю PB10 (TX - выход) на тяни-толкай с масимальной частотой и PB11 (RX - вход) для переферийных устройств без подтяжки (но не для АЦП). 4. Выставляем скорость USART. 5. Включаю USART и прием-передатчик. После настройки, но перед посылкой байтов регистры имеют следующие настройки: APB1:2: Вложение: Порт B и USART: Вложение:
|
Автор: | kisssko [ Вс мар 09, 2014 20:51:25 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
...предыдущее сообщение убрано... Я тут сперва было подумал, что ошибка в коде. Потом проверил - вроде всё ок. Больше бы кода увидеть. Ещё смущает, что идёт перезапись всех регистров периферии, хотя надо бы только нужные биты включать по ИЛИ. Тут надо бы всё внимательней проверить, может что нужное отключается. Остальное то правильно инициируется? |
Автор: | Вадиматоричик [ Пн мар 10, 2014 06:47:17 ] | ||
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Сделал, как вы сказали. Толку нет. Где нужно было 1 бит в регистре установить - пользовался big bend-ом, где 2 и более - логическим "или". Не могу никак выровнять код в редакторе, так что выкладываю проект целиком. Если смотреть в настройках периферии keil, то все нужные биты установлены. В чем проблема - не -знаю.
|
Автор: | dosikus [ Пн мар 10, 2014 09:00:29 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Вадиматоричик писал(а): При передачи 8-ми битного пакета, флаг TC никак не реагирует. Перерыл даташит, пересмотрел кучу примеров на разных языках. Непонятно что,где и как смотрелось . Пример передачи : Код: void USART2_write(char data) { while (!(USART2->SR & USART_SR_TXE)) { // wait until the data register becomes empty } USART2->DR = data; } Для асмистов переведу - Код: while (!(USART2->SR & USART_SR_TXE)) - ждем сброса бита TXE ( освобождение буфера )Код: USART2->DR = data; - закидываем в буфер то что нужно передать.Ну и совет на будущее . Так как путь тебе предстоит тяжелый и непроторенный , крайне желательно : забыть AVR напрочь . не слушать советчиков от AVR, которые сами плавают . Для них всегда все будет тяжело и трудно. Читать даташит более внимательно... |
Автор: | Вадиматоричик [ Пн мар 10, 2014 09:54:21 ] | ||
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Последовал вашему совету, после инициализации такой код: Код: ;Считываем бит TXE (7). Ждем 0. SR ldr R0, =(USART3_SR & 0x00FFFFFF) * 0x20 + 0x42000000 + 7 * 4 ldr R1, [R0] cmp R1, R10 bne SR ;Отправляем байт по USART K ldr R0, =USART3_DR mov R1, #'L' str R1, [R0] b SR Здесь я жду пока флаг TXE будет = 0, но он всегда = 1! То, что я получаю правильные данные - подтвержденная информация, в отладчике USART показаны, какое значение имеет каждый бит. Вот измененный проект. Получается бесконечный цикл считывания бита TXE.
|
Автор: | dosikus [ Пн мар 10, 2014 10:03:15 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Вадиматоричик писал(а): Здесь я жду пока флаг TXE будет = 0, но он всегда = 1! Упс извинямс, мое Цитата: - ждем сброса бита TXE Следует читать : Цитата: ждем пока TXE сброшен . И на что обратить внимание в Reference manual -RM0008 : Цитата: Bit 7 TXE: Transmit data register empty This bit is set by hardware when the content of the TDR register has been transferred into the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It is cleared by a write to the USART_DR register. 0: Data is not transferred to the shift register 1: Data is transferred to the shift register) Note: This bit is used during single buffer transmission. Bit 6 TC: Transmission complete This bit is set by hardware if the transmission of a frame containing data is complete and if TXE is set. An interrupt is generated if TCIE=1 in the USART_CR1 register. It is cleared by a software sequence (a read from the USART_SR register followed by a write to the USART_DR register). The TC bit can also be cleared by writing a '0' to it. This clearing sequence is recommended only for multibuffer communication. 0: Transmission is not complete 1: Transmission is complete Кратко - установленный TXE сигнализирует, что буфер передан в сдвиговый регистр и готов к приему новых данных. TXE сбрасывается записью в DR данных. Этот флаг используется при одиночных транзакциях в отличии от TC , используемый при потоковых данных. |
Автор: | Вадиматоричик [ Пн мар 10, 2014 10:29:50 ] | ||
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Изменил, теперь ждет, пока TXE станет = 1, после посылает пакет. Но есть одно НО. При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. Вот измененный проект.
|
Автор: | dosikus [ Пн мар 10, 2014 10:38:31 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Вадиматоричик писал(а): При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. . Чем смотрим ? Дебаггером ? ![]() Лучше выталкивай строку в цикле через паузу. И смотри на терминале. Вадиматоричик, до кучи - не вижу расчета baudrate . Ручками считаешь? ![]() Код: (APBCLK+BAUDRATE/2)/BAUDRATE; Где APBCLK фактически частота тактирования UART в Гц и BAUDRATE требуемая скорость в бодах Например : Код: #define APBCLK 48000000UL #define BAUDRATE 115200UL В итоге одни константы... |
Автор: | Вадиматоричик [ Пн мар 10, 2014 13:49:10 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Цитата: Чем смотрим ? Дебаггером ? ![]() Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную. Цитата: Вадиматоричик, до кучи - не вижу расчета baudrate . Ручками считаешь? ![]() Нет. Изначально считал этой формулой. Просто решил, что возможно компилятор не правильно считает (С компилятором AVR такое было...) по-этому пока решил константой, чтобы наверняка. Можно вас попросить? Попробуйте написать элементарную программу, которая инициализирует USART3 и просто отсылает 1 символ, когда видит, что буфер свободен, и просимулируйте в кейле. На любом языке. Просто посмотреть, вдруг это косяк встроенного симулятора USART-а. |
Автор: | HHIMERA [ Пн мар 10, 2014 14:14:02 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Вадиматоричик писал(а): Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную. Тебе ж сказали... забудь про АВР... Забудь про симулятор... и забудь при отладке бряк на проверке флагов... Это всё пустая трата времени... без железа там делать нечего... |
Автор: | dosikus [ Пн мар 10, 2014 14:15:40 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Вадиматоричик, ну если симулятор ![]() Во первых -симулятор работает только с некоторыми из 103их . Во вторых- с ARM надо вживую работать , а так только грабли собирать будешь . Периферия живет своей жизнью ... ![]() А в железе с Keil одни преимущества , можешь в дебагере ручками и инитить периферию и работать с ней . Практически без написания кода , тебе как асмисту самое то... ![]() И лучше ставь 5й Keil ... HHIMERA, +100500 ![]() |
Автор: | Вадиматоричик [ Пн мар 10, 2014 17:01:17 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Благодарю за помощь. Как доделаю отладочную, отпишусь, что получилось. |
Автор: | dosikus [ Пн мар 10, 2014 17:25:34 ] | ||
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Вадиматоричик писал(а): Как доделаю отладочную. Можешь уже готовое пользовать. ![]() ![]() ![]() ![]() ![]() ![]()
|
Автор: | shads [ Пн мар 10, 2014 17:42:10 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
А для STM32F100C8T6B она пойдет? ног вроде одинаково - 44... И схема не читабельна... покрупнее бы... |
Автор: | dosikus [ Пн мар 10, 2014 18:15:38 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
Подойдет , вот только у обоих 48 лап и у 100ки USB не будет . ![]() Схема и печатка в аттаче ... |
Автор: | shads [ Пн мар 10, 2014 18:25:33 ] |
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. |
dosikus писал(а): вот только у обоих 48 лап Промазал малость ![]() dosikus писал(а): Схема и печатка в аттаче ... Сразу не заметил... А что за файлы?... не знаю чем открывать... если можно картинку СХЕМЫ просто покрупнее...с печаткой в лайауте вроде сам разберусь... |
Автор: | dosikus [ Пн мар 10, 2014 18:47:06 ] | ||
Заголовок сообщения: | Re: Настройка USART в STM32 (STM32F103VBT6), Assembler. | ||
Файлы для Dip Trace . Цитата: если можно картинку СХЕМЫ просто покрупнее. А вот с этим обломс , в Dip Trace нет экспорта в графику , сделали бы в pdf вообще шоколадно было. А скриншоты могу только такие - ноут ... ![]() Хотя , вот частями нащелкал... Да, пока не забыл - плата 2х сторонняя , вторая сторона сплошная медь под GND . GND со стороны деталей соединен через самопальные via - заклепки из 0.7 медного проводника. Отверстия под разъемы со обратной стороны закернены . ![]()
|
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |