|
|
  |
STM32 – вопросы – проблемы - решения. |
|
|
|
Jan 31 2012, 17:52
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(mrcrook @ Jan 31 2012, 21:23)  в том то и дело, если передавать числа или любые другие символы в терминал идет те же самые "a" и "ь". Выводите в терминал данные в hex либо dec формате, у вас сейчас стоит Ascii или Ansi. Вот от сюда скачайте нормальный терминал: Serial Terminal: RealTermТогда сможете оценить правильность. На счет картинки, я имел ввиду что она слишком большая, хотя показываете всего одну строку.
--------------------
Magic Friend
|
|
|
|
|
Jan 31 2012, 18:27
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

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

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(mrcrook @ Jan 31 2012, 22:27)  ну окей, поставил другую терминалку на прием в виде хекс данных выдает "00E01CFCFC1CFCFCFCFCE0FCFC00E0FC00E01CE01CE0FC1CE0FC1CE0FC" а должен по я так думаю выдавать "48 69 5F 77 6F 72 6C 64 ......." или я заблуждаюсь? Если желаете COM порт потестировать через терминал, лучше сделать эхо сервер на отладочной плате. Передаете из терминала произвольный байт или строку, ловите байт в прерывании Rx и оправляете по Tx обратно. Начните с передачи/приема всего одного байта. Если передаете из контроллера в ПК буфер данных (не строку), то не нужно пользоваться функцией print. То, что Вы показываете, похоже больше на «абро-кадабру», рекомендую начать с приема/передачи всего одного байта, без использования строк и строковых функций.
--------------------
Magic Friend
|
|
|
|
|
Jan 31 2012, 19:09
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Передаю FF получаю FC как так хрен знает. Код int main(void) {
vUSART2_Init();
USART_SendData(USART2, 0xFF); while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}
return 0; } видимо как то криво затактирован usart. потыкал скорости в терминале при 38400 бод все заработало. будем разбираться.
Сообщение отредактировал mrcrook - Jan 31 2012, 19:10
|
|
|
|
|
Feb 1 2012, 04:47
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 17-01-07
Пользователь №: 24 508

|
Цитата(mrcrook @ Jan 31 2012, 22:09)  видимо как то криво затактирован usart. потыкал скорости в терминале при 38400 бод все заработало. будем разбираться. Чего тут думать, RCC ковыряй, да кварцы (источники частоты).
Сообщение отредактировал AndreyKar - Feb 1 2012, 04:48
|
|
|
|
|
Feb 1 2012, 05:11
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(brag @ Jun 9 2011, 13:40)  точно. даже после убирания питания, закорачивания всех ног на землю и ожидания 10 минут, jtag отвечает на команды, но дальше дело не идет, проц не видится дебаггером(jlink в том числе) и жрет раза в 2 больше тока,чем когда работает. уже 2 таких камня лежит у меня примерно также было. не отвечал проц через дебаггер, после экспериментов с залочиванием. каким-то образом установилась защита от чтения (глубже не разбирался) решилось всё давольно просто - использованием штатного бутлоадера. BOOT0 и RESET симулировал ручками: BOOT - 10кОм на 3В, RESET - передёргивание питания. с помощью програмуль ничего не получилось, т.к. они хотят сами ресетом управлять и без этого никак команды слал из терминала (скорость значения не имеет, 8E1): 0x7F - контроллер настраивает скорость обмена (ответ был 0x79) зетем собственно сбрасываем защиту от чтения 0x92 0x6D (ответ 0x79 0x79) собственно и всё! после этого я спокойно залил программу через JTAG так что может у тебя такая же проблема.
|
|
|
|
|
Feb 1 2012, 12:38
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Цитата(smalcom @ Feb 1 2012, 18:13)  не установлены параметры: старт-бит, стоп-бит. не затактирован AFIO. старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт. насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде.
|
|
|
|
|
Feb 2 2012, 03:57
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(mrcrook @ Feb 1 2012, 16:38)  старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт.
насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде. AFIO нужен только если переназначаешь ноги перефирии на другие ноги проца, если используются по умолчанию - то он вообще не нужен. смотри внимательно настройку скорости обмена! там хитрый регистр BRR в котором старшие 12 бит мантисса (целое число), а младшие 4 бита - дробная часть. т.е. можно задавать делитель типа: 10.75 или 1200.5
|
|
|
|
|
Feb 2 2012, 04:32
|

Знающий
   
Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499

|
Цитата(AndreyKar @ Jan 23 2012, 10:06)  В 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мка) Кажется внешний - излишен.
|
|
|
|
|
Feb 2 2012, 06:39
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ReRayne @ Jan 20 2012, 18:20)  Написан PUTCHAR_PROTOTYPE, который по ITM посылает отладку в окно Debug (printf) Viewer в Keil. Можно ли как-то сделать, чтобы этот дебаг сразу логировался в файл? Похоже что нет. Я тоже сделал отладку в ITM согласно мануалу CODE #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 никак)? Что не так?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 2 2012, 12:28
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Цитата(dezna @ Feb 2 2012, 09:57)  смотри внимательно настройку скорости обмена! там хитрый регистр 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 );
|
|
|
|
|
Feb 2 2012, 14:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (mrcrook @ Feb 2 2012, 14:28)  благодарю, все запустилось как надо. CODE 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. Мистика, не правда ли? Имеем: CODE #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. Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 2 2012, 16:04
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Цитата(Сергей Борщ @ Feb 2 2012, 20:26)  Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".
(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли? в данный момент было не особо важно, а вот за пояснение спасибо действительно более понятно и просто, чем какие то манипуляции с калькулятором.
Сообщение отредактировал mrcrook - Feb 2 2012, 16:04
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|