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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

B@R5uk, теперь можешь JLink-OB сделать http://forum.easyelectronics.ru/viewtop ... 39#p401739
Реклама
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

main.c
(2.85 КБ) 215 скачиваний
помогите с прерываниями
что не так тут??
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Добрый день не удается сбросить флаг внешнего прерывания

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

void EXTI1_IRQHandler(void)
{
	EXTI->PR |= EXTI_PR_PR1;
		

			 //сброс флага прерывания

			while(EXTI->PR & EXTI_PR_PR1)
			{
					EXTI->PR |= EXTI_PR_PR1;
			}

}	
ПО идее для запрета прерывания надо написать следующее

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

NVIC->ICER[0] |= NVIC_ICER_CLRENA_7;
Но это не работает может кто подскажет почему?
Аватара пользователя
amv2000
Опытный кот
Сообщения: 719
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

kryvoruk писал(а):что не так тут??
Ну Вы блин даёте, по всем веткам расплодили :) вот это

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

GPIO_MODER_MODER15_0+GPIO_MODER_MODER14_0+GPIO_MODER_MODER13_0+GPIO_MODER_MODER12_0+
                   GPIO_MODER_MODER11_0+GPIO_MODER_MODER10_0+GPIO_MODER_MODER9_0+GPIO_MODER_MODER8_0
что за фигня? Где Вы такое видели?
Реклама
Эиком - электронные компоненты и радиодетали
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

? Где Вы такое видели?[/quote]

Насчет наплодил - извините. модер долго не выставлял - еще раз прописал в другой теме.

Уважаемый. от способа прописания маска не меняется, учитывая что в них по одной 1 в разных битах. что А+А+А, что А|A|A, результат один.

Что касается прерываний. прерывания запускаются, если как писал в другом месте для РА0
Если MODER0=00 (линия на вход) или AFR0=0 (нулевая альтернативная ф-ия) но что не соответствует (на мое криворукое понимание) документации, должно быть MODER0=10 (альтернатив ф-ия вывода) и AFR0=F (альтернативн ф-ия 15).

И еще нашлося: при обращении к ф-ии определения приоритета прерывания NVIC_SetPriority или даже NVIC_GetPriority, которая менять ничего не должна - прерывание вызывается не корректно (два раза подряд))).

Если кто может ответить на мои вопросы, буду очень благодарен.
Последний раз редактировалось kryvoruk Вс июл 19, 2015 18:34:14, всего редактировалось 1 раз.
Реклама
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

baghear писал(а):Добрый день не удается сбросить флаг внешнего прерывания
.....
ПО идее для запрета прерывания надо написать следующее
......
Но это не работает может кто подскажет почему?
Попробую ответить, если не так пусть ГУРУ подправят.
1. Сброс флага прерывания и запрет прерывания - разные веСТЧи
2. Если прерывание по кнопке - возможно из-за дребезга после выхода из прерывания (сброса EXTI->PR |= EXTI_PR_PR1;) оное снова генерируется (устанавливается EXTI_PR_PR1, с вытекающими последствиями).

и еще 3. если хотите запретить прерывание - это лучше сделать в самом теле прерывания, иначе при выходе из оного оно же может опять вызваться до того как Вы его запретили. Кстати, интересно, если в п/п обработки этому же прерыванию назначить более высокий приоритет, оно само себя прервет????)))
и 4. если могут быть ложные вызовы прерывания (помехи, дребезг итд) то разрешать его(прерывание) целесообразно перед событием, предварительно очистив флаг.
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

В приведеном фрагменте кода я стараюсь сбросить флаг прерывания, кнопки у меня там нет, идут внешние импульсы.
Про запрет прерывания написал ниже, это уже другой вопрос.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 719
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

kryvoruk писал(а):что А+А+А, что А|A|A, результат один.
Ну Вам виднее

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

 А+А+А=11110

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

 А|A|A=1010
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

спор не о чем.
GPIO_MODER_MODER15_0+GPIO_MODER_MODER14_0+GPIO_MODER_MODER13_0+GPIO_MODER_MODER12_0+
GPIO_MODER_MODER11_0+GPIO_MODER_MODER10_0+GPIO_MODER_MODER9_0+GPIO_MODER_MODER8_0= то-же с ИЛИ.
копия из хедера, лишнее удалил. проверьте, отпишитись)))
#define GPIO_MODER_MODER8 ((uint32_t)0x00030000)
#define GPIO_MODER_MODER8_0 ((uint32_t)0x00010000)
#define GPIO_MODER_MODER8_1 ((uint32_t)0x00020000)
#define GPIO_MODER_MODER9 ((uint32_t)0x000C0000)
#define GPIO_MODER_MODER9_0 ((uint32_t)0x00040000)
#define GPIO_MODER_MODER9_1 ((uint32_t)0x00080000)
#define GPIO_MODER_MODER10 ((uint32_t)0x00300000)
#define GPIO_MODER_MODER10_0 ((uint32_t)0x00100000)
#define GPIO_MODER_MODER10_1 ((uint32_t)0x00200000)
#define GPIO_MODER_MODER11 ((uint32_t)0x00C00000)
#define GPIO_MODER_MODER11_0 ((uint32_t)0x00400000)
#define GPIO_MODER_MODER11_1 ((uint32_t)0x00800000)
#define GPIO_MODER_MODER12 ((uint32_t)0x03000000)
#define GPIO_MODER_MODER12_0 ((uint32_t)0x01000000)
#define GPIO_MODER_MODER12_1 ((uint32_t)0x02000000)
#define GPIO_MODER_MODER13 ((uint32_t)0x0C000000)
#define GPIO_MODER_MODER13_0 ((uint32_t)0x04000000)
#define GPIO_MODER_MODER13_1 ((uint32_t)0x08000000)
#define GPIO_MODER_MODER14 ((uint32_t)0x30000000)
#define GPIO_MODER_MODER14_0 ((uint32_t)0x10000000)
#define GPIO_MODER_MODER14_1 ((uint32_t)0x20000000)
#define GPIO_MODER_MODER15 ((uint32_t)0xC0000000)
#define GPIO_MODER_MODER15_0 ((uint32_t)0x40000000)
#define GPIO_MODER_MODER15_1 ((uint32_t)0x80000000)

жаль что на мои вопросы нет ответов.....
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

Сгенерировал в CubeMX шаблон проекта для кейл 4 для мигания светодиодом PC9 на плате STM32VLDISCOVERY. Вставил в главный цикл фрагмент:

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

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
int i;
for(i=0; i<100000;i++);
Прошил, мигает. Но почему-то после нажатия резет. Но снова прошить плату не могу! Выдергивал, вдергивал, пофигу.
Кейл говорит No target connected.
Удерживая резет получается соединиться и перепрошить.
Методом тыка определил, что проблема с соединением вызывается функцией HAL_Init(), которую Cube вписал в начало программы. Закомментил - все работает. Что же такое в ней находится, и как дальше жить?
В исходниках написано это

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

HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
    defined(STM32F102x6) || defined(STM32F102xB) || \
    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
    defined(STM32F105xC) || defined(STM32F107xC)

  /* Prefetch buffer is not available on value line devices */
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

  /* Init the low level hardware */
  HAL_MspInit();

  /* Return function status */
  return HAL_OK;
}
Дальше не копал, т.к. в stm все-равно как свинья в апельсинах. Но осадок насчет Cubе'а остался. Фактически для мигалки от него пользы ноль целых фиг десятых, а проблема на ровном месте.
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

baghear писал(а):Добрый день не удается сбросить флаг внешнего прерывания

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


ПО идее для запрета прерывания надо написать следующее
[code]
NVIC->ICER[0] |= NVIC_ICER_CLRENA_7;
Но это не работает может кто подскажет почему?
попробуйте через регистр EXTI_IMR: EXTI->IMR &= ~EXTI_IMR_MR1;
в ветке STM32 прерывания NVIC и внешние прерывания есть хорошие ссылки по прерываниям
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

ks0 писал(а): в stm все-равно как свинья в апельсинах.
Если так, то трудно помочь. В глубине инициализации есть отключение отладочных пинов, так что их можно использовать, как GPIO. Есть макроопределение (на вскидку не помню), которое говорит пре-процессору, что отладка нужна. Тогда этого не происходит.
Изучайте материальную часть.
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

Нашел! Прошелся вглубь: HAL_Init вызывает HAL_MspInit, а там стоит макрос __HAL_AFIO_REMAP_SWJ_DISABLE().
Стоит отметить, что в одном файле вместе с HAL_Init определена и функция HAL_MspInit, но она пуста, но стоит модификатор __weak. Что за модификатор? Никогда не сталкивался, по английски не понял ничего. Однако в другом файле (stm32f1xx_hal_msp.c) уже определена та же функция HAL_MspInit, но вот с этим макросом. Как я понял он запрещает отладку:

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

@note  DISABLE: JTAG-DP Disabled and SW-DP Disabled
Зачем Cube это сделал?! Непонятно! Закомментировал его и все работает. Народ с этим уже сталкивался http://stackoverflow.com/questions/3082 ... protection
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

Хорошо что нашел, это полезней чем копипастить. __weak означает, что если определить свою функцию с тем же названием, то она займет место этой "слабой" функции и линкер не будет ругаться.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Добрый день, объясните пожалуйста чем отличается запрет прерываний от маскировки прерывания?

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

EXTI->IMR &= ~EXTI_IMR_MR1;
от

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

NVIC->ICER[0] &= ~NVIC_ICER_CLRENA_7;
Аватара пользователя
amv2000
Опытный кот
Сообщения: 719
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

baghear писал(а):чем отличается запрет прерываний от маскировки прерывания?
Ну так в первом случае мы запрещаем прерывание в NVIC

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

NVIC->ICER[0] &= ~NVIC_ICER_CLRENA_7;
, а во втором запрещаем прерывания в периферии

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

EXTI->IMR &= ~EXTI_IMR_MR1;
т.е выбранной линии 1.
Для разрешения прерываний надо сделать три вещи:
1.Разрешить глобальные прерывания
2.Разрешить нужное прерывание в NVIC
3.Настроить и разрешить конкретные прерывания непосредственно в периферии. Т.е. настроить нужные события на прерывания.
У Вас собственно в данном случае 2 и 3 отключено.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Понял спасибо!!!
Аватара пользователя
amv2000
Опытный кот
Сообщения: 719
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

kryvoruk писал(а):спор не о чем.
Я извиняюсь, так и вопрос ни о чём.
Я не вижу, что Вы там пытаетесь настроить (у меня нет STM32F3 есть только 100 серия). Но осмелюсь предположить что Вы запутались в том, что прерывания это альтернативная функция, но для этого достаточно запустить тактирование альтернативных функций. В 100 серии это делается так

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

 RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; /* Прерывания - это альтернативная функция порта поэтому надо установить бит AFIO в регистре RCC_APB2ENR */
Если же настроить пин на альтернативную функцию, то он выполняет совсем другое назначение.
kryvoruk
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2015 17:58:34

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

Сообщение kryvoruk »

Если же настроить пин на альтернативную функцию, то он выполняет совсем другое назначение.[/quote]

спасибо, но в Ф3 такого регистра нет. тут, насколько понял надо вывод в альтернативную ф-ию (регистр MODER) и собственно альтернативная ф-ия (регистры AFR) все в GPIO. Прерывания то я запустил. Смущает, что не так кая я (криворуко) понял. А это значит что дальше могу более грубые ошибки делать, которые просто и однозначно не выловятся.
понимаю что специально читать доку и разбираться с Ф3 не будете. может отпишет кто из тех кто им занимается.
Как говорится спасибо за внимание))
Аватара пользователя
es131245
Потрогал лапой паяльник
Сообщения: 369
Зарегистрирован: Пт фев 01, 2013 21:05:30

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

Сообщение es131245 »

Люди развейте мою неуверенность.
На 407 вижу USB HS и FS. Подключаются они по разному.
У меня на плате нет места делать схему переключения.
Какую выбрать? (Скорости хватает и FS)
Ответить

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