|
|
  |
STM32 – вопросы – проблемы - решения. |
|
|
|
Jan 2 2012, 15:07
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Сергей Борщ @ Jan 2 2012, 16:19)  В цельнотянутом из scmRTOS файле startup.c в описании таблиц векторов последним словом в таблице (фактически, оно попадает на первое слово за таблицей) встречается магическое число (intfunc)0xF1E0F85F. Поиск в гугле показывает, что это число широко используется в стартапе stm32, но нигде нет ни единого упоминания - что это за число и нафига его туда вставили? Гугл в помощь. Вот тут есть правдоподобное объяснение: Цитата When you boot from RAM (via the BOOTx pins) the execution address is fixed (processor dependent), and not pulled from the +4 vector address.
As I recall the hex code placed by GCC effectively calls the correct address.
000001E0 F85F F1E0 ldr.w pc, [pc, #-480] ; $000004
This behaviour has been discussed on the forum before, but I don't remember seeing any explicit documentation. It suggests the processor is running something else first, but without some hardware trace it's hard to tell what.
|
|
|
|
|
Jan 2 2012, 17:51
|

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

|
QUOTE (scifi @ Jan 2 2012, 17:07)  Гугл в помощь. Видать гугл у меня неправильный:
Если "повторить поиск, включив опущенные результаты", то будет 3 таких же результата. Странно, что из дома дает 2 и 8 страниц ссылок, но содержание примерно такое же. QUOTE (scifi @ Jan 2 2012, 17:07)  Вот тут есть правдоподобное объяснение: Спасибо. То есть поскольку в таблице находится не команда перехода, а абсолютный адрес, то отладчику непонятно, с какого адреса начинать выполнение. Поэтому добавляется фиктивная команда перехода по адресу из вектора сброса. Адрес этой команды известен и можно натравливать отладчик на эту команду. Сомнительное решение, учитывая что MSP из таблицы таким образом не инициализируется, только вручную в коде повторять то, что при нормальном запуске проц делает сам. Можно оба действия сделать в скрипте отладчика... Впрочем, отладчики бывают разные. Но получается, что конкретно код 0xF1E0F85F будет работать с таблицей размером 480/4 = 120 векторов, а для таблиц другого размера код должен будет быть другим... Присмотрелся - действительно, код для таблиц разных семейств отличается, встречаются и ошибки копипаста: CODE (intfunc)0xF108F85F /* @0x01CC */ <---------- #elif defined(STM32F10X_HD_VL) 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0 (intfunc)0xF108F85F /* @0x1E0 */ <--------- #elif defined(STM32F10X_HD) || defined(STM32F10X_XL) 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, (intfunc)0xF1E0F85F /* @0x1E0 */ Понятно, почему дома получал другое количество результатов - вероятно, искал по коду для другого семейства. Теперь мучает другой вопрос: для чего они "добивают" таблицу нулями до размера, явно большего описанной в даташитах таблицы? А... кажется понял: "the execution address is fixed (processor dependent)". Вот чтобы попасть в этот адрес и добавляются лишние нули. Вычеркиваю. Проще сбросить проц. P.S. В Ref. Manual-е от STM32F100x про этот fixed execution address не упоминается, отсюда и непонятки возникли.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 13 2012, 06:38
|
Участник

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

|
Народ, чего-то я совсем запутался(. Подскажите про bit-band и extern. Создаю main.h файл со структурой bit-band: Код typedef struct { unsigned bTime0 : 1; }DispatcherTask __attribute__((bitband));
extern DispatcherTask Task; Главный файл с мейн такой: Код DispatcherTask Task __attribute__((at(0x20000000))); extern void Test(void);
int main(void){ Task.bTime0 = 0; Test(); } в нем все работает правильно, т.е. адресация Task.bTime0 на 0x2 2000000 Есть ещё один файл *.с: Код #include "main.h"
void Test(){ Task.bTime0 = 0; } И вот в этой ф-ции начинаются траблы: адресация Task.bTime0 на 0x2 0000000(( Как это победить? ЗЫ: Среда Keil 4.23 Всё, разобрался)). Надо было в *.h файле экстерн прописывать вместе с адресом: extern DispatcherTask Task __attribute__((at(0x20000000))); Почему вдруг так - загадка?
Сообщение отредактировал AndreyKar - Jan 13 2012, 06:55
|
|
|
|
|
Jan 22 2012, 11:37
|
Группа: Новичок
Сообщений: 7
Регистрация: 18-01-10
Пользователь №: 54 892

|
Доброго времени суток. Собрал свою платку на STM32F103R6. И она не заработала, хотя предыдущая аналогичная плата работала. Нет связи по SWD. J-Flash ARM ведет себя так, как будто ничего не подключено кроме Target Vdd. И возник вопрос - какие условия необходимо соблюсти по минимому, чтобы какмень определился по SWD? Ну понятно подключить все Vdd, Vss, подключить к отладчику SWDIO, SWDCLK, Vdd Target, землю. Кварц вроде необязателен, но если он подключен и неисправен то проблема возникнет? Что еще должно быть обязательно подключено?
|
|
|
|
|
Jan 22 2012, 13:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 18-01-10
Пользователь №: 54 892

|
У меня аналогично все подключено, только кварц внешний, и периферия разная еще - LCD, RS485 приемник... Плата самодельная, так что конечно возможны соплии или непропаи, но все важные пины я проверил. Интересно, что предыдущую версию платы я не смог подключить по JTAG, после чего перешел на SWD, после чего проблем не наблюдалось. А вот эта версия заточена уже под SWD, но не работает.
|
|
|
|
|
Jan 23 2012, 06:06
|
Участник

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

|
В 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)." Уж не знаю, как строго надо этого придерживаться, но я не его не ставлю (внутреннего хватает). ЗЫ: народ, какие разъемы ставите на этот интерфейс?
Сообщение отредактировал AndreyKar - Jan 23 2012, 06:28
|
|
|
|
|
Jan 23 2012, 08:10
|

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

|
Цитата(AndreyKar @ Jan 23 2012, 10:06)  ЗЫ: народ, какие разъемы ставите на этот интерфейс? Для программирования хватает 4-ре металлизированных отверстия на печатной плате |*...* * * |, с шагом 2,54. Одно пропущено, чтоб программатор зеркально не сконнектить. Для отладки запаиваю туда PLS-5 вилку, с отсутствующим (2-м пином).
--------------------
Magic Friend
|
|
|
|
|
Jan 23 2012, 16:52
|
Группа: Новичок
Сообщений: 7
Регистрация: 18-01-10
Пользователь №: 54 892

|
Цитата(lexatagan @ Jan 22 2012, 14:37)  Доброго времени суток. Собрал свою платку на STM32F103R6. И она не заработала, хотя предыдущая аналогичная плата работала. Нет связи по SWD. J-Flash ARM ведет себя так, как будто ничего не подключено кроме Target Vdd. И возник вопрос - какие условия необходимо соблюсти по минимому, чтобы какмень определился по SWD? Ну понятно подключить все Vdd, Vss, подключить к отладчику SWDIO, SWDCLK, Vdd Target, землю. Кварц вроде необязателен, но если он подключен и неисправен то проблема возникнет? Что еще должно быть обязательно подключено? Вобщем выпаял контроллер из платы и на весу распаял ножки VDD, VSS, VDDA, VSSA, SWDIO, SWCLK. Сеггеровские утилиты распознали камень без всяких прелюдий. После запаивания процессора обратно в плату с отключенной уже периферией, связь опять пропала. Вскоре слетела еще и прошивка клона J-Linka и на этом эксперименты кончились.
|
|
|
|
|
Jan 31 2012, 15:24
|

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

|
Ковыряю STM32F4 DISCOVERY, пытаюсь наладить работу USART. Но столкнулся с проблемой. Отправляю "Hi_world!!!/r/n", а выдает такую картинку  Код #include "stm32f4xx.h" uint8_t CHAR_ID;
void vUSART2_Init( void ) { USART_ClockInitTypeDef USART_ClockInitStruct; USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
// Enable needed clocks for uart. RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE ); RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE );
// Make sure you use 'GPIO_PinSource2' and NOT 'GPIO_Pin_2'. Using the // latter will not work! GPIO_PinAFConfig( GPIOA, GPIO_PinSource2, GPIO_AF_USART2 ); //GPIO_PinAFConfig( GPIOA, GPIO_PinSource3, GPIO_AF_USART2 );
// Setup Tx / Rx pins. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // Tx Pin GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init( GPIOA, &GPIO_InitStructure ); //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // Rx Pin //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //GPIO_Init( GPIOA, &GPIO_InitStructure );
// Make sure syncro clock is turned off. USART_ClockStructInit( &USART_ClockInitStruct ); USART_ClockInit( USART2, &USART_ClockInitStruct );
// Setup transmit complete irq. //USART_ITConfig( USART2, USART_IT_TC, ENABLE );
// Use defaults (except baud rate). USART_StructInit( &USART_InitStructure ); USART_InitStructure.USART_BaudRate = 115200; USART_Init( USART2, &USART_InitStructure );
USART_Cmd( USART2, ENABLE );
/*NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);*/ }
void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); }
void print(const char* str) { int i = 0; while(str[i]) { USART_SendData(USART2, (uint8_t) str[i]); CHAR_ID = str[i]; i++; while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {} } }
int main(void) {
vUSART2_Init();
print("Hi_world!!!/r/n"); while(1) { ;; } } Помогите разобраться в чем может быть дело. Проблемы с преобразователем интерфейсов uart-rs232 и настройки порта на компе можно исключить. так как демо проект работает нормально.
Сообщение отредактировал mrcrook - Jan 31 2012, 15:27
|
|
|
|
|
Jan 31 2012, 16:50
|

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

|
Цитата(mrcrook @ Jan 31 2012, 18:24)  Помогите разобраться в чем может быть дело. Проблемы с преобразователем интерфейсов uart-rs232 и настройки порта на компе можно исключить. так как демо проект работает нормально. Кодировки строк могут отличаться, попробуйте передавать просто числа. Скорости принимающей и передающей стороны должны быть одинаковые. Проконтролируйте это. Картинку с терминалом отредактируйте. У вас одна строка на весь экран.
--------------------
Magic Friend
|
|
|
|
|
Jan 31 2012, 17:23
|

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

|
Цитата Кодировки строк могут отличаться, попробуйте передавать просто числа. Скорости принимающей и передающей стороны должны быть одинаковые. Проконтролируйте это. Картинку с терминалом отредактируйте. У вас одна строка на весь экран. в том то и дело, если передавать числа или любые другие символы в терминал идет те же самые "a" и "ь". мк должен передавать данные на скорости 115200 бод согласно инициализации, в компе соотв настроено тоже 115200. Частотомера под рукой нет, в живую законтролить не могу. насчет картинки не понял о чем речь.
Сообщение отредактировал mrcrook - Jan 31 2012, 17:24
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|