STM32 прерывания NVIC и внешние прерывания.
Re: STM32 прерывания NVIC и внешние прерывания.
TmYAG, конечно так , там писано под платку у которой 16МГц...
- Реклама
Re: STM32 прерывания NVIC и внешние прерывания.
Не хочу показаться назойливым, но я решил попробовать создать проект и в Keil uVision5. Уважаемый dosikus может быть Вы оцените правильность создания проекта в этой IDE?
З.Ы. У меня та жк программа с прерываниями работает.
З.Ы. У меня та жк программа с прерываниями работает.
Re: STM32 прерывания NVIC и внешние прерывания.
В Keil практически все так же как и в Iar.
Выкладывай...
Выкладывай...
Re: STM32 прерывания NVIC и внешние прерывания.
Воть)
- Вложения
-
- test_Keil.zip
- (471.44 КБ) 203 скачивания
Re: STM32 прерывания NVIC и внешние прерывания.
Компоненты RTE совсем необязательно юзать . CMSIS и так подключится .
В опциях препроцессора :
STM32F4XX - сие лишнее ибо уже есть :
В опциях препроцессора :
STM32F4XX - сие лишнее ибо уже есть :
Код: Выделить всё
#if !defined (STM32F4XX)
#define STM32F4XX
#endif
- Реклама
Re: STM32 прерывания NVIC и внешние прерывания.
А как не подключить RTE компоненты? Я просто опять по статьям делал, плюс знание полученное по IAR. В общем после выбора директории предлагается выбрать компоненты для подключения к проекту, в том числе и стартап файл. Но его я не подключаю, а просто потом добавляю сам (т.к. с кейловским не работает). Это правильно? Или все же надо подключать стартап который предлагает Keil?
Re: STM32 прерывания NVIC и внешние прерывания.
аа понял, просто не вибирать в этом окне CMSIS? то есть тупо создать свой пустой проект и подключить хедеры?
Re: STM32 прерывания NVIC и внешние прерывания.
TmYAG , угу.
Научится создавать свой проект с минимумом сторонних компонентов .
Когда придет осознание что к чему в проекте - можно будет и RTE пощупать.
Хотя лучше без визардов - просто просмотреть что эти дрова содержат .
Почти все они заточены под ось и избыточны ...
При изучении все равно придется править систем_инит и хэдеры ...
Научится создавать свой проект с минимумом сторонних компонентов .
Когда придет осознание что к чему в проекте - можно будет и RTE пощупать.
Хотя лучше без визардов - просто просмотреть что эти дрова содержат .
Почти все они заточены под ось и избыточны ...
Проще и лучше иметь сей набор в виде шаблона.TmYAG писал(а): Но его я не подключаю, а просто потом добавляю сам (т.к. с кейловским не работает). Это правильно? Или все же надо подключать стартап который предлагает Keil?
При изучении все равно придется править систем_инит и хэдеры ...
- Rimsky
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Вт июн 15, 2010 07:16:42
- Откуда: Иркутск
- Контактная информация:
Re: STM32 прерывания NVIC и внешние прерывания.
Всем, здравствуйте.
STM32F100C4T6
Использую внешнее прерывание PA0 - EXTI0,
код инициализации:
В принципе все работает, но есть непонятки.
1. Есть процедуры, когда необходимо временно запретить это прерывание, например:
После вызова процедуры SQW_on(); прерывания по EXTI_Line0 отваливаются.
Подробнее:
если так:
то прерывания по спаду фронта срабатывают,
если так:
, то нет, хоты процедура NVIC_EnableIRQ(EXTI0_IRQn); в SQW_on(); есть.
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);
}Подробнее:
если так:
Код: Выделить всё
void progPool(void){
...................
SQW_on();
NVIC_EnableIRQ(EXTI0_IRQn);
}если так:
Код: Выделить всё
void progPool(void){
...................
SQW_on();
}- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: STM32 прерывания NVIC и внешние прерывания.
Это ещё что. У меня от внешних прерываний (кнопки, пластиковые, зашунтированные конденсаторами) контроллер вываливается в HardFault в совершенно рандомных случаях. Может вывалиться с первого нажатия на кнопку, а может и 10 нажатий выдержать. Судя по всему, у меня какие-то проблемы с разводной платы ибо, например, если замыкать кнопки аккуратно пинцетом, то шанс вылета становится меньше.
Re: STM32 прерывания NVIC и внешние прерывания.
Вот на 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){}}



