Заголовок сообщения: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Вс мар 09, 2014 09:59:07
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Здравствуйте, уважаемые коты. Научившись "профессионально" программировать под 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, и снова бесконечный цикл ожидания.
Просто интересно, какова причина перехода на STM32... Если точнее сформулировать - какие у вас есть реальные потребности которые не решает AVR и которые решает STM32?
Насколько я знаю, для STM32 намного сложнее писать на асме чем для AVR... Т.е. это я к тому что, может вы себе усложняете жизнь переходя на STM32... если например AVR решает все ваши задачи.....
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Вс мар 09, 2014 17:36:08
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Мне все говорят, что это безумие, но в этом весь я. Начнем с того, что задачи весьма сложные, например: анализировать изображения, получаемые с камеры HD разрешения, выполнять роль сервера, иметь собственную ОС и т.д. Под Atmega16 начал писать свою ось. Дело шло нормально. Пока не решил добавить вышеперечисленные задачи по работе с графикой (ОС была в консольном режиме. А графику уже не смола вытянуть). Знаю, что правильнее было бы создать свою сборку "компьютера на одной плате" (пользоваться чужим не стану), но я надеюсь написать все, как впрочем и всегда, на чистом асеме. Без макросов и библиотек. Что даст мне куда больше возможностей. А теперь на счет USART-а. Вот мой алгоритм, может я что забыл? 1. В APB2 включил тактирование PORTB (На нем USART 3 весит). 2. В APB1 включаю USART3. 3. Настраиваю PB10 (TX - выход) на тяни-толкай с масимальной частотой и PB11 (RX - вход) для переферийных устройств без подтяжки (но не для АЦП). 4. Выставляем скорость USART. 5. Включаю USART и прием-передатчик. После настройки, но перед посылкой байтов регистры имеют следующие настройки: APB1:2:
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
...предыдущее сообщение убрано... Я тут сперва было подумал, что ошибка в коде. Потом проверил - вроде всё ок.
Больше бы кода увидеть. Ещё смущает, что идёт перезапись всех регистров периферии, хотя надо бы только нужные биты включать по ИЛИ. Тут надо бы всё внимательней проверить, может что нужное отключается. Остальное то правильно инициируется?
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Пн мар 10, 2014 06:47:17
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Сделал, как вы сказали. Толку нет. Где нужно было 1 бит в регистре установить - пользовался big bend-ом, где 2 и более - логическим "или". Не могу никак выровнять код в редакторе, так что выкладываю проект целиком. Если смотреть в настройках периферии keil, то все нужные биты установлены. В чем проблема - не -знаю.
При передачи 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, которые сами плавают . Для них всегда все будет тяжело и трудно. Читать даташит более внимательно...
;Отправляем байт по USART K ldr R0, =USART3_DR mov R1, #'L' str R1, [R0] b SR
Здесь я жду пока флаг TXE будет = 0, но он всегда = 1! То, что я получаю правильные данные - подтвержденная информация, в отладчике USART показаны, какое значение имеет каждый бит. Вот измененный проект. Получается бесконечный цикл считывания бита TXE.
Здесь я жду пока флаг 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 , используемый при потоковых данных.
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Пн мар 10, 2014 10:29:50
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Изменил, теперь ждет, пока TXE станет = 1, после посылает пакет. Но есть одно НО. При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. Вот измененный проект.
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Пн мар 10, 2014 13:49:10
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Цитата:
Чем смотрим ? Дебаггером ? Ну, ну...
Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную.
Цитата:
Вадиматоричик, до кучи - не вижу расчета baudrate . Ручками считаешь? Все же просто и делается на уровне препроцессора :
Нет. Изначально считал этой формулой. Просто решил, что возможно компилятор не правильно считает (С компилятором AVR такое было...) по-этому пока решил константой, чтобы наверняка. Можно вас попросить? Попробуйте написать элементарную программу, которая инициализирует USART3 и просто отсылает 1 символ, когда видит, что буфер свободен, и просимулируйте в кейле. На любом языке. Просто посмотреть, вдруг это косяк встроенного симулятора USART-а.
_________________ Все можно сделать, было бы желание!
Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную.
Тебе ж сказали... забудь про АВР... Забудь про симулятор... и забудь при отладке бряк на проверке флагов... Это всё пустая трата времени... без железа там делать нечего...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Вадиматоричик, ну если симулятор Тогда забей . Во первых -симулятор работает только с некоторыми из 103их . Во вторых- с ARM надо вживую работать , а так только грабли собирать будешь . Периферия живет своей жизнью ... А в железе с Keil одни преимущества , можешь в дебагере ручками и инитить периферию и работать с ней . Практически без написания кода , тебе как асмисту самое то... И лучше ставь 5й Keil ...
Сразу не заметил... А что за файлы?... не знаю чем открывать... если можно картинку СХЕМЫ просто покрупнее... с печаткой в лайауте вроде сам разберусь...
А вот с этим обломс , в Dip Trace нет экспорта в графику , сделали бы в pdf вообще шоколадно было. А скриншоты могу только такие - ноут ... Хотя , вот частями нащелкал...
Да, пока не забыл - плата 2х сторонняя , вторая сторона сплошная медь под GND . GND со стороны деталей соединен через самопальные via - заклепки из 0.7 медного проводника. Отверстия под разъемы со обратной стороны закернены .
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения