Страница 1 из 3

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

Добавлено: Вс мар 09, 2014 09:59:07
Вадиматоричик
Здравствуйте, уважаемые коты. Научившись "профессионально" программировать под 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, и снова бесконечный цикл ожидания.

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

Добавлено: Вс мар 09, 2014 12:51:39
Вадиматоричик
Решил перенести на 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

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

Добавлено: Вс мар 09, 2014 16:44:41
shads
Сразу говорю - разубеждать не буду :).....

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

Насколько я знаю, для STM32 намного сложнее писать на асме чем для AVR...
Т.е. это я к тому что, может вы себе усложняете жизнь переходя на STM32... если например AVR решает все ваши задачи.....

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

Добавлено: Вс мар 09, 2014 17:36:08
Вадиматоричик
Мне все говорят, что это безумие, но в этом весь я. Начнем с того, что задачи весьма сложные, например: анализировать изображения, получаемые с камеры 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 КБ) 847 скачиваний

Порт B и USART:
P and USART.jpg
(162.44 КБ) 857 скачиваний

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

Добавлено: Вс мар 09, 2014 20:51:25
kisssko
...предыдущее сообщение убрано...
Я тут сперва было подумал, что ошибка в коде. Потом проверил - вроде всё ок.

Больше бы кода увидеть. Ещё смущает, что идёт перезапись всех регистров периферии, хотя надо бы только нужные биты включать по ИЛИ.
Тут надо бы всё внимательней проверить, может что нужное отключается. Остальное то правильно инициируется?

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

Добавлено: Пн мар 10, 2014 06:47:17
Вадиматоричик
Сделал, как вы сказали. Толку нет. Где нужно было 1 бит в регистре установить - пользовался big bend-ом, где 2 и более - логическим "или". Не могу никак выровнять код в редакторе, так что выкладываю проект целиком. Если смотреть в настройках периферии keil, то все нужные биты установлены. В чем проблема - не -знаю.

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

Добавлено: Пн мар 10, 2014 09:00:29
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, которые сами плавают . Для них всегда все будет тяжело и трудно.
Читать даташит более внимательно...

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

Добавлено: Пн мар 10, 2014 09:54:21
Вадиматоричик
Последовал вашему совету, после инициализации такой код:

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

;Считываем бит 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.

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

Добавлено: Пн мар 10, 2014 10:03:15
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 , используемый при потоковых данных.

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

Добавлено: Пн мар 10, 2014 10:29:50
Вадиматоричик
Изменил, теперь ждет, пока TXE станет = 1, после посылает пакет. Но есть одно НО. При загрузке нового пакета в USART3_DR, ни TXE, ни DR не меняются. Вот измененный проект.

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

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


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


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

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

 (APBCLK+BAUDRATE/2)/BAUDRATE;


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

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

 #define APBCLK 48000000UL
#define BAUDRATE 115200UL


В итоге одни константы...

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

Добавлено: Пн мар 10, 2014 13:49:10
Вадиматоричик
Чем смотрим ? Дебаггером ? :))) Ну, ну...

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

Нет. Изначально считал этой формулой. Просто решил, что возможно компилятор не правильно считает (С компилятором AVR такое было...) по-этому пока решил константой, чтобы наверняка.
Можно вас попросить? Попробуйте написать элементарную программу, которая инициализирует USART3 и просто отсылает 1 символ, когда видит, что буфер свободен, и просимулируйте в кейле. На любом языке. Просто посмотреть, вдруг это косяк встроенного симулятора USART-а.

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

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

Тебе ж сказали... забудь про АВР... Забудь про симулятор... и забудь при отладке бряк на проверке флагов...
Это всё пустая трата времени... без железа там делать нечего...

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

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

HHIMERA, +100500 :beer:

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

Добавлено: Пн мар 10, 2014 17:01:17
Вадиматоричик
Благодарю за помощь. Как доделаю отладочную, отпишусь, что получилось.

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

Добавлено: Пн мар 10, 2014 17:25:34
dosikus
Вадиматоричик писал(а): Как доделаю отладочную.


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

Изображение
Изображение
Изображение
Изображение
Изображение
Изображение

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

Добавлено: Пн мар 10, 2014 17:42:10
shads
А для STM32F100C8T6B она пойдет? ног вроде одинаково - 44...
И схема не читабельна... покрупнее бы...

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

Добавлено: Пн мар 10, 2014 18:15:38
dosikus
Подойдет , вот только у обоих 48 лап и у 100ки USB не будет . :)))
Схема и печатка в аттаче ...

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

Добавлено: Пн мар 10, 2014 18:25:33
shads
dosikus писал(а):вот только у обоих 48 лап
Промазал малость :)...

dosikus писал(а):Схема и печатка в аттаче ...
Сразу не заметил... А что за файлы?... не знаю чем открывать... если можно картинку СХЕМЫ просто покрупнее...
с печаткой в лайауте вроде сам разберусь...

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

Добавлено: Пн мар 10, 2014 18:47:06
dosikus
Файлы для Dip Trace .
если можно картинку СХЕМЫ просто покрупнее.

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

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

Изображение