реклама на сайте
подробности

 
 
33 страниц V  « < 21 22 23 24 25 > »   
Closed TopicStart new topic
> STM32 – вопросы – проблемы - решения.
Сергей Борщ
сообщение Jan 2 2012, 12:19
Сообщение #331


Гуру
******

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



В цельнотянутом из scmRTOS файле startup.c в описании таблиц векторов последним словом в таблице (фактически, оно попадает на первое слово за таблицей) встречается магическое число (intfunc)0xF1E0F85F. Поиск в гугле показывает, что это число широко используется в стартапе stm32, но нигде нет ни единого упоминания - что это за число и нафига его туда вставили?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 2 2012, 15:07
Сообщение #332


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 2 2012, 17:51
Сообщение #333


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 2 2012, 18:09
Сообщение #334


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Jan 2 2012, 21:51) *
Видать гугл у меня неправильный:

"Вы просто не умеете его готовить" :-)
Тыц

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
AndreyKar
сообщение Jan 13 2012, 06:38
Сообщение #335


Участник
*

Группа: Участник
Сообщений: 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 на 0x22000000

Есть ещё один файл *.с:
Код
#include "main.h"

void Test(){
    Task.bTime0 = 0;
}

И вот в этой ф-ции начинаются траблы: адресация Task.bTime0 на 0x20000000((
Как это победить?

ЗЫ: Среда Keil 4.23


Всё, разобрался)). Надо было в *.h файле экстерн прописывать вместе с адресом:
extern DispatcherTask Task __attribute__((at(0x20000000)));
Почему вдруг так - загадка?

Сообщение отредактировал AndreyKar - Jan 13 2012, 06:55
Go to the top of the page
 
+Quote Post
ReRayne
сообщение Jan 20 2012, 15:20
Сообщение #336


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 12-10-11
Из: Москва
Пользователь №: 67 699



Написан PUTCHAR_PROTOTYPE, который по ITM посылает отладку в окно Debug (printf) Viewer в Keil. Можно ли как-то сделать, чтобы этот дебаг сразу логировался в файл?
Go to the top of the page
 
+Quote Post
lexatagan
сообщение Jan 22 2012, 11:37
Сообщение #337





Группа: Новичок
Сообщений: 7
Регистрация: 18-01-10
Пользователь №: 54 892



Доброго времени суток. Собрал свою платку на STM32F103R6. И она не заработала, хотя предыдущая аналогичная плата работала. Нет связи по SWD. J-Flash ARM ведет себя так, как будто ничего не подключено кроме Target Vdd. И возник вопрос - какие условия необходимо соблюсти по минимому, чтобы какмень определился по SWD? Ну понятно подключить все Vdd, Vss, подключить к отладчику SWDIO, SWDCLK, Vdd Target, землю. Кварц вроде необязателен, но если он подключен и неисправен то проблема возникнет? Что еще должно быть обязательно подключено?
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Jan 22 2012, 12:10
Сообщение #338


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



У меня STM32F217 подключен по SWD к плате stm32vldiscovery. 4 провода: GND, Vcc, SWDclk, SWDio.
В обвязке процессора: питание 3V с конденсаторами 0,1mf на каждом пине питания, и подтягивающий резистор 10к на Reset (хоть в даташите и указан встроенный подтягивающий резистор на Reset - но на всякий случай поставил внешний).
Кварц не используется. На ножке BOOT0 - GND.
Больше никаких навесок и подключений на процессоре не делал. Программа ST-LINK_Utility нормально определяет процессор, так-же быстро как и установленный на stm32vldiscovery STM32F100.
Go to the top of the page
 
+Quote Post
lexatagan
сообщение Jan 22 2012, 13:38
Сообщение #339





Группа: Новичок
Сообщений: 7
Регистрация: 18-01-10
Пользователь №: 54 892



У меня аналогично все подключено, только кварц внешний, и периферия разная еще - LCD, RS485 приемник... Плата самодельная, так что конечно возможны соплии или непропаи, но все важные пины я проверил. Интересно, что предыдущую версию платы я не смог подключить по JTAG, после чего перешел на SWD, после чего проблем не наблюдалось. А вот эта версия заточена уже под SWD, но не работает.
Go to the top of the page
 
+Quote Post
AndreyKar
сообщение Jan 23 2012, 06:06
Сообщение #340


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Danis
сообщение Jan 23 2012, 08:10
Сообщение #341


Twilight Zone
***

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



Цитата(AndreyKar @ Jan 23 2012, 10:06) *
ЗЫ: народ, какие разъемы ставите на этот интерфейс?



Для программирования хватает 4-ре металлизированных отверстия на печатной плате |*...* * * |, с шагом 2,54. Одно пропущено, чтоб программатор зеркально не сконнектить. Для отладки запаиваю туда PLS-5 вилку, с отсутствующим (2-м пином).


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
lexatagan
сообщение Jan 23 2012, 16:52
Сообщение #342





Группа: Новичок
Сообщений: 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 и на этом эксперименты кончились.
Go to the top of the page
 
+Quote Post
mrcrook
сообщение Jan 31 2012, 15:24
Сообщение #343





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Danis
сообщение Jan 31 2012, 16:50
Сообщение #344


Twilight Zone
***

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



Цитата(mrcrook @ Jan 31 2012, 18:24) *
Помогите разобраться в чем может быть дело. Проблемы с преобразователем интерфейсов uart-rs232 и настройки порта на компе можно исключить. так как демо проект работает нормально.


Кодировки строк могут отличаться, попробуйте передавать просто числа.
Скорости принимающей и передающей стороны должны быть одинаковые. Проконтролируйте это.
Картинку с терминалом отредактируйте. У вас одна строка на весь экран.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
mrcrook
сообщение Jan 31 2012, 17:23
Сообщение #345





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



Цитата
Кодировки строк могут отличаться, попробуйте передавать просто числа.
Скорости принимающей и передающей стороны должны быть одинаковые. Проконтролируйте это.
Картинку с терминалом отредактируйте. У вас одна строка на весь экран.

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

Сообщение отредактировал mrcrook - Jan 31 2012, 17:24
Go to the top of the page
 
+Quote Post

33 страниц V  « < 21 22 23 24 25 > » 
Closed TopicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016