Т.е. лучше заводить таймер и опрашивать через определенный период, тем самым и дребезг устранить и в главном цикле не тормозить ?HHIMERA писал(а):Юзать прерывания - моветон.
STM32 новичку в ARM что к чему
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
- Реклама
Re: STM32 новичку в ARM что к чему
Да, опечатка.
Скажу свое видение плюсов/минусов программного и аппаратного антидребезга. То что касается цены - упасите, какое нафиг дорого? Резистор и конденсатор будут стоить в буквальном смысле копейки. Да пол-часа работы программиста, который будет программный антидребезг делать обойдется дороже!
Гибкая настройка? Да что там гибко настраивать то? Лучше подумайте какой ценой вы получаете программный антидребезг. Таймер и прерывания? На жалкую обработку кнопок целый таймер и прерывание? Да в МК может быть всего один-два таймера, и вы ими так просто швыряетесь? А может в фоновом цикле ждать 10-100-200 миллисекунд? В фоновом цикле обычно крутятся всякие приемо-передачи по UART, разные мигания, не критичные ко времени алгоритмы... Вы хотите, чтобы они все подождали, пока у вас кнопочка обработается? Это же бесполезная трата процессорного времени. Нет уж, я всегда буду настаивать на аппаратном антидребезге и только на нем.
Это все не ради спора, просто мое мнение. Вопросы риторические.
Скажу свое видение плюсов/минусов программного и аппаратного антидребезга. То что касается цены - упасите, какое нафиг дорого? Резистор и конденсатор будут стоить в буквальном смысле копейки. Да пол-часа работы программиста, который будет программный антидребезг делать обойдется дороже!
Гибкая настройка? Да что там гибко настраивать то? Лучше подумайте какой ценой вы получаете программный антидребезг. Таймер и прерывания? На жалкую обработку кнопок целый таймер и прерывание? Да в МК может быть всего один-два таймера, и вы ими так просто швыряетесь? А может в фоновом цикле ждать 10-100-200 миллисекунд? В фоновом цикле обычно крутятся всякие приемо-передачи по UART, разные мигания, не критичные ко времени алгоритмы... Вы хотите, чтобы они все подождали, пока у вас кнопочка обработается? Это же бесполезная трата процессорного времени. Нет уж, я всегда буду настаивать на аппаратном антидребезге и только на нем.
Это все не ради спора, просто мое мнение. Вопросы риторические.
Re: STM32 новичку в ARM что к чему
То есть вы хотите сказать , что кнопки вешаете на EXTI + конденсаторы ???menzoda писал(а):Нет уж, я всегда буду настаивать на аппаратном антидребезге и только на нем.
Ну, ну , большое вам счастье скакать по, пройденным уже многими, граблям . Возможно эти грабли вам мОзги вправят...
Re: STM32 новичку в ARM что к чему
Если нужно - повешу на внешнее прерывание, если нужно - просто на ножку, если нужно - буду читать через сдвиговый регистр по SPI, но во всех случаях антидребезг буду использовать аппаратный.
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
Ну тогда и я отвечу, не ради спора. 
В программе обычно бывает много разных задач, для которых нужен подсчет времени. И для них всех бывает достаточно одного таймера. Если нужно - используется несколько переменных-счетчиков, переполнение (в смысле достижение определенного уровня) которых обрабатывается в основном цикле. И задержки там тоже не нужны. Циклически проверяется состояние этих программных счетчиков и выполняются нужные операции. Про UART - делается буфер, который спокойно заполняется в основном цикле программы, а запись его непосредственно в регистр модуля UART может происходить по прерыванию этого самого UART.
То что в прерываниях не должно быть задержек - это самое вопиющее, что встретилось в том куске кода. Если главных цикл решает только какую-то одну задачу, то там еще можно допустить наличии задержек циклами, но в прерываниях - увольте.
Про "дорого" зависит от объемов. Если вы инженер компании, которая производит модули миллионными партиями, то экономическая часть вопроса будет стоять у вас по сути на первом месте. Если же нет - что же, можно и добавить пару элементов, но будет ли от них реальная польза? Опрос клавиатуры выше указанными методами займет единицы процентов загрузки ЦП даже на килогерцовых частотах. А если процессор работает на десятках мегагерц, то это вообще не вопрос.
-------------------
P.S. Вообще, соглашусь, что решение может зависеть от конкретных условий. Не стоит ограничивать себя ни аппаратным, ни программным способом, лучше держать в голове все возможные способы, и выбирать оптимальный для каждой задачи.
В программе обычно бывает много разных задач, для которых нужен подсчет времени. И для них всех бывает достаточно одного таймера. Если нужно - используется несколько переменных-счетчиков, переполнение (в смысле достижение определенного уровня) которых обрабатывается в основном цикле. И задержки там тоже не нужны. Циклически проверяется состояние этих программных счетчиков и выполняются нужные операции. Про UART - делается буфер, который спокойно заполняется в основном цикле программы, а запись его непосредственно в регистр модуля UART может происходить по прерыванию этого самого UART.
То что в прерываниях не должно быть задержек - это самое вопиющее, что встретилось в том куске кода. Если главных цикл решает только какую-то одну задачу, то там еще можно допустить наличии задержек циклами, но в прерываниях - увольте.
Про "дорого" зависит от объемов. Если вы инженер компании, которая производит модули миллионными партиями, то экономическая часть вопроса будет стоять у вас по сути на первом месте. Если же нет - что же, можно и добавить пару элементов, но будет ли от них реальная польза? Опрос клавиатуры выше указанными методами займет единицы процентов загрузки ЦП даже на килогерцовых частотах. А если процессор работает на десятках мегагерц, то это вообще не вопрос.
-------------------
P.S. Вообще, соглашусь, что решение может зависеть от конкретных условий. Не стоит ограничивать себя ни аппаратным, ни программным способом, лучше держать в голове все возможные способы, и выбирать оптимальный для каждой задачи.
Giggity giggity goo!
- Реклама
Re: STM32 новичку в ARM что к чему
Ну тогда и я... совсем не для спора...
Подключите плёнку... сколько она протянет???
Вы, похоже, никогда кнопки не подключали... бывает...menzoda писал(а):Если нужно - повешу на внешнее прерывание, если нужно - просто на ножку, если нужно - буду читать через сдвиговый регистр по SPI, но во всех случаях антидребезг буду использовать аппаратный.
Подключите плёнку... сколько она протянет???
Загляните в схемы мобильников... ведь не зря там всё это навешано...Foks писал(а): Про "дорого" зависит от объемов. Если вы инженер компании, которая производит модули миллионными партиями, то экономическая часть вопроса будет стоять у вас по сути на первом месте. Если же нет - что же, можно и добавить пару элементов, но будет ли от них реальная польза?
100% !!!Вообще, соглашусь, что решение может зависеть от конкретных условий. Не стоит ограничивать себя ни аппаратным, ни программным способом, лучше держать в голове все возможные способы, и выбирать оптимальный для каждой задачи.
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32 новичку в ARM что к чему
Не только дребезг... Ещё можно отработать короткое нажатие, двойное, тройное, длинное (автоповтор, переход куда-либо) или залипание (механическое повреждение) и т. д. ...amv2000 писал(а):Т.е. лучше заводить таймер и опрашивать через определенный период, тем самым и дребезг устранить и в главном цикле не тормозить ?HHIMERA писал(а):Юзать прерывания - моветон.
"Я не даю готовых решений, я заставляю думать!"(С)
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Попробовал с таймером SysTick заметно лучше ситуацияHHIMERA писал(а):[Не только дребезг...
Спойлер
#include "stm32f10x.h" /* "stm32f10x.h" - Файл описания периферии */#define Green 0 /* Зеленый светодиод */
#define Blue 1 /* Голубой светодиод */
uint8_t flag; /* флаг состояния */
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPAEN;// включаем тактирование порта C и А
GPIOC->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_MODE9_0);// Режим выхода порта С, вывода PC8,9 с максимальной скоростью – 10МГц (MODEy[1:0] = 01)
GPIOC->CRH &= ~(GPIO_CRH_CNF8 | GPIO_CRH_CNF9);// Режим вывода PC8,9 порта C, Двухтактный выход общего назначения Push-Pull CNFy[1:0] = 00:
GPIOA->CRL &= ~ GPIO_CRL_MODE0; // Кнопка "USER" PA0 - на вход.
/**-----------------------------------------------------------------------------
* @описание Функция управления состояния светодиодов.
* @параметр uint8_t stat
* @возвращаемое
* значение Нет
*---------------------------------------------------------------------------*/
void Led_on_off(uint8_t stat)
{
GPIOC->ODR &= 0xFCFF; /* Выкл синий и зеленый светодиод */
switch(stat)
{
case Green: _PORTC(9)= 1; /* вкл синий GPIOC->ODR |= 1 << 8; */
break;
case Blue: _PORTC(8)= 1; /* вкл зеленый GPIOC->ODR |= 1 << 9; */
}
}
/*---------- Обработчик прерывания по переполнению таймера SysTick -----------*/
void SysTick_Handler()
{
/* Обработка кнопки */
static uint8_t btn_old_state = 0; /* первичное состояние кнопки */
uint8_t btn_state = (GPIOA->IDR & 1); /* текущее состояние кнопки */
if (btn_old_state == 0 && btn_state == 1)
flag=!flag;
btn_old_state = btn_state;
}
int main() /*------------- Основная программа --------------------------------*/
{
/* Конфигурируем таймер SysTick на срабатывание 100 раз в секунду */
SysTick_Config(SystemCoreClock / 100);
while(1) /* -------------- Основной цикл ------------------------------------*/
{
Led_on_off(flag);
}
}
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Здесь кнопка опрашивается 100 раз в секунду, сколько пробовал дребезга не увидел(если что, думаю можно реже опрашивать будет еще лучше).
Еще надо попробовать в цикле антидребезг организовать по таймеру.
Еще надо попробовать в цикле антидребезг организовать по таймеру.
Re: STM32 новичку в ARM что к чему
собственно можно по разному мутить. смысл один - отслеживать человекаamv2000 писал(а):...кнопка опрашивается 100 раз в секунду...организовать по таймеру.
дальше:
нам надо асинхронно воспринимать кнопку от человека. Тут два способа - прерывание либо опрос. опрос проезжаем - это понятно. остаётся прерывание. собственно если мы отжимаемся и время прошло мало - то его в пень. если много - то флаг нажатия.
из основной программы, если у нас нет РТОС - то нам кнопка подтребуется когда потребуется (если РТОС - то мы можем тут задействовать всевозможные осевые выкрутасы - типа ожидание со временем и прочее). Т.е. если что то там нажалось, то до запроса этого события из основной логики - нам пофигу. а вот если запросили, то мы можем посмотреть две вещи 1) сколько времени прошло от нажатия (если такое было) 2) стоит ли флаг нажатия кнопочки (если он был выставлен).
надеюсь понятно описал логику, без всякого кода на таймерах (необходимо только всё же чем то считать время - т.е. запустить таймер какой нить
Re: STM32 новичку в ARM что к чему
Однозначно!kolobok0 писал(а):собственно можно по разному мутить.
Ну вот. Так сразу. Только два? Почему?Тут два способа - прерывание либо опрос. опрос проезжаем - это понятно. остаётся прерывание. собственно если мы отжимаемся и время прошло мало - то его в пень. если много - то флаг нажатия.
В большинстве случаев случаев применяю третий, совмещенный - опрос в прерывании.
К тому же в этом методе есть и защита от дребезга. Без накладных расходов. Довольно удобно как для отдельных кнопок, так и в матрицах из них.
Чаще всего использую системный таймер на 1 мсек.
Если кому-то будет интересно - спрашивайте. Тратить время "в воздух" нет желания.
С уважением,
Виктор.
Виктор.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Да ладно Вам, очень даже интересно. Я перекопал интернет и везде только разговоры на эту тему или примеры с применением библиотеки SPL, а она хоть и говорят для удобного восприятия у меня в голове вызывает только кашу. Впрочем про таймер SysTick читал именно с применение SPL, так же попадалось очень похожее на пример выше, где учитывается время нажатия. Только здесь я думаю опечатка надо if (++button_cnt == некая_константа) Action();, тогда условие выполняется если нажата кнопка, запускаем счет и ждем когда значение будет равно константе. Если равно выполняем какое то действие, если нет обнуляем счетчик. Надеюсь правильно понимаю код, тем более он простut1wpr писал(а):Если кому-то будет интересно - спрашивайте. Тратить время "в воздух" нет желания.
Код: Выделить всё
void SysTick_Handler()
{
static unsigned button_cnt = 0;
if (GPIOA->IDR & 1) {
if (++button == некая_константа) Action();
} else button_cnt = 0;
}Код: Выделить всё
static uint16_t KeyAcc = 0; /* Key Accumulator */
static uint16_t Key = 0; /* Key State */
/*
* Read Key
*/
void ReadKey() {
KeyAcc = KeyAcc << 1;
KeyAcc |= !(KEYPORT & KEYPIN);
if(KeyAcc == 0xFFFF) Key = 1;
if(KeyAcc == 0) Key = 0;
}
Функция ReadKey() вызывается либо из главного цикла программы, либо по прерыванию таймера.
В главном цикле обрабатывается переменная Key.
if(Key) /* кнопка нажата */
{
}Re: STM32 новичку в ARM что к чему
Практически то, что я применяю.amv2000 писал(а):Да ладно Вам, очень даже интересно. Я перекопал интернет и везде только разговоры на эту тему или примеры с применением библиотеки SPL, а она хоть и говорят для удобного восприятия у меня в голове вызывает только кашу. Впрочем про таймер SysTick читал именно с применение SPL, так же попадалось очень похожее на пример выше, где учитывается время нажатия. Только здесь я думаю опечатка надо if (++button_cnt == некая_константа) Action();, тогда условие выполняется если нажата кнопка, запускаем счет и ждем когда значение будет равно константе. Если равно выполняем какое то действие, если нет обнуляем счетчик. Надеюсь правильно понимаю код, тем более он простКод: Выделить всё
void SysTick_Handler() { static unsigned button_cnt = 0; if (GPIOA->IDR & 1) { if (++button == некая_константа) Action(); } else button_cnt = 0; }
Немного переиначил условие. Считается, что кнопка в отжатом состоянии в "1", нажатие в "0".
Организованы N счетчиков по количеству кнопок. Все счетчики volatile.
Код: Выделить всё
volatile int button_cnt_1, button_cnt_2;
void AnyTimer_Handler( void){
if( GPIOA->IDR and 0x01 ) button_cnt_1 = 0x00; else if( button_cnt_1 < TRESHOLD ) button_cnt_1++;
if( GPIOA->IDR and 0x02 ) button_cnt_2 = 0x00; else if( button_cnt_2 < TRESHOLD ) button_cnt_2++;
return;С матрицей немного иначе, но суть та же.
Если период прерываний таймера, выбранного в качестве системного равен 1 мсек, то TRESHOLD должен иметь значение порога антидребезга в мсек.
Если таймер считает быстрее, соответственно пересчитывается TRESHOLD.
И никаких Action() из обработчика!
Для получения состояния кнопки ( только результат "кнопка Кн была нажата", длительности и моментальная "нажата/отжата" не отрабатываются, легко додумываются по необходимости ) надо обращаться к функции
Код: Выделить всё
int GetPressedButton( void ){
if( button_cnt_1 == TRESHOLD ) button_cnt_1 = TRESHOLD+1; else return 1;
if( button_cnt_2 == TRESHOLD ) button_cnt_2 = TRESHOLD+1; else return 2;
// ... по количеству кнопок
return ( 0 );
}Подобный подход позволяет не загромождать обработчик ничем, кроме работы со счетчиками, "защелкивая" событие "была нажата" по истечении TRESHOLD-а.
Фиксация времени нажатия кнопок или получение состояния "нажата/отжата" возможна с применением того же механизма, но слегка поменяв логику работы функции получения данных по кнопкам.
Как видите, все очень просто. Метод не мой, просто уже не помню, из какой литературы я его извлек.
Встречал еще несколько модификаций этого алгоритма. Но они, на мой взгляд, были менее оптимальны. Этот же прост и прозрачен. Соотвественно надежен. Об ограничениях применения я уже сказал.
Про "кашу в голове" не комментирую, это ваши проблемы. Никто не заставляет применять SPL.
С уважением,
Виктор.
Виктор.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Опробовал и его через таймер 3, разницы по сравнению с SysTick не заметил, но для себя полезно.ut1wpr писал(а):Практически то, что я применяю.
Спойлер
#include "stm32f10x.h" /* "stm32f10x.h" - Файл описания периферии */#define Green 0 /* Зеленый светодиод */
#define Blue 1 /* Голубой светодиод */
uint8_t flag; /* флаг состояния */
/*------------------------------------------------------------------------------
Побитовый доступ к регистрам:
--------------------------------------------------------------------------------
Адрес в области bit band = начальный адрес области bit band + смещение байта в «родной» области ? 20 + номер бита ? 4.*/
#define _PORTC(i) (*((__O unsigned long *) \
(PERIPH_BB_BASE + ((GPIOC_BASE+0x0C-PERIPH_BASE) * 0x20) + (i*4))))
void Initall ()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPAEN;// включаем тактирование порта C и А
GPIOC->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_MODE9_0);// Режим выхода порта С, вывода PC8,9 с максимальной скоростью – 10МГц (MODEy[1:0] = 01)
GPIOC->CRH &= ~(GPIO_CRH_CNF8 | GPIO_CRH_CNF9);// Режим вывода PC8,9 порта C, Двухтактный выход общего назначения Push-Pull CNFy[1:0] = 00:
GPIOA->CRL &= ~ GPIO_CRL_MODE0; // Кнопка "USER" PA0 - на вход.
/*------------------------------- Таймер 3 -----------------------------------*/
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; /* Тактирование таймера TIM3 */
TIM3->ARR = 10000; /* перезагружать каждые (2MHz / 10000 = 200Hz ) - 5mSec (1000/200) */
/* Когда таймер достигнет максимального значения необходимо уведомить об этом контроллер прерываний, */
TIM3->DIER |= TIM_DIER_UIE; /* для этого разрешим генерацию событий от таймера 3 */
TIM3->CR1 |= TIM_CR1_CEN; /* старт таймера TIM3 */
NVIC_EnableIRQ(TIM3_IRQn);/* Задействуем обработчик прерывания от 3-го таймера */
}
/**-----------------------------------------------------------------------------
* @описание : Обработчик прерывания по переполнению таймера 3.
* @заметка :
* @параметр : Нет
* @возвр значение: Нет
*---------------------------------------------------------------------------*/
void TIM3_IRQHandler(void)
{
TIM3->SR &= ~TIM_SR_UIF; // не забываем сбросить флаг, //TIM3->SR = 0; /* Очистить флаг ожидания*/
// иначе прерывание будет генериться постоянно
static unsigned button_cnt = 0; /* счетчик периода нажатия */
if (GPIOA->IDR & 1) /* Если нажата кнопка */
{
if (++button_cnt == 100) flag=!flag;/* запускаем счетчик, если в этот период кн еще нажата*/
} else button_cnt = 0;/* выполняем какое то действие, если нет обнуляем счетчик */
}
/**-----------------------------------------------------------------------------
* @описание : Функция управления состояния светодиодов.
* @параметр : uint8_t stat (переменная типа unsigned char )
* @возвращаемое значение: Нет
*---------------------------------------------------------------------------*/
void Led_on_off(uint8_t stat)
{
GPIOC->ODR &= 0xFCFF; /* Выкл синий и зеленый светодиод */
switch(stat)
{
case Green: _PORTC(9)= 1; /* вкл синий GPIOC->ODR |= 1 << 8; */
break;
case Blue: _PORTC(8)= 1; /* вкл зеленый GPIOC->ODR |= 1 << 9; */
}
}
int main() /*------------- Основная программа --------------------------------*/
{
Initall (); /* инициализируем порты и таймеры */
while(1) /* -------------- Основной цикл ------------------------------------*/
{
Led_on_off(flag); /* запускаем переключение LED */
}
}
-
Citizen Kane
- Родился
- Сообщения: 6
- Зарегистрирован: Чт июн 20, 2013 03:11:09
Re: STM32 новичку в ARM что к чему
Всем добрый день!
Вопрос по IAR (6.5): как разместить переменную в сегменте eeprom?
(для контроллера STM32L152 EEPROM начинается с 0x08080000)
в конфиге для линкера это описано как
define symbol __region_EEPROM_start__ = 0x08080000;
define symbol __region_EEPROM_end__ = 0x08080FFF;
define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__];
place in EEPROM_region { section .eeprom };
Для AVR это выглядело как что-то вроде
__attribute__((section(".eeprom")))
в IAR соотв-но не работает.
Спасибо.
Вопрос по IAR (6.5): как разместить переменную в сегменте eeprom?
(для контроллера STM32L152 EEPROM начинается с 0x08080000)
в конфиге для линкера это описано как
define symbol __region_EEPROM_start__ = 0x08080000;
define symbol __region_EEPROM_end__ = 0x08080FFF;
define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__];
place in EEPROM_region { section .eeprom };
Для AVR это выглядело как что-то вроде
__attribute__((section(".eeprom")))
в IAR соотв-но не работает.
Спасибо.
Re: STM32 новичку в ARM что к чему
Вопрос типа "Как под виндами разместить переменную на жестком диске".
Никак. EEPROM - это периферия. Инициализируй, пиши, читай функциями. Как оно само в еепром телепортируется ?
Это не игрушечный атмел авр студио, где фрейморк незримо за тебя подшаманивет.
Никак. EEPROM - это периферия. Инициализируй, пиши, читай функциями. Как оно само в еепром телепортируется ?
Это не игрушечный атмел авр студио, где фрейморк незримо за тебя подшаманивет.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: STM32 новичку в ARM что к чему
Satyr, добрый день!
Вы уважаемый мной кот, ни в коем разе не хочу Вас обидеть.
Но мне кажется в данном случае Вы заблуждаетесь. в STM32L EEPROM отображается в общее адресное пространство на адреса начиная с 0x08080000.
Следовательно переменную можно разместить там явно, указав ее адрес. Или неявно, используя указатель, записать просто в ячейку.
И то и другое делается без всяких функций, таких как например в AVR.или
Вы уважаемый мной кот, ни в коем разе не хочу Вас обидеть.
Но мне кажется в данном случае Вы заблуждаетесь. в STM32L EEPROM отображается в общее адресное пространство на адреса начиная с 0x08080000.
Следовательно переменную можно разместить там явно, указав ее адрес. Или неявно, используя указатель, записать просто в ячейку.
И то и другое делается без всяких функций, таких как например в AVR.
Код: Выделить всё
*((uint32_t *)(0x08080000)) = 0xFEDCBA; Код: Выделить всё
uint32_t * pMyVal = (uint32_t *)0x08080000;
*pMyVal = 0xABCDEF; Ставим плюсы: )
Re: STM32 новичку в ARM что к чему
Да не всё так просто...
А Unlock кто будет делать?
А Unlock кто будет делать?
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32 новичку в ARM что к чему
Читать можно свободно. А вот с записью не получится. Области EEPROM и FLASH имеют защиту. При обращении к памяти в этой области ее необходимо предварительно снять. Учитывая это, механизм программной инициализации не может быть выражен путем VAR = VALUE. Запись во флеш и еепром имеет механизм, отличный от ОЗУ. Причем далеко не все STM32 имеют этот самый eeprom.ibiza11 писал(а):Satyr, добрый день!
Вы уважаемый мной кот, ни в коем разе не хочу Вас обидеть.
Но мне кажется в данном случае Вы заблуждаетесь. в STM32L EEPROM отображается в общее адресное пространство на адреса начиная с 0x08080000.
Следовательно переменную можно разместить там явно, указав ее адрес. Или неявно, используя указатель, записать просто в ячейку.
И то и другое делается без всяких функций, таких как например в AVR.илиКод: Выделить всё
*((uint32_t *)(0x08080000)) = 0xFEDCBA;Код: Выделить всё
uint32_t * pMyVal = (uint32_t *)0x08080000; *pMyVal = 0xABCDEF;
С уважением,
Виктор.
Виктор.


