Настройка USART в STM32 (STM32F103VBT6), Assembler.

Кто любит RISC в жизни, заходим, не стесняемся.
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

Настройка 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, и снова бесконечный цикл ожидания.
Вложения
12.jpg
(76.57 КБ) 781 скачивание
Последний раз редактировалось Вадиматоричик Вс мар 09, 2014 16:12:40, всего редактировалось 1 раз.
Все можно сделать, было бы желание!
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение shads »

Сразу говорю - разубеждать не буду :).....

Просто интересно, какова причина перехода на STM32...
Если точнее сформулировать - какие у вас есть реальные потребности которые не решает AVR и которые решает STM32?

Насколько я знаю, для STM32 намного сложнее писать на асме чем для AVR...
Т.е. это я к тому что, может вы себе усложняете жизнь переходя на STM32... если например AVR решает все ваши задачи.....
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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:
APB.jpg
(101.68 КБ) 846 скачиваний

Порт B и USART:
P and USART.jpg
(162.44 КБ) 857 скачиваний
Все можно сделать, было бы желание!
Аватара пользователя
kisssko
Открыл глаза
Сообщения: 52
Зарегистрирован: Пт янв 10, 2014 02:05:13
Откуда: Воронеж

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение kisssko »

...предыдущее сообщение убрано...
Я тут сперва было подумал, что ошибка в коде. Потом проверил - вроде всё ок.

Больше бы кода увидеть. Ещё смущает, что идёт перезапись всех регистров периферии, хотя надо бы только нужные биты включать по ИЛИ.
Тут надо бы всё внимательней проверить, может что нужное отключается. Остальное то правильно инициируется?
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение Вадиматоричик »

Сделал, как вы сказали. Толку нет. Где нужно было 1 бит в регистре установить - пользовался big bend-ом, где 2 и более - логическим "или". Не могу никак выровнять код в редакторе, так что выкладываю проект целиком. Если смотреть в настройках периферии keil, то все нужные биты установлены. В чем проблема - не -знаю.
Вложения
BigProgect.rar
(46.97 КБ) 359 скачиваний
Все можно сделать, было бы желание!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Вадиматоричик писал(а):При передачи 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, которые сами плавают . Для них всегда все будет тяжело и трудно.
Читать даташит более внимательно...
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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.
Вложения
BigProgect.rar
(46.97 КБ) 306 скачиваний
Все можно сделать, было бы желание!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Вадиматоричик писал(а):Здесь я жду пока флаг 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 , используемый при потоковых данных.
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение Вадиматоричик »

Изменил, теперь ждет, пока TXE станет = 1, после посылает пакет. Но есть одно НО. При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. Вот измененный проект.
Вложения
BigProgect.rar
(46.97 КБ) 316 скачиваний
Все можно сделать, было бы желание!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Вадиматоричик писал(а): При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. .


Чем смотрим ? Дебаггером ? :))) Ну, ну...
Лучше выталкивай строку в цикле через паузу. И смотри на терминале.


Вадиматоричик, до кучи - не вижу расчета baudrate .
Ручками считаешь? :))) Все же просто и делается на уровне препроцессора :

Код: Выделить всё

 (APBCLK+BAUDRATE/2)/BAUDRATE;


Где APBCLK фактически частота тактирования UART в Гц и BAUDRATE требуемая скорость в бодах
Например :

Код: Выделить всё

 #define APBCLK 48000000UL
#define BAUDRATE 115200UL


В итоге одни константы...
Последний раз редактировалось dosikus Пн мар 10, 2014 10:50:02, всего редактировалось 1 раз.
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение Вадиматоричик »

Чем смотрим ? Дебаггером ? :))) Ну, ну...

Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную.
Вадиматоричик, до кучи - не вижу расчета baudrate .
Ручками считаешь? :))) Все же просто и делается на уровне препроцессора :

Нет. Изначально считал этой формулой. Просто решил, что возможно компилятор не правильно считает (С компилятором AVR такое было...) по-этому пока решил константой, чтобы наверняка.
Можно вас попросить? Попробуйте написать элементарную программу, которая инициализирует USART3 и просто отсылает 1 символ, когда видит, что буфер свободен, и просимулируйте в кейле. На любом языке. Просто посмотреть, вдруг это косяк встроенного симулятора USART-а.
Все можно сделать, было бы желание!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение HHIMERA »

Вадиматоричик писал(а):Да, пока что в симуляторе. Жду, пока приедет вышеупомянутый МК и я впаяю его в свою отладочную.

Тебе ж сказали... забудь про АВР... Забудь про симулятор... и забудь при отладке бряк на проверке флагов...
Это всё пустая трата времени... без железа там делать нечего...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Вадиматоричик, ну если симулятор :))) Тогда забей .
Во первых -симулятор работает только с некоторыми из 103их .
Во вторых- с ARM надо вживую работать , а так только грабли собирать будешь . Периферия живет своей жизнью ... :)))
А в железе с Keil одни преимущества , можешь в дебагере ручками и инитить периферию и работать с ней .
Практически без написания кода , тебе как асмисту самое то... :)))
И лучше ставь 5й Keil ...

HHIMERA, +100500 :beer:
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение Вадиматоричик »

Благодарю за помощь. Как доделаю отладочную, отпишусь, что получилось.
Все можно сделать, было бы желание!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Вадиматоричик писал(а): Как доделаю отладочную.


Можешь уже готовое пользовать.

Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Вложения
STM32F103CBT6_board.rar
(40.88 КБ) 369 скачиваний
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение shads »

А для STM32F100C8T6B она пойдет? ног вроде одинаково - 44...
И схема не читабельна... покрупнее бы...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Подойдет , вот только у обоих 48 лап и у 100ки USB не будет . :)))
Схема и печатка в аттаче ...
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение shads »

dosikus писал(а):вот только у обоих 48 лап
Промазал малость :)...

dosikus писал(а):Схема и печатка в аттаче ...
Сразу не заметил... А что за файлы?... не знаю чем открывать... если можно картинку СХЕМЫ просто покрупнее...
с печаткой в лайауте вроде сам разберусь...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.

Сообщение dosikus »

Файлы для Dip Trace .
если можно картинку СХЕМЫ просто покрупнее.

А вот с этим обломс , в Dip Trace нет экспорта в графику , сделали бы в pdf вообще шоколадно было.
А скриншоты могу только такие - ноут ... :)))
Хотя , вот частями нащелкал...

Да, пока не забыл - плата 2х сторонняя , вторая сторона сплошная медь под GND .
GND со стороны деталей соединен через самопальные via - заклепки из 0.7 медного проводника.
Отверстия под разъемы со обратной стороны закернены .

Изображение
Вложения
schem.rar
(97.71 КБ) 341 скачивание
Ответить

Вернуться в «ARM»