STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
B@R5uk, теперь можешь JLink-OB сделать http://forum.easyelectronics.ru/viewtop ... 39#p401739
- Реклама
Re: STM32 новичку в ARM что к чему
помогите с прерываниями
что не так тут??
что не так тут??
Re: STM32 новичку в ARM что к чему
Добрый день не удается сбросить флаг внешнего прерывания
ПО идее для запрета прерывания надо написать следующее
Но это не работает может кто подскажет почему?
Код: Выделить всё
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 что к чему
Ну Вы блин даёте, по всем веткам расплодили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_0Re: STM32 новичку в ARM что к чему
? Где Вы такое видели?[/quote]
Насчет наплодил - извините. модер долго не выставлял - еще раз прописал в другой теме.
Уважаемый. от способа прописания маска не меняется, учитывая что в них по одной 1 в разных битах. что А+А+А, что А|A|A, результат один.
Что касается прерываний. прерывания запускаются, если как писал в другом месте для РА0
Если MODER0=00 (линия на вход) или AFR0=0 (нулевая альтернативная ф-ия) но что не соответствует (на мое криворукое понимание) документации, должно быть MODER0=10 (альтернатив ф-ия вывода) и AFR0=F (альтернативн ф-ия 15).
И еще нашлося: при обращении к ф-ии определения приоритета прерывания NVIC_SetPriority или даже NVIC_GetPriority, которая менять ничего не должна - прерывание вызывается не корректно (два раза подряд))).
Если кто может ответить на мои вопросы, буду очень благодарен.
Насчет наплодил - извините. модер долго не выставлял - еще раз прописал в другой теме.
Уважаемый. от способа прописания маска не меняется, учитывая что в них по одной 1 в разных битах. что А+А+А, что А|A|A, результат один.
Что касается прерываний. прерывания запускаются, если как писал в другом месте для РА0
Если MODER0=00 (линия на вход) или AFR0=0 (нулевая альтернативная ф-ия) но что не соответствует (на мое криворукое понимание) документации, должно быть MODER0=10 (альтернатив ф-ия вывода) и AFR0=F (альтернативн ф-ия 15).
И еще нашлося: при обращении к ф-ии определения приоритета прерывания NVIC_SetPriority или даже NVIC_GetPriority, которая менять ничего не должна - прерывание вызывается не корректно (два раза подряд))).
Если кто может ответить на мои вопросы, буду очень благодарен.
Последний раз редактировалось kryvoruk Вс июл 19, 2015 18:34:14, всего редактировалось 1 раз.
- Реклама
Re: STM32 новичку в ARM что к чему
Попробую ответить, если не так пусть ГУРУ подправят.baghear писал(а):Добрый день не удается сбросить флаг внешнего прерывания
.....
ПО идее для запрета прерывания надо написать следующее
......
Но это не работает может кто подскажет почему?
1. Сброс флага прерывания и запрет прерывания - разные веСТЧи
2. Если прерывание по кнопке - возможно из-за дребезга после выхода из прерывания (сброса EXTI->PR |= EXTI_PR_PR1;) оное снова генерируется (устанавливается EXTI_PR_PR1, с вытекающими последствиями).
и еще 3. если хотите запретить прерывание - это лучше сделать в самом теле прерывания, иначе при выходе из оного оно же может опять вызваться до того как Вы его запретили. Кстати, интересно, если в п/п обработки этому же прерыванию назначить более высокий приоритет, оно само себя прервет????)))
и 4. если могут быть ложные вызовы прерывания (помехи, дребезг итд) то разрешать его(прерывание) целесообразно перед событием, предварительно очистив флаг.
Re: STM32 новичку в ARM что к чему
В приведеном фрагменте кода я стараюсь сбросить флаг прерывания, кнопки у меня там нет, идут внешние импульсы.
Про запрет прерывания написал ниже, это уже другой вопрос.
Про запрет прерывания написал ниже, это уже другой вопрос.
- amv2000
- Опытный кот
- Сообщения: 719
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Ну Вам виднееkryvoruk писал(а):что А+А+А, что А|A|A, результат один.
Код: Выделить всё
А+А+А=11110Код: Выделить всё
А|A|A=1010Re: STM32 новичку в ARM что к чему
спор не о чем.
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)
жаль что на мои вопросы нет ответов.....
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)
жаль что на мои вопросы нет ответов.....
Re: STM32 новичку в ARM что к чему
Сгенерировал в CubeMX шаблон проекта для кейл 4 для мигания светодиодом PC9 на плате STM32VLDISCOVERY. Вставил в главный цикл фрагмент:
Прошил, мигает. Но почему-то после нажатия резет. Но снова прошить плату не могу! Выдергивал, вдергивал, пофигу.
Кейл говорит No target connected.
Удерживая резет получается соединиться и перепрошить.
Методом тыка определил, что проблема с соединением вызывается функцией HAL_Init(), которую Cube вписал в начало программы. Закомментил - все работает. Что же такое в ней находится, и как дальше жить?
В исходниках написано это
Дальше не копал, т.к. в stm все-равно как свинья в апельсинах. Но осадок насчет Cubе'а остался. Фактически для мигалки от него пользы ноль целых фиг десятых, а проблема на ровном месте.
Код: Выделить всё
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;
}Re: STM32 новичку в ARM что к чему
попробуйте через регистр EXTI_IMR: EXTI->IMR &= ~EXTI_IMR_MR1;baghear писал(а):Добрый день не удается сбросить флаг внешнего прерыванияНо это не работает может кто подскажет почему?Код: Выделить всё
ПО идее для запрета прерывания надо написать следующее [code] NVIC->ICER[0] |= NVIC_ICER_CLRENA_7;
в ветке STM32 прерывания NVIC и внешние прерывания есть хорошие ссылки по прерываниям
Re: STM32 новичку в ARM что к чему
Если так, то трудно помочь. В глубине инициализации есть отключение отладочных пинов, так что их можно использовать, как GPIO. Есть макроопределение (на вскидку не помню), которое говорит пре-процессору, что отладка нужна. Тогда этого не происходит.ks0 писал(а): в stm все-равно как свинья в апельсинах.
Изучайте материальную часть.
Re: STM32 новичку в ARM что к чему
Нашел! Прошелся вглубь: HAL_Init вызывает HAL_MspInit, а там стоит макрос __HAL_AFIO_REMAP_SWJ_DISABLE().
Стоит отметить, что в одном файле вместе с HAL_Init определена и функция HAL_MspInit, но она пуста, но стоит модификатор __weak. Что за модификатор? Никогда не сталкивался, по английски не понял ничего. Однако в другом файле (stm32f1xx_hal_msp.c) уже определена та же функция HAL_MspInit, но вот с этим макросом. Как я понял он запрещает отладку: Зачем Cube это сделал?! Непонятно! Закомментировал его и все работает. Народ с этим уже сталкивался http://stackoverflow.com/questions/3082 ... protection
Стоит отметить, что в одном файле вместе с HAL_Init определена и функция HAL_MspInit, но она пуста, но стоит модификатор __weak. Что за модификатор? Никогда не сталкивался, по английски не понял ничего. Однако в другом файле (stm32f1xx_hal_msp.c) уже определена та же функция HAL_MspInit, но вот с этим макросом. Как я понял он запрещает отладку:
Код: Выделить всё
@note DISABLE: JTAG-DP Disabled and SW-DP DisabledRe: STM32 новичку в ARM что к чему
Хорошо что нашел, это полезней чем копипастить. __weak означает, что если определить свою функцию с тем же названием, то она займет место этой "слабой" функции и линкер не будет ругаться.
Re: STM32 новичку в ARM что к чему
Добрый день, объясните пожалуйста чем отличается запрет прерываний от маскировки прерывания?
от
Код: Выделить всё
EXTI->IMR &= ~EXTI_IMR_MR1;Код: Выделить всё
NVIC->ICER[0] &= ~NVIC_ICER_CLRENA_7;- amv2000
- Опытный кот
- Сообщения: 719
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Ну так в первом случае мы запрещаем прерывание в NVICbaghear писал(а):чем отличается запрет прерываний от маскировки прерывания?
Код: Выделить всё
NVIC->ICER[0] &= ~NVIC_ICER_CLRENA_7;Код: Выделить всё
EXTI->IMR &= ~EXTI_IMR_MR1;У Вас собственно в данном случае 2 и 3 отключено.Для разрешения прерываний надо сделать три вещи:
1.Разрешить глобальные прерывания
2.Разрешить нужное прерывание в NVIC
3.Настроить и разрешить конкретные прерывания непосредственно в периферии. Т.е. настроить нужные события на прерывания.
Re: STM32 новичку в ARM что к чему
Понял спасибо!!!
- amv2000
- Опытный кот
- Сообщения: 719
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
Я извиняюсь, так и вопрос ни о чём.kryvoruk писал(а):спор не о чем.
Я не вижу, что Вы там пытаетесь настроить (у меня нет STM32F3 есть только 100 серия). Но осмелюсь предположить что Вы запутались в том, что прерывания это альтернативная функция, но для этого достаточно запустить тактирование альтернативных функций. В 100 серии это делается так
Код: Выделить всё
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; /* Прерывания - это альтернативная функция порта поэтому надо установить бит AFIO в регистре RCC_APB2ENR */Re: STM32 новичку в ARM что к чему
Если же настроить пин на альтернативную функцию, то он выполняет совсем другое назначение.[/quote]
спасибо, но в Ф3 такого регистра нет. тут, насколько понял надо вывод в альтернативную ф-ию (регистр MODER) и собственно альтернативная ф-ия (регистры AFR) все в GPIO. Прерывания то я запустил. Смущает, что не так кая я (криворуко) понял. А это значит что дальше могу более грубые ошибки делать, которые просто и однозначно не выловятся.
понимаю что специально читать доку и разбираться с Ф3 не будете. может отпишет кто из тех кто им занимается.
Как говорится спасибо за внимание))
спасибо, но в Ф3 такого регистра нет. тут, насколько понял надо вывод в альтернативную ф-ию (регистр MODER) и собственно альтернативная ф-ия (регистры AFR) все в GPIO. Прерывания то я запустил. Смущает, что не так кая я (криворуко) понял. А это значит что дальше могу более грубые ошибки делать, которые просто и однозначно не выловятся.
понимаю что специально читать доку и разбираться с Ф3 не будете. может отпишет кто из тех кто им занимается.
Как говорится спасибо за внимание))
Re: STM32 новичку в ARM что к чему
Люди развейте мою неуверенность.
На 407 вижу USB HS и FS. Подключаются они по разному.
У меня на плате нет места делать схему переключения.
Какую выбрать? (Скорости хватает и FS)
На 407 вижу USB HS и FS. Подключаются они по разному.
У меня на плате нет места делать схему переключения.
Какую выбрать? (Скорости хватает и FS)


