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

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

продолжаю не понимать, как работать в связке Eclipse и библиотек STM32, скачанных с официального сайта для отладочной платы STM32vldiscovery

что я делаю:

1. создаю мастером Eclipse проект, используя Yagarto toolchain, выбираю Cortex-M3. Ставлю галку для автоматической генерации makefile

2. в папку проекта копирую папку src, которая содержит исходник примера проги - пример из комплекта демок для платы, т.е. к нему вроде как претензий нет

3. в папку src копирую папки utilites (хидер и исходник поддержки отладочной платы STM32vldiscovery) и папку STM32F10x_StdPeriph_Driver, которая содержит две папки inс и src с соответствующими файлами описаний периферии.

4. в свойствах проекта компилятору прописываю Include Directories:

src

src\utilites

src\STM32F10x_StdPeriph_Driver\inc

src\STM32F10x_StdPeriph_Driver\src

5. Определяю символы (-D) USE_STM32_DISCOVERY и STM3210X_LD_VL, чтобы правильно работала условная компиляция

6. запускаю Build

 

и в результате я получаю ошибки при компиляции src\utilites\STM32vldiscovery.c, причем пишет, что не определен GPIO_Pin_9 и т.п. странные вещи - парсер Eclipse находит эти символы в файле src\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.h - а компилятор не находит!!!

 

подскажите, что я делаю не так?

 

P.S. как ни странно, я сумел запустить в Eclipse отладку через ST-Link - то есть свою отладочную платку, правда, на заранее собранном в Atollic True Studio проекте, а вот собрать тот же самый проект в Eclipse не получается... туплю неподецки...

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


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

Если смотреть "STM32VLDISCOVERY firmware package (AN3268)"...

3. в папку src копирую папки utilites (хидер и исходник поддержки отладочной платы STM32vldiscovery) и папку STM32F10x_StdPeriph_Driver, которая содержит две папки inс и src с соответствующими файлами описаний периферии.

А папка CMSIS скопирована?

 

4. в свойствах проекта компилятору прописываю Include Directories:

src

src\utilites

src\STM32F10x_StdPeriph_Driver\inc

src\STM32F10x_StdPeriph_Driver\src

А еще надо

CMSIS\CM3\CoreSupport

CMSIS\CM3\DeviceSupport\ST\STM32F10x <- тут stm32f10x.h

По идее, без этих путей компилятор должен был ругаться в первую очередь на отсутсвие stm32f10x.h

 

5. Определяю символы (-D) USE_STM32_DISCOVERY и STM3210X_LD_VL, чтобы правильно работала условная компиляция

Вообще надо определять USE_STDPERIPH_DRIVER, т.к. в stm32f10x.h

#ifdef USE_STDPERIPH_DRIVER
  #include "stm32f10x_conf.h"
#endif

А в stm32f10x_conf.h (в каждом проекте свой) должны быть соотв. include, в частности stm32f10x_gpio.h, в котором определены GPIO_Pin_X и т.п.

Это касается использования stm-вской библиотеки вообще.

Что делает USE_STM32_DISCOVERY я не понял, ни в одном файле не нашел этого символа.

И кстати, дискавери - STM32F10X_MD_VL (LD - 16/32 КБ флеша, меньше периферии).

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


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

Вообще надо определять USE_STDPERIPH_DRIVER

вот где собака порылась! :08: спасибо!

 

однако, радость оказалась преждевременной... скомпилировались все файлы успешно, без ошибок и варнингов, но при линковке вылезло вот это:

c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.0/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000
что-то это мне крайне не нравится... что я опять упустил?

 

P.S. не понял, что делать с ассемблерными файлами startup_xxxxxx.s - похоже, проблема в том, что они не компилируются...

P.P.S. добавил ключики для удаления неиспользуемых секций, и получил вообще красивый итог:

Invoking: ARM Yagarto Windows GNU Print Size

arm-none-eabi-size --format=berkeley test3.elf

text data bss dec hex filename

0 0 0 0 0 test3.elf

в общем, понятно - _start не определен, main не вызывается... но почему?!

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


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

Столкнулся со странной проблемой при использовании IAR EWARM v6.10.5 совместно с ST-LINK. Для STM32F103R6T6A (32K flash, 6K RAM) было написано уже 15К кода, проект близится к завершению, отлаживался во flash. Вдруг иаровский дефолтный flash loader перестает грузится в MCU или сообщает об ошибке. Через ST-LINK utulity все нормально прошивается. Странно то, что дело как бы не в настройках проекта, т. к. я их не менял, и содержимое main то же самое прошивалось раньше нормально, а теперь перестало. Перепробовал наверное все что можно, но причину так и не удалось определить. Чаще всего помогает команда erase sectors в ST-LINK utulity v2.0, сегодня случайно проделал то, что выглядит странно, но тоже помогло:

1. При "отказе" flash loader'а выключаем (снимаем галку) в output converter (настройки проекта)

2. Перекомпилируем проект

3. Пробуем грузить в кристалл (грузится нормально)

4. Включаем (ставим галку) в output converter (настройки проекта)

5. Убеждаемся, что грузится нормально.

И вот эти пляски периодически повторяются. У меня вопрос: были ли подобные проблемы у кого-нибудь? Как решили?

Иногда вылетает еще вот такая ошибка:

post-1807-1303662247_thumb.jpg

 

Второе. Никак не пойму, почему ST-LINK utulity v2.0 для указанного кристалла при попытке программирования пишет, что некоторые СЕКТОРЫ flash защищены от записи? Ведь в ее настройках в option bytes в разделе write protection сняты все 32 галки, т. е. защита от записи перманентно снята для всех страниц, всей флеши. Или я что-то упускаю?

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


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

Проверьте пины BOOT проца.

Да вроде все в норме: UARTовский загрузчик запускается при правильной комбинации. При комбинации "все нули" UARTовский загрузчик не запускается. Записанная через него (или ST-Link) программа нет.

Проц - 103VG

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


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

рискну в очередной раз потревожить уважаемое сообщество.

я победил-таки свою тупость и смог скомпилировать в Eclipse Helios проект для демо-платки STM32vldiscovery, правда, пришлось совершать "странные" манипуляции.

теперь у меня новая беда: отладка... у меня есть stm32-gdb-server именно для моей отладочной платы, он работает. даже удается законнектить его с arm-none-eabi-gdb при помощи плугина Eclipse... но при этом в микроконтроллер не заливается прошивка :(

по идее должна быть возможность увидеть команды, которыми gdb общается с сервером - я их не вижу и не могу понять, как это включить. так как я не вижу обмена, я не понимаю, почему не загружается программа. поиск в сети не дал ничего полезного: все или J-Link используют, или OpenOCD... пытался составить скрипт инициализации gdb - выдает в каждой строке с командой monitor ошибку - дескать, не поддерживается команда...

 

собственно, мне нужно как-то заставить gdb залить прошивку в МК - остальное будет работать (я в этом уверен, т.к. до того, как я стер демо-прошивку, она вполне прилично отлаживалась, т.е. пошаговое выполнение шло и т.п.).

 

помогите, кто понимает, в чем дело....

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


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

Очень огорчило:

In the STM32F10xxx both peripheral registers and SRAM are mapped in a bit-band region.

This allows single bit-band write and read operations to be performed. The operations are

only available for Cortex-M3 accesses, not from other bus masters (e.g. DMA).

 

Т.е. "натравить" DMA на bit-band SRAM не получится(

А счастье было так близко...

 

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


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

Т.е. "натравить" DMA на bit-band SRAM не получится(

А счастье было так близко...

Ну так ведь можно напрямую к памяти обращаться не через bit-band remap.

Или Вы хотели побитный атомарный доступ организовать? Интересно для чего?

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


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

Ну так ведь можно напрямую к памяти обращаться не через bit-band remap.

Или Вы хотели побитный атомарный доступ организовать? Интересно для чего?

 

Анализирую исправность CAN-шины.

Выключаем CAN-контроллер и управляем ногами TX и RX через GPIO.

Непрерывно выдаю в линию TX поток из 32 битовых кадров, соответствующих уникальному идентификатору устройства:

0111 - если соответствующий бит идентификатора равен 0;

0011 - если соответствующий бит идентификатора равен 1;

После выдачи бита на ногу TX через половину битового интервала читаю ногу RX.

Если число переданных нулей равно числу принятых, то на шине нет других устройств или обрыв.

Если все биты 1, то на шине КЗ.

Если все биты 0, то включен передатчик с доминантным битом (ошибка).

Если нулей передали меньше, чем приняли, то шина исправна и есть другие устройства - включаем CAN-контроллер.

Далее, штатная работа CAN-контроллера, до следующей потери линка (отсутствие синхронизирующих пакетов в течение определенного времени).

 

Так вот, дрыгать ногами нужно быстро (прерывание каждые 62 мкс) - примененная PHY-CAN ограничивает длительность доминантного бита при передаче.

 

Хотел сформировать битовый массив (размером 128 бит), настроить DMA на запись слова из памяти bit-band для этого массива с инкрементом по кольцу в bit-band для GPIO TX_bit по DMA-запросу от канала сравнения таймера. Аналогичная процедура для приема битов.

Без DMA все работает, но копирование произвожу в прерывании таймера.

Сейчас сделал не через битовый массив - пришлось выделить не 4 слова под биты на передачу, а 128.

 

Для справки:

- старый вариант каждые 62 мкс вызывал прерывание на порядка 300 - 400 тактов;

- вариант через bit-band и прерывание таймера - в 10 раз меньше;

- через DMA - прерывание один раз на все 128 переданных-принятых бит.

 

Где-то так.

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


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

Анализирую исправность CAN-шины... Где-то так.
Идея была хороша.

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


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

Идея была хороша.

 

Сделал через таймер, DMA и не bit-band память.

Раз в 16мс обрабатываю прерывание за 22мкс (CPU LOAD = 0.14% вместо 10%).

Меня устраивает)

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


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

Люди добрые. Мне нужно сделать таймер с помощью IWDG на плате stm32f103cb. Мне нужно запускать таймер и постоянно проверить флаги. Если таймаут сделать какая-то операция. Кто нибудь сталкивался с этим? Пробовал с таким методом:

 

void IWDG_init(void){

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

IWDG_SetPrescaler(IWDG_Prescaler_256);

IWDG_SetReload(199); //ну мне хотя бы 3 секунда

IWDG_ReloadCounter();

IWDG_Enable();

}

 

и в любом месте я проверяю флаг таймера

 

while(1){

if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!=RESET){

printf("there was a watchdog reset\n\b");

IWDG->KR = 0xAAAA; // Релоад таймера

RCC->CSR |= (1<<24);

} else printf("\n\nKeep going on...");

}

 

но во время таймаута он сбрасывает процессор.

 

Уважаемые гуру, помогите пожалйста. Правдо-говоря я новычок. Гугл не предложите пожалуйста.

 

Извините меня, по нации я не русский. Поэтому извиняюсь за плохой русский.

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


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

Зачем IWDG? используйте для таймаутов любой обычный таймер - TIMx. А собаке оставьте собачью работу - сбрасывать процессор, если всё повисло.

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


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

Гость Entuziast

Помогите пожалуйста примером кода простого таймера на TIM6 или другом для STM32F103VC. Чтобы задать таймаут и по истечении попасть в обработчик прерывания.

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


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

I2S в режиме Slave PCM в STM32F105 либо вообще ложит болт на FrameSync, либо я туплю. что long frame sync, что short.

данные нормально принимаются, но frame sync игнорируется. тоесть, если частота sclk, скажем 32xFS, то и получим в итоге частоту частоту 16битных семплов 2xFS... садил frame sync на землю - тоже данные принимаются. в конкретном проеkte решил установив sclk в 16xFS (благо,мастер такое умеет)

Данные идут через DMA.

код инициализации:

    spi->CR1=0;
    spi->I2SCFGR=0;
    
    spi->I2SCFGR=SPI_I2SCFGR_I2SMOD;
    spi->I2SCFGR|=SPI_I2SCFGR_I2SCFG_SR|SPI_I2SCFGR_I2SSTD_PCM|SPI_I2SCFGR_PCMSYNC|SP
I_I2SCFGR_DATLEN_16;
    spi->I2SCFGR|=SPI_I2SCFGR_I2SE;
    
    spi->CR2=SPI_CR2_TXDMAEN|SPI_CR2_RXDMAEN;

запуск dma как обычно

DMA1_Channel4->CPAR=(U32)&spi->DR;
    DMA1_Channel4->CMAR=(U32)src;
    DMA1_Channel4->CNDTR=count;
       DMA1_Channel4->CCR=DMA_CCR_MSIZE_16|DMA_CCR_PSIZE_16|DMA_CCR_MINC//|DMA_CCR_DIR
           |DMA_CCR_TEIE|DMA_CCR_TCIE|DMA_CCR_HTIE|DMA_CCR_CIRC;
    DMA1_Channel4->CCR|=DMA_CCR_EN;

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


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

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