|
STM32 – вопросы – проблемы - решения. |
|
|
|
 |
Ответов
(150 - 164)
|
Apr 23 2011, 16:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
продолжаю не понимать, как работать в связке 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 не получается... туплю неподецки...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 23 2011, 19:26
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073

|
Если смотреть "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 я не понял, ни в одном файле не нашел этого символа. И кстати, дискавери - STM32 F10X_ MD_VL (LD - 16/32 КБ флеша, меньше периферии).
|
|
|
|
|
Apr 24 2011, 05:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(akimych @ Apr 23 2011, 23:26)  Вообще надо определять USE_STDPERIPH_DRIVER вот где собака порылась!  спасибо! однако, радость оказалась преждевременной... скомпилировались все файлы успешно, без ошибок и варнингов, но при линковке вылезло вот это: Цитата 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 не вызывается... но почему?!
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 24 2011, 16:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Столкнулся со странной проблемой при использовании 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. Убеждаемся, что грузится нормально. И вот эти пляски периодически повторяются. У меня вопрос: были ли подобные проблемы у кого-нибудь? Как решили? Иногда вылетает еще вот такая ошибка:
Второе. Никак не пойму, почему ST-LINK utulity v2.0 для указанного кристалла при попытке программирования пишет, что некоторые СЕКТОРЫ flash защищены от записи? Ведь в ее настройках в option bytes в разделе write protection сняты все 32 галки, т. е. защита от записи перманентно снята для всех страниц, всей флеши. Или я что-то упускаю?
|
|
|
|
|
Apr 25 2011, 04:12
|
Частый гость
 
Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334

|
Цитата(Danis @ Apr 23 2011, 19:40)  Проверьте пины BOOT проца. Да вроде все в норме: UARTовский загрузчик запускается при правильной комбинации. При комбинации "все нули" UARTовский загрузчик не запускается. Записанная через него (или ST-Link) программа нет. Проц - 103VG
|
|
|
|
|
Apr 27 2011, 20:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
рискну в очередной раз потревожить уважаемое сообщество. я победил-таки свою тупость и смог скомпилировать в Eclipse Helios проект для демо-платки STM32vldiscovery, правда, пришлось совершать "странные" манипуляции. теперь у меня новая беда: отладка... у меня есть stm32-gdb-server именно для моей отладочной платы, он работает. даже удается законнектить его с arm-none-eabi-gdb при помощи плугина Eclipse... но при этом в микроконтроллер не заливается прошивка  по идее должна быть возможность увидеть команды, которыми gdb общается с сервером - я их не вижу и не могу понять, как это включить. так как я не вижу обмена, я не понимаю, почему не загружается программа. поиск в сети не дал ничего полезного: все или J-Link используют, или OpenOCD... пытался составить скрипт инициализации gdb - выдает в каждой строке с командой monitor ошибку - дескать, не поддерживается команда... собственно, мне нужно как-то заставить gdb залить прошивку в МК - остальное будет работать (я в этом уверен, т.к. до того, как я стер демо-прошивку, она вполне прилично отлаживалась, т.е. пошаговое выполнение шло и т.п.). помогите, кто понимает, в чем дело....
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
May 19 2011, 05:20
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(demiurg_spb @ May 19 2011, 07:05)  Ну так ведь можно напрямую к памяти обращаться не через 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 переданных-принятых бит. Где-то так.
|
|
|
|
|
May 26 2011, 19:45
|
Группа: Новичок
Сообщений: 1
Регистрация: 26-05-11
Пользователь №: 65 287

|
Люди добрые. Мне нужно сделать таймер с помощью 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..."); }
но во время таймаута он сбрасывает процессор.
Уважаемые гуру, помогите пожалйста. Правдо-говоря я новычок. Гугл не предложите пожалуйста.
Извините меня, по нации я не русский. Поэтому извиняюсь за плохой русский.
|
|
|
|
|
Jun 1 2011, 04:55
|
Группа: Validating
Сообщений: 14
Регистрация: 22-10-07
Пользователь №: 31 604

|
Помогите пожалуйста примером кода простого таймера на TIM6 или другом для STM32F103VC. Чтобы задать таймаут и по истечении попасть в обработчик прерывания.
|
|
|
|
|
Jun 2 2011, 02:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
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;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|