Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 – вопросы – проблемы - решения.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
ARV
продолжаю не понимать, как работать в связке 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 не получается... туплю неподецки...
akimych
Если смотреть "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 КБ флеша, меньше периферии).
ARV
Цитата(akimych @ Apr 23 2011, 23:26) *
Вообще надо определять USE_STDPERIPH_DRIVER

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

однако, радость оказалась преждевременной... скомпилировались все файлы успешно, без ошибок и варнингов, но при линковке вылезло вот это:
Цитата
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 не вызывается... но почему?!
ivainc1789
Столкнулся со странной проблемой при использовании 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 галки, т. е. защита от записи перманентно снята для всех страниц, всей флеши. Или я что-то упускаю?
Alechin
Цитата(Danis @ Apr 23 2011, 19:40) *
Проверьте пины BOOT проца.

Да вроде все в норме: UARTовский загрузчик запускается при правильной комбинации. При комбинации "все нули" UARTовский загрузчик не запускается. Записанная через него (или ST-Link) программа нет.
Проц - 103VG
ARV
рискну в очередной раз потревожить уважаемое сообщество.
я победил-таки свою тупость и смог скомпилировать в Eclipse Helios проект для демо-платки STM32vldiscovery, правда, пришлось совершать "странные" манипуляции.
теперь у меня новая беда: отладка... у меня есть stm32-gdb-server именно для моей отладочной платы, он работает. даже удается законнектить его с arm-none-eabi-gdb при помощи плугина Eclipse... но при этом в микроконтроллер не заливается прошивка sad.gif
по идее должна быть возможность увидеть команды, которыми gdb общается с сервером - я их не вижу и не могу понять, как это включить. так как я не вижу обмена, я не понимаю, почему не загружается программа. поиск в сети не дал ничего полезного: все или J-Link используют, или OpenOCD... пытался составить скрипт инициализации gdb - выдает в каждой строке с командой monitor ошибку - дескать, не поддерживается команда...

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

помогите, кто понимает, в чем дело....
adnega
Очень огорчило:
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 не получится(
А счастье было так близко...
demiurg_spb
Цитата(adnega @ May 18 2011, 17:13) *
Т.е. "натравить" DMA на bit-band SRAM не получится(
А счастье было так близко...
Ну так ведь можно напрямую к памяти обращаться не через bit-band remap.
Или Вы хотели побитный атомарный доступ организовать? Интересно для чего?
adnega
Цитата(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 переданных-принятых бит.

Где-то так.
demiurg_spb
Цитата(adnega @ May 19 2011, 09:20) *
Анализирую исправность CAN-шины... Где-то так.
Идея была хороша.
adnega
Цитата(demiurg_spb @ May 19 2011, 08:26) *
Идея была хороша.


Сделал через таймер, DMA и не bit-band память.
Раз в 16мс обрабатываю прерывание за 22мкс (CPU LOAD = 0.14% вместо 10%).
Меня устраивает)
tRem0R
Люди добрые. Мне нужно сделать таймер с помощью 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...");
}

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

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

Извините меня, по нации я не русский. Поэтому извиняюсь за плохой русский.
Flexz
Зачем IWDG? используйте для таймаутов любой обычный таймер - TIMx. А собаке оставьте собачью работу - сбрасывать процессор, если всё повисло.
Entuziast
Помогите пожалуйста примером кода простого таймера на TIM6 или другом для STM32F103VC. Чтобы задать таймаут и по истечении попасть в обработчик прерывания.
brag
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;
brag
Также в PCM MAster с теми же настройками, sysclk=72mhz и I2SPR=ODD|140 Fs~=16кгц, а должно быть 8 судя по формуле в refman
Цитата
When the master clock is disabled (MCKOE bit cleared):
Fs = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD))] when the channel frame is 16-bit wide

Ну и bitrate=256кгц
ZyBEX
Господа. Скажите, почему в st-link utility при прошивке или записи битов конфигурации нужно нажимать reset? По идее st-link сам должен это делать. Или нога (у st-link) отгорела??? Где-то здесь я уже подобную проблему читал, т.е. проблема такая уже была, но не нашел ее решения. МК stm32f107vct6. До этого уже работал со 103 из iar, проблем не было. Хотя иногда при определенной конфигурации микроконтроллера все равно приходилось сбрасывать вручную. Может и такого тоже не должно было быть. Таким он был с момента покупки, к сожалению сравнить не с чем.

P.S. Попробовал 107 в иаре. Прошилось влет. Значит дело в st-link utility. Может как-нибудь настроить ее можно?
Alechin
Отбой - нашел ошибку: есть одна короткая фраза в мануале, которую я не увидел сразу:
For write and erase operations on the Flash memory (write/erase), the internal RC oscillator
(HSI) must be ON


Вопрос такой: теперь не удается работать (стирать/писать) во внутреннюю флеш.
При записи улетаю в BusFault, при стирании - вообще проц. умирает: отладчик IAR (с ST-LINK) зависает.
Вот пример кода записи слова:
static void Write(WORD32 Flash_Addr, WORD16 val)
{
FLASH_KEYR = UNLOCK_KEY1; // Разблокируем контроллер.
FLASH_KEYR = UNLOCK_KEY2;
if((FLASH_CR & (1 << LOCK)) == 0)
{
FLASH_CR() |= (1 << PG);
*(WORD16 *)Flash_Addr = val; // Пишем - вот здесь возникает BusFault
while((FLASH_SR & (1 << BSY)) != 0); // Ждем готовности.
FLASH_CR() &= ~(1 << PG);
FLASH_CR |= (1 << LOCK);
}
}
brag
у меня и с включенным HSI и при записи в флеш через openocd проц умирал на всегда. с ST-link такого правда быть не должно по идее
ZyBEX
Точно умирает? Reset сразу после начала прошивки вручную нажимать пробовали. Интересно, что (у меня) команда стирания выполнялась сама, а запись требовала жать резет, иначе происходила потеря контроллера.

И все-таки вопрос про st-link utility: у кого-нибудь были аномалии при работе с ней, и как побеждали?
brag
Цитата
Точно умирает?

точно. даже после убирания питания, закорачивания всех ног на землю и ожидания 10 минут, jtag отвечает на команды, но дальше дело не идет, проц не видится дебаггером(jlink в том числе) и жрет раза в 2 больше тока,чем когда работает. уже 2 таких камня лежит
wedmeed
Подскажите пожалуйста. где взять под OrCad библиотеки с STM32. Конкретно интересует чтоб был STM32F100C4 (довольно новый МК).
Конкретно интересует условное графическое обозначение и посадочное место для ПП.
mov
Цитата(wedmeed @ Jun 10 2011, 08:44) *
Подскажите пожалуйста. где взять под OrCad библиотеки с STM32. Конкретно интересует чтоб был STM32F100C4 (довольно новый МК).
Конкретно интересует условное графическое обозначение и посадочное место для ПП.


На сайте STm не смотрели ?
wedmeed
Цитата(mov @ Jun 10 2011, 09:14) *
На сайте STm не смотрели ?

Смотрел, но нашел только даташиты, а хотелось бы сэкономить время.
scifi
Цитата(wedmeed @ Jun 10 2011, 08:44) *
Подскажите пожалуйста. где взять под OrCad библиотеки с STM32. Конкретно интересует чтоб был STM32F100C4 (довольно новый МК).
Конкретно интересует условное графическое обозначение и посадочное место для ПП.

Если понравится, берите то, что я нарисовал:
brag
Цитата
Подскажите пожалуйста. где взять под OrCad библиотеки с STM32. Конкретно интересует чтоб был STM32F100C4 (довольно новый МК).
Конкретно интересует условное графическое обозначение и посадочное место для ПП.

а отрисовать? займет же минут 20 ...
Serj78
Столкнулся с интересной особенностью защиты от чтения в STM32F10xx.

Хочется отвести в конце флеша участок, который хранил бы информацию о версиях прошивок устройства, настройках, пр.

Но при этом была возможность перепрограммирования через штатный бутлоадер.

Пытаюсь это сделать с помощью flash loader demonstrator.
Так вот, если поставить защиту от чтения- ее нельзя , получается, поставить на конкретные страницы флешь, только на всю целиком!
Хотя у каждой страницы есть свой флажок защиты от чтения... sad.gif
И, соответственно, нельзя перешить процессор, не стерев всю память целиком, не тронув область , содержащую настройки.

Выходом из этого является чтение настроек перед прошивкой, потом записью их после прошивки.

Может, есть какой-то другой способ, который я проглядел? ( кроме написания собственного бутлоадера sm.gif )
wedmeed
Цитата(scifi @ Jun 10 2011, 08:57) *
Если понравится, берите то, что я нарисовал:


Спасибо, то что надо.
wedmeed
Ещё один вопрос по тому же STM32F100. Нужен ли ему для асинхронного режима трансмитер RS-232? Или просто настроить PA9 и PA10 на альтернативную функцию и подключиться к компу?
scifi
Цитата(wedmeed @ Jun 12 2011, 20:47) *
Ещё один вопрос по тому же STM32F100. Нужен ли ему для асинхронного режима трансмитер RS-232? Или просто настроить PA9 и PA10 на альтернативную функцию и подключиться к компу?

Скорее, это вопрос по уровням сигналов RS-232. Если лень ставить полноценный трансивер RS-232, нужен как минимум инвертор. Так как уровни логического "0" и "1" у микроконтроллера равны 0 и Vcc, а у RS-232 - +5..+12В и -5..-12В (замечаете инверсию?). Не говоря уже о том, что высокое напряжение с компьютера (+/-5В как минимум) может повредить МК.
brag
и в соседнюю веточку не плохо было бы заглянуть http://electronix.ru/forum/index.php?showtopic=69348
много чего интересного там есть
ISK2010
Подскажите в чем отлаживать проект с STM32W108CB ? Хотел беспроводные датчики сделать. Сижу в keil, а там STM32W108CB не поддерживается. В IAR есть?

И еще не нашел на сайте stm библиотеки периферии для него...

Alfa
в списке поддерживаемых в iar (v5.50) есть STM32W108. без букв...

тут http://www.st.com/internet/mcu/product/245381.jsp на вкладке design support много полезного есть...
topkin
Цитата(ISK2010 @ Jun 24 2011, 08:22) *
Подскажите в чем отлаживать проект с STM32W108CB ? Хотел беспроводные датчики сделать. Сижу в keil, а там STM32W108CB не поддерживается. В IAR есть?

И еще не нашел на сайте stm библиотеки периферии для него...

Для него нет никаких библиотек, есть стеки, которые предоставляют вам API и все по сути. Надеюсь со стеком вы уже определились, а так придется все ручками для периферии писать, но ничего на мой взгляд критичного нет... И будьте внимательны при выборе партнамбера, там посл цифра сообщает для какого стека предназначен контроллер, для начала можно попробовать "универсальный" вариант для любого стека, но вроде бы это образцы не для коммерческого использования, уточняйте у дистрибьютора или у самого производителя этот момент.
ISK2010
Все ручками писать( Как не хочется... Хотел взять этот контроллер только из-за мысли, что все будет быстро по причине идентичности с STM32F. А по сути проще к STM32F100 подкрутить модуль внешний.




Цитата(topkin @ Jun 24 2011, 09:16) *
И будьте внимательны при выборе партнамбера, там посл цифра сообщает для какого стека предназначен контроллер, для начала можно попробовать "универсальный" вариант для любого стека, но вроде бы это образцы не для коммерческого использования, уточняйте у дистрибьютора или у самого производителя этот момент.


Спасибо за совет, посмотрю нужный.


topkin
Цитата(ISK2010 @ Jun 24 2011, 10:41) *
Все ручками писать( Как не хочется... Хотел взять этот контроллер только из-за мысли, что все будет быстро по причине идентичности с STM32F. А по сути проще к STM32F100 подкрутить модуль внешний.

Спасибо за совет, посмотрю нужный.


Вас потребление устроит?
Вот при работе с периферией у вас должно возникнуть проблем по минимуму, написать функционал для SPI/UART/таймеров... задача не сложная, да и на крайний случай можно это выдернуть из библиотеки периферии от ST, думаю реализация однотипной периферии с STM32F должна остаться той же.
Вот изучение радиочасти + стеков....
Вы также можете посмотреть решения от майкрочипа или TI, поиск вам в помощь.
ISK2010
На передатчик заложил 40 мА.
vvb76
А кто-нибудь STM32F101 и STM32F100 программировал через USART1 и bootloader?
По даташитам вроде бы все сходится, но есть ли у кого-нибудь практика в этом?
Нет ли каких-нибудь подводных камней? И вообще, какой программкой программировать?
IgorKossak
Нормально всё программируется.
Программу раньше легче было найти, теперь у них на сайте чёрт ногу сломит. Здесь.
vvb76
Цитата(IgorKossak @ Jun 26 2011, 21:33) *
Нормально всё программируется.
Программу раньше легче было найти, теперь у них на сайте чёрт ногу сломит. Здесь.

Спасибо
demiurg_spb
Ребята! Кто-нибудь для Кейла писал инлайн вставки для cortex-m3?
А то справедливо получаю ошибку:
#Inline assembler not permitted when generating Thumb code
Тумба2 не поддерживается инлайн асмом судя по докеsad.gif
Хочу такое:
Код
static inline uint32_t get_interrupt_state(void)
{
    uint32_t sr;

    __asm
    {
        MRS sr, PRIMASK
    }

    return sr;
}

static inline void set_interrupt_state(uint32_t status)
{
    __asm
    {
        MSR PRIMASK, status
    }
}
Что делать?
Petka
Цитата(demiurg_spb @ Jun 28 2011, 11:07) *
...
Хочу такое:
Код
static inline uint32_t get_interrupt_state(void);
static inline void set_interrupt_state(uint32_t status);

Что делать?

Посмотреть на библиотеку "CMSIS".

upd:
смотреть на функции:
__get_PRIMASK
__set_PRIMASK
ISK2010
У меня также было.

Попробуй вот так:

CODE
__ASM __inline u32 get_interrupt_state(void)

{

mrs r0, primask

bx lr

}



__ASM __inline void set_interrupt_state(u32 status)

{

msr primask, r0

bx lr

}



А чем тебе не нравятся такие же функции из core_cm3.c ? С оптимизацией они и так инлайнами будут.
demiurg_spb
Цитата(Petka @ Jun 28 2011, 13:50) *
Посмотреть на библиотеку "CMSIS".
Спасибо! Полегчалоsm.gif

Цитата(ISK2010 @ Jun 28 2011, 14:10) *
А чем тебе не нравятся такие же функции из core_cm3.c ?
Да мне-то нравятся. Только вот в проекте используется пока ещё STM32_Init от кейла с визардом (досталось в наследство) и они конфликтуют. Как только закончу проект от визадра не останется и следа...
demiurg_spb
Появился новый вопрос.
Столкнулся с непоняткой при самопрограммировании посредством FPEC (unlock FPEC проходит нормально, виснет проц при попытке стереть страничку).
В документации сказано что для стирания/записи FLASH нужно чтобы был включен HSI.
Нужно-ли чтобы ещё и на вход PLL поступала частота от HSI или можно оставить HSE (или я вообще что-то недопонял).
Код
int flash_page_erase(uint32_t page)
{
    while (FPEC->SR & FPEC_SR_BSY) {;}

    FPEC->SR  = FPEC_SR_WRPRTERR | FPEC_SR_PGERR | FPEC_SR_EOP; // clr by writing 1

    FPEC->CR  = FPEC_CR_PER;  // page erase operation w/o interrupts
    FPEC->AR  = page;         // page address
    FPEC->CR |= FPEC_CR_STRT; // start operation    

    while (FPEC->SR & FPEC_SR_BSY) {;}

    return ((FPEC->SR & FPEC_SR_EOP)  != 0); // EOP is asserted at the end of each successful program or erase operation
}
Посмотрите пожалуйста может, в коде где косяк. Спасибо!

И ещё интересно как соблюдается следующее требование (благодаря кешу инструкций? ибо программа-то выполняет цикл ожидания из ПЗУ, может её в ОЗУ разместить стоит)?
Цитата
During a write operation to the Flash memory, any attempt to read the Flash memory will
stall the bus. The read operation will proceed correctly once the write operation has
completed. This means that code or data fetches cannot be made while a write/erase
operation is ongoing.


Не дайте умереть!!!:) Сегодня уже целый день бьюсь безуспешно.
Пробовал тактироваться и от HSI и от HSE и от HSE со включенным HSI - ноль. Виснет и всё. Да так что SWD отваливается.

FLASH_WRPR = 0xFFFFFFFF - нет защиты.
Flexz
Из errat-ы про flash
"Read the BSY bit at least one cycle after setting the STRT bit."
demiurg_spb
Это из ераты для 101 семейства?
У меня stm32f103cb.
Но тем не менее попробовал поставить несколько nop() после установки START бита - не дало никакого эффекта.
Спасибо за идею почитать ерату!
Flexz
Это ерата на 101C/D/E и 103C/D/E ревижн Z, старая правда - 2009 год.
Посмотрел свою функцию стирания - почти тоже самое, только включение режима стирания делается так
FLASH->CR |= CR_PER_Set;
соответственно, после опускания бита Busy стоит
FLASH->CR &= ~CR_PER_Set;

Помню похожие грабли, но вроде бы они решились втыканием нопов.
demiurg_spb
Нопы не помогли. Проблема где-то в другом...
AHTOXA
Вот работающие куски. По крайней мере я несколько раз всё стёр, и зашил и считал тестовые данныеsm.gif
CODE
template<typename props>
void stm32_flash_t<props>::wait()
{
while (FLASH->SR & FLASH_SR_BSY) ;
}

template<typename props>
void stm32_flash_t<props>::delay()
{
for (volatile int i = 0; i < 0xFF; i++) ;
}

template<typename props>
bool stm32_flash_t<props>::wait(uint32_t timeout)
{
while (FLASH->SR & FLASH_SR_BSY)
{
if (!--timeout)
return false;
delay();
}
return true;
}

template<typename props>
bool stm32_flash_t<props>::write_halfword(uint32_t addr, uint32_t data)
{
TCritSect cs;
volatile uint16_t* addr_16 = reinterpret_cast<volatile uint16_t*>(addr);

uint32_t cr = FLASH->CR;
FLASH->CR = FLASH_CR_PG;
wait();
addr_16[0] = data;
wait();
FLASH->CR = cr & ~FLASH_CR_PG;
return (*(uint16_t*)addr == data);
}

template<typename props>
bool stm32_flash_t<props>::write(uint32_t addr, void* buf, uint32_t count)
{
uint8_t* src = static_cast<uint8_t*>(buf);
uint32_t end = addr + count;

while (addr < end)
{
uint32_t w = 0xFFFFFFFF;
if ((uint32_t)addr & 1) // odd flash address - step back
--addr;
else
w = 0xFFFFFF00 | (*src++);
if (addr < end)
w = (w & 0xFFFF00FF) | (*src++ << 8);

if (!write_halfword(addr, w))
return false;
addr += 2;
}
return true;
}

template<typename props>
bool stm32_flash_t<props>::erase_page(uint32_t addr)
{
TCritSect cs;
wait();
FLASH->CR |= FLASH_CR_PER;
FLASH->AR = addr;
FLASH->CR |= FLASH_CR_STRT;
return wait(PAGE_ERASE_TIMEOUT);
}

template<typename props>
bool stm32_flash_t<props>::mass_erase()
{
TCritSect cs;
wait();
FLASH->CR |= FLASH_CR_MER;
FLASH->CR |= FLASH_CR_STRT;
return wait(MASS_ERASE_TIMEOUT);
}


Что касается тактирования - я ничего специально не включал и не отключал, работал от HSE. (Инициализацию можно посмотреть вот здесь)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.