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

 
 
> STM32 – вопросы – проблемы - решения.
Danis
сообщение Nov 19 2010, 18:19
Сообщение #1


Twilight Zone
***

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



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


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
33 страниц V  « < 12 13 14 15 16 > »   
Start new topic
Ответов (195 - 209)
Flexz
сообщение Jun 29 2011, 11:01
Сообщение #196


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Из errat-ы про flash
"Read the BSY bit at least one cycle after setting the STRT bit."
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 29 2011, 11:25
Сообщение #197


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Это из ераты для 101 семейства?
У меня stm32f103cb.
Но тем не менее попробовал поставить несколько nop() после установки START бита - не дало никакого эффекта.
Спасибо за идею почитать ерату!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jun 29 2011, 11:40
Сообщение #198


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Это ерата на 101C/D/E и 103C/D/E ревижн Z, старая правда - 2009 год.
Посмотрел свою функцию стирания - почти тоже самое, только включение режима стирания делается так
FLASH->CR |= CR_PER_Set;
соответственно, после опускания бита Busy стоит
FLASH->CR &= ~CR_PER_Set;

Помню похожие грабли, но вроде бы они решились втыканием нопов.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 29 2011, 12:02
Сообщение #199


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Нопы не помогли. Проблема где-то в другом...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 29 2011, 18:24
Сообщение #200


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вот работающие куски. По крайней мере я несколько раз всё стёр, и зашил и считал тестовые данные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. (Инициализацию можно посмотреть вот здесь)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Danis
сообщение Jun 30 2011, 05:04
Сообщение #201


Twilight Zone
***

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



Цитата(AHTOXA @ Jun 29 2011, 22:24) *
Что касается тактирования - я ничего специально не включал и не отключал, работал от HSE.


Не помню точно в какой ветке, но я где-то на форуме читал обсуждения, якобы STM32 можно просто «убить» при едино разовом не корректном обращении с flash, камень потом перестает программироваться, читаться и т.п. В чем там прикол? Или просто слухи?


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 30 2011, 05:40
Сообщение #202


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я тоже это читал. К сожалению, точные причины/алгоритм "убиения" там не были описаны, так что пока считаю на уровне слухов.
Кстати, в примере от ST (AN2557 - "in-application programming using the USART") тактирование также производится от HSE.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 30 2011, 06:55
Сообщение #203


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



УРААА!!!! Заработала хреновина!
Я слопушил - адрес страницы для стирания это адрес её первого байта а не порядковый номер страницы как я подумал.
Получалось что моя программа сама себя затирала. Вот такой вот заскок мозга случился.
Всем большущее спасибо за участие! cheers.gif

Извлёк урок: Чтобы такого геморроя с отладкой не было нужно сразу ставить защиту от стирания на область прошивки и быть внимательнее.
Вот выстраданное:
Код
int flash_page_erase(uint32_t page_address) // page_address not page_number
{
    static const uint32_t FPEC_KEY1 = 0x45670123;
    static const uint32_t FPEC_KEY2 = 0xCDEF89AB;

    int res;

    ENTER_CRITICAL_SECTION();
    {
        FPEC->KEYR = FPEC_KEY1;     // Authorize the FPEC Access
        FPEC->KEYR = FPEC_KEY2;

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

        FPEC->SR = FPEC_SR_EOP | FPEC_SR_WRPRTERR | FPEC_SR_PGERR; // clr bits by writing 1
        FPEC->CR = FPEC_CR_PER;                // page erase operation w/o fpec interrupts
        FPEC->AR = page_address;               // page address
        FPEC->CR = FPEC_CR_STRT | FPEC_CR_PER; // start operation    
        FPEC->SR;                               // according to errata: must be dummy cycle before polling BSY after START operation

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

        res = ((FPEC->SR & FPEC_SR_EOP)  != 0);// EOP is asserted at the end of each successful program or erase operation

        FPEC->CR = FPEC_CR_LOCK;  // Set the Lock Bit to lock the FPEC and the FCR
    }
    LEAVE_CRITICAL_SECTION();

    return (res);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jun 30 2011, 11:46
Сообщение #204


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



В каком порядке ST нумерует ревизии чипов?
У меня stm32f217 rev Z, а в доках фигурирует только Y, кто из них новее?
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 1 2011, 10:26
Сообщение #205


Twilight Zone
***

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



Цитата(AHTOXA @ Jun 30 2011, 09:40) *
Я тоже это читал. К сожалению, точные причины/алгоритм "убиения" там не были описаны, так что пока считаю на уровне слухов.
Кстати, в примере от ST (AN2557 - "in-application programming using the USART") тактирование также производится от HSE.



Поработал с Flash, вроде бы все нормально и адекватно. Смотрел примеры из периферийной библиотеки, официальный Programming manual и код пользователя AHTOXA. Кстати в Programming manual клик все таки оговаривается о HSI на стр.10:
”For write and erase operations on the Flash memory (write/erase), the internal RC oscillator (HSI) must be ON.”
Но я просто тактировал от HSE, и все нормально было, надобы разобраться что за там прикол. Скорее «убиени проца» у людей происходило из за многократного стирания/записи flash в цикле, просто выработали ресурс поди.

Цитата(demiurg_spb @ Jun 30 2011, 10:55) *
Код
             ...........................................
    ENTER_CRITICAL_SECTION();
             ...........................................
    LEAVE_CRITICAL_SECTION();
}


Что там определено, можете привести эти функции?


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 1 2011, 11:27
Сообщение #206


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Danis @ Jul 1 2011, 14:26) *
Что там определено, можете привести эти функции?
Пожалуйста.
Код
#ifndef _ATOMIC_H_
#define _ATOMIC_H_

#ifdef __cplusplus
  extern "C" {
#endif

//=============================================================================
static __asm __inline uint32_t get_interrupt_state(void)
{
    mrs r0, primask
    bx lr
}

//=============================================================================
static __asm __inline void set_interrupt_state(uint32_t status)
{
    msr primask, r0
    bx lr
}

#define ENTER_CRITICAL_SECTION()  do {uint32_t sreg_temp = get_interrupt_state(); __disable_irq()
#define LEAVE_CRITICAL_SECTION()  set_interrupt_state(sreg_temp);} while (0)

#ifdef __cplusplus
  }
#endif

#endif


Цитата(Danis @ Jul 1 2011, 14:26) *
Кстати в Programming manual клик все таки оговаривается о HSI на стр.10
Да я об этом писал несколькими постами ранее.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Pat
сообщение Jul 1 2011, 20:11
Сообщение #207


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(Danis @ Jun 30 2011, 07:04) *
Не помню точно в какой ветке, но я где-то на форуме читал обсуждения, якобы STM32 можно просто «убить» при едино разовом не корректном обращении с flash, камень потом перестает программироваться, читаться и т.п. В чем там прикол? Или просто слухи?


Сделал собственный бутлоадер. При простой записи ничего с флешью не происходит, при оладке кода некоректности было много, но все решалось
простой перепрошивкой в отладчике.

Когда начал прорабатывать варианты зашиты кода, вот тут впервые немного поволновался.
После установки битов зашиты записи отладчик контроллер не увидел, думал все приплыли надо перепаивть.
Но потом SEGGER J-Flash ARM меня спас, закладка Target->Unsecure chip.

Так что не получилось пока убить флеш.

Пытался использовать USER option byte, но крайне неудобно сделано, особенно если использовать совместно с write protect и закрытым загрузчиком.
Думаю пока хватит одной защиты от чтения.

Go to the top of the page
 
+Quote Post
MK2
сообщение Jul 8 2011, 21:30
Сообщение #208


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Заинтересовал вопрос прошивки stm32f217 через USB, там вроде как в нем есть встроенный загрузчик DFU
но что-то ни в одном документе "USB DFU protocol used in the STM32™ bootloader" и "STM32™ microcontroller system memory boot mode" и на сайте стм не нашел ничего про прошивающий софт?! Есть ли для DFU что-то типа Flash_Loader_Demonstrator_v2.2.0_Setup ?
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 9 2011, 19:49
Сообщение #209


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



DfuSe USB Device Firmware Upgrade STMicroelectronics Extension: Contains the Demo GUI, Debugging GUI, all sources files and the protocol layer
Go to the top of the page
 
+Quote Post
MK2
сообщение Jul 9 2011, 23:07
Сообщение #210


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Цитата(Flexz @ Jul 9 2011, 23:49) *


Спасибо большое, ща тоже нашел её в Design support у 103 их
Но что-то странно к 217 стмцы не выкладывают, а в файле что идет в архиве написано что тока недавно появилась поодержка Connectivity Line, хотя они вроде как древние
кто-нить испытывал прогу на F2 ?
Go to the top of the page
 
+Quote Post

33 страниц V  « < 12 13 14 15 16 > » 
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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