STM32 прерывания NVIC и внешние прерывания.

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

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG, конечно так , там писано под платку у которой 16МГц...
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

Не хочу показаться назойливым, но я решил попробовать создать проект и в Keil uVision5. Уважаемый dosikus может быть Вы оцените правильность создания проекта в этой IDE?
З.Ы. У меня та жк программа с прерываниями работает.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

В Keil практически все так же как и в Iar.
Выкладывай...
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

Воть)
Вложения
test_Keil.zip
(471.44 КБ) 204 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

Компоненты RTE совсем необязательно юзать . CMSIS и так подключится .
В опциях препроцессора :
STM32F4XX - сие лишнее ибо уже есть :

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

#if !defined (STM32F4XX) 
  #define STM32F4XX
#endif
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

А как не подключить RTE компоненты? Я просто опять по статьям делал, плюс знание полученное по IAR. В общем после выбора директории предлагается выбрать компоненты для подключения к проекту, в том числе и стартап файл. Но его я не подключаю, а просто потом добавляю сам (т.к. с кейловским не работает). Это правильно? Или все же надо подключать стартап который предлагает Keil?
Вопрос.PNG
(85.39 КБ) 438 скачиваний
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

аа понял, просто не вибирать в этом окне CMSIS? то есть тупо создать свой пустой проект и подключить хедеры?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG , угу.
Научится создавать свой проект с минимумом сторонних компонентов .
Когда придет осознание что к чему в проекте - можно будет и RTE пощупать.
Хотя лучше без визардов - просто просмотреть что эти дрова содержат .
Почти все они заточены под ось и избыточны ...
TmYAG писал(а): Но его я не подключаю, а просто потом добавляю сам (т.к. с кейловским не работает). Это правильно? Или все же надо подключать стартап который предлагает Keil?
Проще и лучше иметь сей набор в виде шаблона.
При изучении все равно придется править систем_инит и хэдеры ...
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение Rimsky »

Всем, здравствуйте.
STM32F100C4T6
Использую внешнее прерывание PA0 - EXTI0,
код инициализации:

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

// --------------------------------------------------------------------------
// Процедура инициализации внешнего прерывания EXTI0
// --------------------------------------------------------------------------
void EXTI0_Config(void){

	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	/* Connect EXTI0 Line to PA0 pin */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

	/* Configure EXTI0 line */
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);

	/* Enable and set EXTI0 Interrupt to the lowest priority */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
В принципе все работает, но есть непонятки.

1. Есть процедуры, когда необходимо временно запретить это прерывание, например:

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

void SQW_on(void){
	NVIC_DisableIRQ(EXTI0_IRQn);
	uint8_t var = 0x00;
	ReadRTC(CONTROL, &var, 1);
	var &= ~(RS1 | RS2 | INTCN); 
	WriteRTC(CONTROL, &var, 1);
	EXTI_ClearITPendingBit(EXTI_Line0);
	NVIC_EnableIRQ(EXTI0_IRQn);
}
После вызова процедуры SQW_on(); прерывания по EXTI_Line0 отваливаются.
Подробнее:
если так:

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

void progPool(void){
        ...................
        SQW_on();
	NVIC_EnableIRQ(EXTI0_IRQn);
}
то прерывания по спаду фронта срабатывают,

если так:

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

void progPool(void){
        ...................
        SQW_on();
}
, то нет, хоты процедура NVIC_EnableIRQ(EXTI0_IRQn); в SQW_on(); есть.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение IfoR »

Это ещё что. У меня от внешних прерываний (кнопки, пластиковые, зашунтированные конденсаторами) контроллер вываливается в HardFault в совершенно рандомных случаях. Может вывалиться с первого нажатия на кнопку, а может и 10 нажатий выдержать. Судя по всему, у меня какие-то проблемы с разводной платы ибо, например, если замыкать кнопки аккуратно пинцетом, то шанс вылета становится меньше.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
es131245
Потрогал лапой паяльник
Сообщения: 369
Зарегистрирован: Пт фев 01, 2013 21:05:30

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение es131245 »

Вот на stm32f429i-disco

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

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"
#include "misc.h"

 uint16_t a; uint16_t b; uint16_t c;

void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
 {if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
   {GPIO_ToggleBits(GPIOG,GPIO_Pin_14);
    for(c=0;c<20;c++){for(a=0;a<5000;a++){for(b=0;b<50000;b++){}}}
    GPIO_ToggleBits(GPIOG,GPIO_Pin_14);}
  else
  {GPIO_ToggleBits(GPIOG,GPIO_Pin_13);
   for(c=0;c<20;c++){for(a=0;a<5000;a++){for(b=0;b<50000;b++){}}}
   GPIO_ToggleBits(GPIOG,GPIO_Pin_13);}
  EXTI_ClearITPendingBit(EXTI_Line0);}}


int main(void)
 { SystemInit();

 GPIO_InitTypeDef GPIO_InitStruct;
 EXTI_InitTypeDef EXTI_InitStruct;
 NVIC_InitTypeDef NVIC_InitStruct;
 GPIO_InitTypeDef initLed;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
 GPIO_Init(GPIOA,&GPIO_InitStruct);

 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);

 EXTI_InitStruct.EXTI_Line=EXTI_Line0;
 EXTI_InitStruct.EXTI_LineCmd=ENABLE;
 EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
 EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
 EXTI_Init(&EXTI_InitStruct);

 NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStruct);

 initLed.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
 initLed.GPIO_Mode=GPIO_Mode_OUT;
 initLed.GPIO_OType=GPIO_OType_PP;
 initLed.GPIO_Speed=GPIO_Speed_2MHz;
 initLed.GPIO_PuPd=GPIO_PuPd_DOWN;
 GPIO_Init(GPIOG,&initLed);

 while(1){}}
Ответить

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