Перейти к содержанию
    

STM32 – вопросы – проблемы - решения.

в том то и дело, если передавать числа или любые другие символы в терминал идет те же самые "a" и "ь".

 

Выводите в терминал данные в hex либо dec формате, у вас сейчас стоит Ascii или Ansi.

Вот от сюда скачайте нормальный терминал: Serial Terminal: RealTerm

Тогда сможете оценить правильность.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну окей, поставил другую терминалку на прием в виде хекс данных выдает "00E01CFCFC1CFCFCFCFCE0FCFC00E0FC00E01CE01CE0FC1CE0FC1CE0FC" а должен по я так думаю выдавать "48 69 5F 77 6F 72 6C 64 ......." или я заблуждаюсь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну окей, поставил другую терминалку на прием в виде хекс данных выдает "00E01CFCFC1CFCFCFCFCE0FCFC00E0FC00E01CE01CE0FC1CE0FC1CE0FC" а должен по я так думаю выдавать "48 69 5F 77 6F 72 6C 64 ......." или я заблуждаюсь?

 

Если желаете COM порт потестировать через терминал, лучше сделать эхо сервер на отладочной плате. Передаете из терминала произвольный байт или строку, ловите байт в прерывании Rx и оправляете по Tx обратно. Начните с передачи/приема всего одного байта. Если передаете из контроллера в ПК буфер данных (не строку), то не нужно пользоваться функцией print. То, что Вы показываете, похоже больше на «абро-кадабру», рекомендую начать с приема/передачи всего одного байта, без использования строк и строковых функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Передаю FF получаю FC как так хрен знает.

int main(void)
{

        vUSART2_Init();

        USART_SendData(USART2, 0xFF);
        while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}

        return 0;
}

 

 

видимо как то криво затактирован usart. потыкал скорости в терминале при 38400 бод все заработало. будем разбираться.

 

52472912.jpg

Изменено пользователем mrcrook

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

видимо как то криво затактирован usart. потыкал скорости в терминале при 38400 бод все заработало. будем разбираться.

Чего тут думать, RCC ковыряй, да кварцы (источники частоты).

Изменено пользователем AndreyKar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

точно. даже после убирания питания, закорачивания всех ног на землю и ожидания 10 минут, jtag отвечает на команды, но дальше дело не идет, проц не видится дебаггером(jlink в том числе) и жрет раза в 2 больше тока,чем когда работает. уже 2 таких камня лежит

у меня примерно также было. не отвечал проц через дебаггер, после экспериментов с залочиванием.

каким-то образом установилась защита от чтения (глубже не разбирался)

решилось всё давольно просто - использованием штатного бутлоадера.

BOOT0 и RESET симулировал ручками: BOOT - 10кОм на 3В, RESET - передёргивание питания.

с помощью програмуль ничего не получилось, т.к. они хотят сами ресетом управлять и без этого никак

команды слал из терминала (скорость значения не имеет, 8E1):

0x7F - контроллер настраивает скорость обмена (ответ был 0x79)

зетем собственно сбрасываем защиту от чтения

0x92 0x6D (ответ 0x79 0x79)

собственно и всё!

после этого я спокойно залил программу через JTAG

так что может у тебя такая же проблема.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не установлены параметры: старт-бит, стоп-бит. не затактирован AFIO.

старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт.

 

насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт.

 

насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде.

AFIO нужен только если переназначаешь ноги перефирии на другие ноги проца,

если используются по умолчанию - то он вообще не нужен.

смотри внимательно настройку скорости обмена! там хитрый регистр BRR в котором старшие 12 бит мантисса (целое число), а младшие

4 бита - дробная часть. т.е. можно задавать делитель типа: 10.75 или 1200.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Reference manual в п.31.8.1 SW protocol introduction сказано: "For SWDIO bidirectional management, the line must be pulled-up on the board (100 KΩ

recommended by ARM)." Уж не знаю, как строго надо этого придерживаться, но я не его не ставлю (внутреннего хватает).

ЗЫ: народ, какие разъемы ставите на этот интерфейс?

 

А вот в RM008 сказано, (пункт 31.4.3)

 

"To avoid any uncontrolled I/O levels, the STM32F10xxx embeds internal pull-ups and pulldowns

on JTAG input pins:

● NJTRST: Internal pull-up

● JTDI: Internal pull-up

● JTMS/SWDIO: Internal pull-up

● TCK/SWCLK: Internal pull-down"

 

Этот резистор составляет ~30к ( ток ноги на землю 100мка)

 

Кажется внешний - излишен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написан PUTCHAR_PROTOTYPE, который по ITM посылает отладку в окно Debug (printf) Viewer в Keil. Можно ли как-то сделать, чтобы этот дебаг сразу логировался в файл?

Похоже что нет.

Я тоже сделал отладку в ITM согласно мануалу

#define itm_port8(n)    (*((volatile uint8_t *)(0xE0000000+4*(n))))
#define itm_port16(n)   (*((volatile uint16_t*)(0xE0000000+4*(n))))
#define itm_port32(n)   (*((volatile uint32_t*)(0xE0000000+4*(n))))
#define DEMCR           (*((volatile uint32_t*)(0xE000EDFC)))
#define TRCENA          0x01000000
//=========================================================================
#define dputchar(x)                     \
do                                     \
{                                      \
if (DEMCR & TRCENA)                \
{                                  \
   	while (itm_port32(0) == 0)     \
	{                              \
		;                          \
	}                              \
	                               \
    itm_port8(0) = (x);            \
}                                  \
}                                      \
while (0)

Включил TRACE в опциях отладчика согласно мануалу.

Включил ITM порт.

Но ничего не выходит. Виснет на while (itm_port32(0) == 0) {;}

Может отладчик не тот JLINK8, может он только с ULINK2 может?

Работает ли эта фишка при отладке по SWD (у меня подключены лишь SWDIO SWCLK и шьется и дебажится нормально, а вот с ITM никак)?

Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотри внимательно настройку скорости обмена! там хитрый регистр BRR в котором старшие 12 бит мантисса (целое число), а младшие

4 бита - дробная часть. т.е. можно задавать делитель типа: 10.75 или 1200.5

благодарю, все запустилось как надо.

    // Скорость 115.2 kbps. USARTDIV=FSYS(не частота процессора а частота порта)/(16*baud) = 42e6/(16*115200) = 22,75.
    USART2->BRR=(22<<4); // Целая часть коэффициента деления USART1.
    USART2->BRR|=12; // Дробная часть*16 = 0,75*16 = 12 (окр).

    USART_Cmd( USART2, ENABLE );

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

благодарю, все запустилось как надо.

    42e6/(16*115200) = 22,75
    USART2->BRR=(22<<4); // Целая часть коэффициента деления USART1.
    USART2->BRR|=12; // Дробная часть*16 = 0,75*16 = 12 (окр).

Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".

 

(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?

Имеем:

#define F_SYS          42000000UL
#define BAUDRATE   115200

    // USARTDIV=FSYS(не частота процессора а частота порта)/(16*baud)
    // USART_BRR = USARTDIV * 16
    USART2->BRR = F_SYS / BAUDRATE;

    USART_Cmd( USART2, ENABLE );

Одна запись в регистр. Не трогая калькулятор. И если скорость или частоту изменить понадобится - тоже калькулятор не понадобится, не говоря уже о том, чтобы внимательно просматривать весь исходник в поисках таких магических цифр как ваши 22 и 12.

 

Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".

+1. Тоже читал их опус про целую и дробную часть и дивился искусности МК-строителей, пока не осознал, что нужно тупо записать в регистр Fbus/BaudRate.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".

 

(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?

в данный момент было не особо важно, а вот за пояснение спасибо действительно более понятно и просто, чем какие то манипуляции с калькулятором.

Изменено пользователем mrcrook

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...