STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Народ, подскажите - как сделать битовую флаговую переменную для флагов для STM32 под Keil - типа как сделать атомарный доступ к ней - в прерывании выставляю флаг, потом в основном цикле проверяю установленый флаг, иду на подпрограмму, и в подпрограмме сбросить флажок, чтобы другое прерывание в этот момент не помешало?
Хорошему коту и в декабре - март :)
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3372410#p3372410"]Народ, подскажите - как сделать битовую флаговую переменную для флагов для STM32 под Keil - типа как сделать атомарный доступ к ней - в прерывании выставляю флаг, потом в основном цикле проверяю установленый флаг, иду на подпрограмму, и в подпрограмме сбросить флажок, чтобы другое прерывание в этот момент не помешало?[/uquote]
Если нужна простая критическая секция для F0, то будет, примерно, так:

Код: Выделить всё

    uint32_t lockState;
    lockState = __get_PRIMASK();
    __set_PRIMASK(1); // выключаем все приоритетные прерывания

    // обновляем флаг

    __set_PRIMASK(lockState);
Но если мы защищаемся от того же прерывания, которое установило флаг в первый раз и оно может опять его установить до того, как он успеет сброситься, то смысла в такой защите не много, все равно событие потеряется...
Реклама
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Reflector",url="/forum/viewtopic.php?p=3372417#p3372417"]Если нужна простая критическая секция для F0, то будет, примерно, так:

Код: Выделить всё

    uint32_t lockState;
    lockState = __get_PRIMASK();
    __set_PRIMASK(1); // выключаем все приоритетные прерывания

    // обновляем флаг

    __set_PRIMASK(lockState);
Но если мы защищаемся от того же прерывания, которое установило флаг в первый раз и оно может опять его установить до того, как он успеет сброситься, то смысла в такой защите не много, все равно событие потеряется...[/uquote]
Благодарю, т.е. примерно как и для AVR - выключать прерывание, сбрасывать флаг, разрешать прерывание.
Хорошему коту и в декабре - март :)
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Frogfot писал(а):как сделать атомарный доступ к ней
bit banding.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Мурик",url="/forum/viewtopic.php?p=3372610#p3372610"]bit banding.[/uquote]
STM32F051
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Frogfot, используйте для этого обычное присваивание, которое выполняется за 1 инструкцию, то есть уже является атомарным. Саму переменную объявить как volatile, чтобы основной цикл видел её изменение. Если надо не допустить повторное прерывание, то отключите его до сброса флага прерывания.

Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.
Иван Сусанин - первый полупроводник :solder:
Реклама
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Myp3ik",url="/forum/viewtopic.php?p=3372677#p3372677"]Frogfot, используйте для этого обычное присваивание, которое выполняется за 1 инструкцию, то есть уже является атомарным. Саму переменную объявить как volatile, чтобы основной цикл видел её изменение. Если надо не допустить повторное прерывание, то отключите его до сброса флага прерывания.

Ещё надо понимать, что здесь прерывания могут вытеснять друг друга по приоритету в момент выполнения, поэтому многие костыли AVR8 здесь не нужны.[/uquote]
Благодарю, буду пробовать, я только начал изучать STM32, чтобы сбросить флаг события - нужно сделать чтение - модификацию - запись, вот чтобы в этот момент другое прерывание не влезло, ARMовский асм ещё недостаточно знаю.
Хорошему коту и в декабре - март :)
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Можно по классике

Код: Выделить всё

__disable_irq(); // Глобальный запрет прерываний
// Действие
__enable_irq();
или как советовали выше.
Иван Сусанин - первый полупроводник :solder:
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Почему то не смог прошить новую прошивку в родной stlink v2
Делал это и утилитой и отдельной программой с сайта st
Программатор коннектится, высвечивает 28 версию прошивки
В stlink utility версия 29, в отдельной утилите для прошивки stlink 007 версия 30
И там и там после нажатия «прошить» сразу выскакивает ошибка, что прошивка не возможна
Пробовал менять провод, пробовал на разных компах - результат один

Два разных китайских клона при этом прошились с первого раза
Один сразу на 30 версию, второй сначала 29, потом 30. Пробовал по разному
А оригинальный никак

Что с ним? Есть какие то шансы оживить?
В общем то на прошивку и отладку он работает, хотя при последней отладки были глюки когда он терял связь IAR и нужно было его выдернуть из usb и снова вставить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="axillent",url="/forum/viewtopic.php?p=3376494#p3376494"]Что с ним? Есть какие то шансы оживить?[/uquote]
Может перешить в j-link(ищи ST-Link Reflash Utility на сайте Segger), а потом лучше на нем и остаться, но можно откатиться назад и попробовать обновиться снова.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

j-link видимо не будет работать с stm8? я использую и stm8 и stm32
да и потребности в j-link нет, видимо что то не знаю
чем он лучше? не первый раз слышу
Грызет канифоль
Аватара пользователя
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Сообщение ozzy »

Привет всем, камень stm32f030f4

пытаюсь с помощью таймера 3 померять период и частоту шим, вход PA6,импульсы на нем есть,
но, таймер запускается, счет идет, а захвата по двум каналам не происходит, подскажите где я туплю :facepalm:

настройки таймера

Код: Выделить всё

 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

Сообщение Reflector »

[uquote="axillent",url="/forum/viewtopic.php?p=3376535#p3376535"]j-link видимо не будет работать с stm8?[/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

Сообщение Мурик »

ozzy писал(а):gpio_cfg.GPIO_Mode = GPIO_Mode_IN;
Должно быть GPIO_Mode_AF.
Грызет канифоль
Аватара пользователя
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Сообщение ozzy »

спасибо, исправил, все равно бестолку

переписал напрямую на регистрах - работает, spl зло
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Надеюсь строку раскомментировали?

Код: Выделить всё

GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
Я делал что-то подобное с использованием SPL и все работало. Выводы делайте сами.
Грызет канифоль
Аватара пользователя
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Сообщение ozzy »

да, раскоментировал

Добавлено after 1 minute 59 seconds:
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
хм , сенкс :facepalm:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[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 без каких-либо затруднений.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3377457#p3377457"]Достоинства, прямо скажем, не для всех и не на каждый день.[/uquote]
Допустим хочу я проверить какая версия сортировки быстрее, тогда пишем следующий код

Код: Выделить всё

	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]);
и получаем вывод прямо в консоли VS, для чего мне нужен только подключенный отладчик
Изображение

А был бы там не массив, а какой-нибудь дек, тогда любой assert кидал был в это же окно сообщения о возможных ошибках, красным цветом. Аналогично с любыми другими либами периферии. Например, вызвал setBaudRate(), а USART включен, значит на тех сериях STM32, где в таком случае запись в BRR игнорируется, получим в консоли ошибку. По-моему очень удобно, было бы странно хотеть получать сообщения о подобных ошибках не каждый день или ко всем проектам прикручивать для отладки USART или что-нибудь другое.

ps. Довольно неожиданно, что C++ sort в gcc не только заметно быстрее, но еще и почти в 2 раза меньше по размеру.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Reflector, semihosting тоже выведет результат в консоль через отладчик.
Ответить

Вернуться в «ARM»