STM32 новичку в ARM что к чему
Народ, подскажите - как сделать битовую флаговую переменную для флагов для STM32 под Keil - типа как сделать атомарный доступ к ней - в прерывании выставляю флаг, потом в основном цикле проверяю установленый флаг, иду на подпрограмму, и в подпрограмме сбросить флажок, чтобы другое прерывание в этот момент не помешало?
Хорошему коту и в декабре - март 
- Реклама
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Frogfot",url="/forum/viewtopic.php?p=3372410#p3372410"]Народ, подскажите - как сделать битовую флаговую переменную для флагов для STM32 под Keil - типа как сделать атомарный доступ к ней - в прерывании выставляю флаг, потом в основном цикле проверяю установленый флаг, иду на подпрограмму, и в подпрограмме сбросить флажок, чтобы другое прерывание в этот момент не помешало?[/uquote]
Если нужна простая критическая секция для F0, то будет, примерно, так:
Но если мы защищаемся от того же прерывания, которое установило флаг в первый раз и оно может опять его установить до того, как он успеет сброситься, то смысла в такой защите не много, все равно событие потеряется...
Если нужна простая критическая секция для F0, то будет, примерно, так:
Код: Выделить всё
uint32_t lockState;
lockState = __get_PRIMASK();
__set_PRIMASK(1); // выключаем все приоритетные прерывания
// обновляем флаг
__set_PRIMASK(lockState);
[uquote="Reflector",url="/forum/viewtopic.php?p=3372417#p3372417"]Если нужна простая критическая секция для F0, то будет, примерно, так:
Но если мы защищаемся от того же прерывания, которое установило флаг в первый раз и оно может опять его установить до того, как он успеет сброситься, то смысла в такой защите не много, все равно событие потеряется...[/uquote]
Благодарю, т.е. примерно как и для AVR - выключать прерывание, сбрасывать флаг, разрешать прерывание.
Код: Выделить всё
uint32_t lockState;
lockState = __get_PRIMASK();
__set_PRIMASK(1); // выключаем все приоритетные прерывания
// обновляем флаг
__set_PRIMASK(lockState);
Благодарю, т.е. примерно как и для AVR - выключать прерывание, сбрасывать флаг, разрешать прерывание.
Хорошему коту и в декабре - март 
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Мурик",url="/forum/viewtopic.php?p=3372610#p3372610"]bit banding.[/uquote]
STM32F051
STM32F051
- Реклама
Frogfot, используйте для этого обычное присваивание, которое выполняется за 1 инструкцию, то есть уже является атомарным. Саму переменную объявить как volatile, чтобы основной цикл видел её изменение. Если надо не допустить повторное прерывание, то отключите его до сброса флага прерывания.
Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.
Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.
Иван Сусанин - первый полупроводник 
[uquote="Myp3ik",url="/forum/viewtopic.php?p=3372677#p3372677"]Frogfot, используйте для этого обычное присваивание, которое выполняется за 1 инструкцию, то есть уже является атомарным. Саму переменную объявить как volatile, чтобы основной цикл видел её изменение. Если надо не допустить повторное прерывание, то отключите его до сброса флага прерывания.
Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.[/uquote]
Благодарю, буду пробовать, я только начал изучать STM32, чтобы сбросить флаг события - нужно сделать чтение - модификацию - запись, вот чтобы в этот момент другое прерывание не влезло, ARMовский асм ещё недостаточно знаю.
Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.[/uquote]
Благодарю, буду пробовать, я только начал изучать STM32, чтобы сбросить флаг события - нужно сделать чтение - модификацию - запись, вот чтобы в этот момент другое прерывание не влезло, ARMовский асм ещё недостаточно знаю.
Хорошему коту и в декабре - март 
Можно по классике
или как советовали выше.
Код: Выделить всё
__disable_irq(); // Глобальный запрет прерываний
// Действие
__enable_irq();
Иван Сусанин - первый полупроводник 
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Почему то не смог прошить новую прошивку в родной stlink v2
Делал это и утилитой и отдельной программой с сайта st
Программатор коннектится, высвечивает 28 версию прошивки
В stlink utility версия 29, в отдельной утилите для прошивки stlink 007 версия 30
И там и там после нажатия «прошить» сразу выскакивает ошибка, что прошивка не возможна
Пробовал менять провод, пробовал на разных компах - результат один
Два разных китайских клона при этом прошились с первого раза
Один сразу на 30 версию, второй сначала 29, потом 30. Пробовал по разному
А оригинальный никак
Что с ним? Есть какие то шансы оживить?
В общем то на прошивку и отладку он работает, хотя при последней отладки были глюки когда он терял связь IAR и нужно было его выдернуть из usb и снова вставить
Делал это и утилитой и отдельной программой с сайта st
Программатор коннектится, высвечивает 28 версию прошивки
В stlink utility версия 29, в отдельной утилите для прошивки stlink 007 версия 30
И там и там после нажатия «прошить» сразу выскакивает ошибка, что прошивка не возможна
Пробовал менять провод, пробовал на разных компах - результат один
Два разных китайских клона при этом прошились с первого раза
Один сразу на 30 версию, второй сначала 29, потом 30. Пробовал по разному
А оригинальный никак
Что с ним? Есть какие то шансы оживить?
В общем то на прошивку и отладку он работает, хотя при последней отладки были глюки когда он терял связь IAR и нужно было его выдернуть из usb и снова вставить
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="axillent",url="/forum/viewtopic.php?p=3376494#p3376494"]Что с ним? Есть какие то шансы оживить?[/uquote]
Может перешить в j-link(ищи ST-Link Reflash Utility на сайте Segger), а потом лучше на нем и остаться, но можно откатиться назад и попробовать обновиться снова.
Может перешить в j-link(ищи ST-Link Reflash Utility на сайте Segger), а потом лучше на нем и остаться, но можно откатиться назад и попробовать обновиться снова.
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
j-link видимо не будет работать с stm8? я использую и stm8 и stm32
да и потребности в j-link нет, видимо что то не знаю
чем он лучше? не первый раз слышу
да и потребности в j-link нет, видимо что то не знаю
чем он лучше? не первый раз слышу
Привет всем, камень stm32f030f4
пытаюсь с помощью таймера 3 померять период и частоту шим, вход PA6,импульсы на нем есть,
но, таймер запускается, счет идет, а захвата по двум каналам не происходит, подскажите где я туплю
настройки таймера
собственно пытаюсь считать с таймера , там нули, под отладчиком таймер считает и переполняется
пробывал делать через прерывание - нет входа в прерывание
частота тактирования таймера 48 мгц, частота шим 32 кгц
пытаюсь с помощью таймера 3 померять период и частоту шим, вход PA6,импульсы на нем есть,
но, таймер запускается, счет идет, а захвата по двум каналам не происходит, подскажите где я туплю
настройки таймера
Код: Выделить всё
GPIO_InitTypeDef gpio_cfg;
GPIO_StructInit(&gpio_cfg);
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
gpio_cfg.GPIO_Mode = GPIO_Mode_IN;
gpio_cfg.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_cfg.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &gpio_cfg);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef timer_base;
// настройки таймера
timer_base.TIM_Period = 0xffff;
timer_base.TIM_Prescaler = 0;
timer_base.TIM_ClockDivision = 0;
timer_base.TIM_CounterMode = TIM_CounterMode_Up;
timer_base.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &timer_base);
TIM_ICInitTypeDef timer_base_ch;
/* Входы захвата: Ch1 */
// канал захвата 1 сработка по нарастающему фронту
// Измерение периода
timer_base_ch.TIM_Channel = TIM_Channel_1;
timer_base_ch.TIM_ICFilter = 0;
timer_base_ch.TIM_ICPolarity = TIM_ICPolarity_Falling;
timer_base_ch.TIM_ICPrescaler = TIM_ICPSC_DIV1;
timer_base_ch.TIM_ICSelection = TIM_ICSelection_IndirectTI;
TIM_PWMIConfig(TIM3, &timer_base_ch);
/* Входы захвата: Ch2 */
// канал захвата 2 сработка по спадающему фронту
// Измерение длительности ШИМ
timer_base_ch.TIM_Channel = TIM_Channel_2;
timer_base_ch.TIM_ICFilter = 0;
timer_base_ch.TIM_ICPolarity = TIM_ICPolarity_Rising;
timer_base_ch.TIM_ICPrescaler = TIM_ICPSC_DIV1;
timer_base_ch.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_PWMIConfig(TIM3, &timer_base_ch);
/* Выбираем источник для триггера: вход 1 (PA6) */
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
// Сброс и перезапуск таймера по каналу 1 (по нарастающему импульсу)
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
TIM_Cmd(TIM3, ENABLE);Код: Выделить всё
period_capture = TIM_GetCapture1(TIM3);
duty_cycle_capture = TIM_GetCapture2(TIM3);частота тактирования таймера 48 мгц, частота шим 32 кгц
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="axillent",url="/forum/viewtopic.php?p=3376535#p3376535"]j-link видимо не будет работать с stm8?[/uquote]
Не будет, но после прошивки та же утилита позволяет перепрошиться обратно в st-link, может после этого и проапдейтится.
Добавлено after 11 minutes 16 seconds:
[uquote="ozzy",url="/forum/viewtopic.php?p=3376554#p3376554"]RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);[/uquote]
Не будет, но после прошивки та же утилита позволяет перепрошиться обратно в st-link, может после этого и проапдейтится.
Для меня основное преимущество в наличии RTT, можно быстро выводить отладочную информацию по тем же двум проводам отладки. Ну и visualgdb работает с j-link напрямую, а с st-link через медленный OpenOCD...чем он лучше? не первый раз слышу
Добавлено after 11 minutes 16 seconds:
[uquote="ozzy",url="/forum/viewtopic.php?p=3376554#p3376554"]RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);[/uquote]
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Должно быть GPIO_Mode_AF.ozzy писал(а):gpio_cfg.GPIO_Mode = GPIO_Mode_IN;
спасибо, исправил, все равно бестолку
переписал напрямую на регистрах - работает, spl зло
переписал напрямую на регистрах - работает, spl зло
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Надеюсь строку раскомментировали?Я делал что-то подобное с использованием SPL и все работало. Выводы делайте сами.
Код: Выделить всё
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);да, раскоментировал
Добавлено after 1 minute 59 seconds:
Добавлено after 1 minute 59 seconds:
хм , сенксRCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="Reflector",url="/forum/viewtopic.php?p=3376580#p3376580"]Для меня основное преимущество в наличии RTT, можно быстро выводить отладочную информацию по тем же двум проводам отладки. Ну и visualgdb работает с j-link напрямую, а с st-link через медленный OpenOCD...[/uquote]
Достоинства, прямо скажем, не для всех и не на каждый день. Единственный раз, когда мне пришло в голову зашить ST-Link J-Link-ом -- это в процессе знакомства с nRF52832. Знакомства в такой форме, правда, не состоялось, т.к. новообретенный J-Link ни с какими МК кроме STM32 общаться не пожелал. Пришлось обращать его обратно в ST-Link и вот тогда через него и кейл и иар и даже ардуино иде работали с nRF52832 без каких-либо затруднений.
Достоинства, прямо скажем, не для всех и не на каждый день. Единственный раз, когда мне пришло в голову зашить ST-Link J-Link-ом -- это в процессе знакомства с nRF52832. Знакомства в такой форме, правда, не состоялось, т.к. новообретенный J-Link ни с какими МК кроме STM32 общаться не пожелал. Пришлось обращать его обратно в ST-Link и вот тогда через него и кейл и иар и даже ардуино иде работали с nRF52832 без каких-либо затруднений.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="a5021",url="/forum/viewtopic.php?p=3377457#p3377457"]Достоинства, прямо скажем, не для всех и не на каждый день.[/uquote]
Допустим хочу я проверить какая версия сортировки быстрее, тогда пишем следующий код
и получаем вывод прямо в консоли VS, для чего мне нужен только подключенный отладчик

А был бы там не массив, а какой-нибудь дек, тогда любой assert кидал был в это же окно сообщения о возможных ошибках, красным цветом. Аналогично с любыми другими либами периферии. Например, вызвал setBaudRate(), а USART включен, значит на тех сериях STM32, где в таком случае запись в BRR игнорируется, получим в консоли ошибку. По-моему очень удобно, было бы странно хотеть получать сообщения о подобных ошибках не каждый день или ко всем проектам прикручивать для отладки USART или что-нибудь другое.
ps. Довольно неожиданно, что C++ sort в gcc не только заметно быстрее, но еще и почти в 2 раза меньше по размеру.
Допустим хочу я проверить какая версия сортировки быстрее, тогда пишем следующий код
Код: Выделить всё
uint8_t arr[] = {10, 50, 30, 20};
PerfCounter pc;
pc.start();
std::sort(arr, arr + 4);
//qsort((void*)arr, 4, sizeof(uint8_t), cmpfunc);
uint32_t elapsed = pc.getElapsedTime();
rtt.printf("sort: %i\n", elapsed);
for (uint32_t i = 0; i < std::size(arr); i++)
rtt.printf("%i\n", arr[i]);

А был бы там не массив, а какой-нибудь дек, тогда любой assert кидал был в это же окно сообщения о возможных ошибках, красным цветом. Аналогично с любыми другими либами периферии. Например, вызвал setBaudRate(), а USART включен, значит на тех сериях STM32, где в таком случае запись в BRR игнорируется, получим в консоли ошибку. По-моему очень удобно, было бы странно хотеть получать сообщения о подобных ошибках не каждый день или ко всем проектам прикручивать для отладки USART или что-нибудь другое.
ps. Довольно неожиданно, что C++ sort в gcc не только заметно быстрее, но еще и почти в 2 раза меньше по размеру.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Reflector, semihosting тоже выведет результат в консоль через отладчик.


