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

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

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

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


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

В цельнотянутом из 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.

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


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

Гугл в помощь.
Видать гугл у меня неправильный:

post-17095-1325525380_thumb.png

Если "повторить поиск, включив опущенные результаты", то будет 3 таких же результата. Странно, что из дома дает 2 и 8 страниц ссылок, но содержание примерно такое же.

 

 

Вот тут есть правдоподобное объяснение:
Спасибо. То есть поскольку в таблице находится не команда перехода, а абсолютный адрес, то отладчику непонятно, с какого адреса начинать выполнение. Поэтому добавляется фиктивная команда перехода по адресу из вектора сброса. Адрес этой команды известен и можно натравливать отладчик на эту команду. Сомнительное решение, учитывая что MSP из таблицы таким образом не инициализируется, только вручную в коде повторять то, что при нормальном запуске проц делает сам. Можно оба действия сделать в скрипте отладчика... Впрочем, отладчики бывают разные.

Но получается, что конкретно код 0xF1E0F85F будет работать с таблицей размером 480/4 = 120 векторов, а для таблиц другого размера код должен будет быть другим... Присмотрелся - действительно, код для таблиц разных семейств отличается, встречаются и ошибки копипаста:

    (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 не упоминается, отсюда и непонятки возникли.

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


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

Народ, чего-то я совсем запутался(.

Подскажите про 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

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


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

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

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


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

Доброго времени суток. Собрал свою платку на STM32F103R6. И она не заработала, хотя предыдущая аналогичная плата работала. Нет связи по SWD. J-Flash ARM ведет себя так, как будто ничего не подключено кроме Target Vdd. И возник вопрос - какие условия необходимо соблюсти по минимому, чтобы какмень определился по SWD? Ну понятно подключить все Vdd, Vss, подключить к отладчику SWDIO, SWDCLK, Vdd Target, землю. Кварц вроде необязателен, но если он подключен и неисправен то проблема возникнет? Что еще должно быть обязательно подключено?

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


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

У меня STM32F217 подключен по SWD к плате stm32vldiscovery. 4 провода: GND, Vcc, SWDclk, SWDio.

В обвязке процессора: питание 3V с конденсаторами 0,1mf на каждом пине питания, и подтягивающий резистор 10к на Reset (хоть в даташите и указан встроенный подтягивающий резистор на Reset - но на всякий случай поставил внешний).

Кварц не используется. На ножке BOOT0 - GND.

Больше никаких навесок и подключений на процессоре не делал. Программа ST-LINK_Utility нормально определяет процессор, так-же быстро как и установленный на stm32vldiscovery STM32F100.

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


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

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

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


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

В 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

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


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

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

 

 

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

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


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

Доброго времени суток. Собрал свою платку на STM32F103R6. И она не заработала, хотя предыдущая аналогичная плата работала. Нет связи по SWD. J-Flash ARM ведет себя так, как будто ничего не подключено кроме Target Vdd. И возник вопрос - какие условия необходимо соблюсти по минимому, чтобы какмень определился по SWD? Ну понятно подключить все Vdd, Vss, подключить к отладчику SWDIO, SWDCLK, Vdd Target, землю. Кварц вроде необязателен, но если он подключен и неисправен то проблема возникнет? Что еще должно быть обязательно подключено?

Вобщем выпаял контроллер из платы и на весу распаял ножки VDD, VSS, VDDA, VSSA, SWDIO, SWCLK. Сеггеровские утилиты распознали камень без всяких прелюдий. После запаивания процессора обратно в плату с отключенной уже периферией, связь опять пропала. Вскоре слетела еще и прошивка клона J-Linka и на этом эксперименты кончились.

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


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

Ковыряю STM32F4 DISCOVERY, пытаюсь наладить работу USART. Но столкнулся с проблемой.

Отправляю "Hi_world!!!/r/n", а выдает такую картинку

 

66629893.jpg

#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

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


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

Помогите разобраться в чем может быть дело. Проблемы с преобразователем интерфейсов uart-rs232 и настройки порта на компе можно исключить. так как демо проект работает нормально.

 

Кодировки строк могут отличаться, попробуйте передавать просто числа.

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

Картинку с терминалом отредактируйте. У вас одна строка на весь экран.

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


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

Кодировки строк могут отличаться, попробуйте передавать просто числа.

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

Картинку с терминалом отредактируйте. У вас одна строка на весь экран.

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

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

насчет картинки не понял о чем речь.

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

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


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

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