Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-июл-11 23:44

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 51 сообщение ]  На страницу 1 2 3 4 »
Автор Сообщение
 Заголовок сообщения: Внешние прерывания
СообщениеДобавлено: 2010-окт-08 18:09 
Не в сети

Зарегистрирован: 2010-апр-02 13:46
Сообщения: 36
Откуда: Sunnyvale, CA
Не удаётся настроить внешнее прерывание, конкретно EXT_INT2 на ножке PB10. Устанавливаю альтернативный режим для этой ножки, делаю соответствующую запись в NVIC_ISER, но IRQ29 не возникает. В чём может быть дело? Вообще, по какому уровню должно срабатывать прерывание? В описании ничего не сказано.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2010-окт-11 10:19 
Не в сети

Зарегистрирован: 2010-апр-22 15:57
Сообщения: 109
Откуда: Москва, Зеленоград
Вот код, с которым у меня работает EXT_INT2:
#define EXT2_IRQ_EN	29		//номер в SETENA
void INIT_EXTINT2(){
PORTB->ANALOG |= 1<<10;		//для внешних прерываний - должен быть цифровой
PORTB->FUNC   |= 2<<20;		//альтернативная функция, PD10 = EXT_INT2
HWREG(SETENA) |= (1 << EXT2_IRQ_EN);		//регистр разрешения прерываний
}

void __irq EXT2_IRQHandler(){
/* обработка прерывания */
}
Ну и в StartUp - файле вектор прерываний EXT2_IRQHandler должен быть на своём 29-ом месте.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2010-окт-11 15:30 
Не в сети

Зарегистрирован: 2010-апр-02 13:46
Сообщения: 36
Откуда: Sunnyvale, CA
Именно так и делаю. Прерывания я получаю, только не вовремя. Какой всё-таки активный уровень у EXT_INT2, высокий или низкий?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2010-окт-12 13:07 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1302
Откуда: АО "ПКК Миландр"
СергейВ писал(а):
Именно так и делаю. Прерывания я получаю, только не вовремя. Какой всё-таки активный уровень у EXT_INT2, высокий или низкий?
Активный уровень высокий.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-14 08:57 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
Продолжаем... В прерывание EXT2 попадаю, в процессе обработки внешнее устройство снимает сигнал, но контроллер продолжает падать в прерывание.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-17 16:27 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
И так, за неделю копаний во "всём этом" выяснились следующие две основные вещи:
1. При компиляции arm-elf-gcc с флагом -Os при возвращении из прерывания контроллер падает в hard fault. Проблема в том что перед bx lr указатель стека равен нулю.
2. Ежели симулировать прерывание самим контроллером (соединяя две ножки снаружи), то, вроде бы, всё отрабатывает нормально. Если сигнал подает и снимает внешнее устройство, то контроллер мечется в прерывание сразу по выходу из него. При этом флаг на запрос не стоит (глядя из прерывания). Если прерывание запретить, то контроллер дорабатывает и выходит из него. Если разрешить - сразу же (без наличия сигнала запроса) сваливается в прерывание. кроме того, сваливается в прерывание сразу после его разрешения, но отрабатывает один раз и выходит.

Есть мысль о том, что подача/снятие сигнала должно происходить синхронно с тактами контроллера.

Ещё в понедельник попробуем запретить прерывание (через jtag), выйти, и из основной ветки посмотреть состояние флага запроса.

Всё это оносится к прерывания EXT_INT2 и EXT_INT3, на пинах PB10 и PE15 соответственно. На остальных не пробовали. На двух разных контроллерах: один шёл с демоплатой ВЕ91Т серии 1030, второй с приёмкой сирии 1120.

Пока сошлись на мнении что косяк в реализации внешнего прерывания.
Кто-нибудь сталкивался?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-20 15:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
prostoRoman писал(а):
Ещё в понедельник попробуем запретить прерывание (через jtag), выйти, и из основной ветки посмотреть состояние флага запроса.
В регистрах ISPR0 и ICPR0 стоят единицы на используемых прерываниях и, почему-то, ещё и DMA, хотя блок DMA выключен и не используется.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-23 10:01 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
Ну что, найдутся на официальном форуме компетентные люди, способные хотя бы задать наводящие вопросы с целью локализации и устанения проблемы. Или сделаем вид, что так и должно быть?

И к остальным форумчанам: есть опыт использования внешних прерываний на камнях линейки 1986ВЕ9х? Отпишитесь.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 07:38 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
Для полноты картины хотелось бы увидеть проект целиком, потому что из того огрызка что представлен в начале не понятен хотя бы тот момент, где и как настраивается частота периферии.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 08:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
Тот огрызок - это другая тема. Мои огрызки:
#define CAN1_CLOCK_ENABLE    0x00000001
#define CAN2_CLOCK_ENABLE    0x00000002
#define USB_CLOCK_ENABLE     0x00000004
#define EEPROM_CLOCK_ENABLE  0x00000008

#define RST_CLK_CLOCK_ENABLE 0x00000010
#define DMA_CLOCK_ENABLE     0x00000020
#define UART1_CLOCK_ENABLE   0x00000040
#define UART2_CLOCK_ENABLE   0x00000080

#define SPI1_CLOCK_ENABLE    0x00000100
//                           0x00000200 is empty
#define I2C_CLOCK_ENABLE     0x00000400
#define POWER_CLOCK_ENABLE   0x00000800

#define WWDT_CLOCK_ENABLE    0x00001000
#define IWDT_CLOCK_ENABLE    0x00002000
#define TIMER1_CLOCK_ENABLE  0x00004000
#define TIMER2_CLOCK_ENABLE  0x00008000

#define TIMER3_CLOCK_ENABLE  0x00010000
#define ADC_CLOCK_ENABLE     0x00020000
#define DAC_CLOCK_ENABLE     0x00040000
#define COMP_CLOCK_ENABLE    0x00080000

#define SPI2_CLOCK_ENABLE    0x00100000
#define PORTA_CLOCK_ENABLE   0x00200000
#define PORTB_CLOCK_ENABLE   0x00400000
#define PORTC_CLOCK_ENABLE   0x00800000

#define PORTD_CLOCK_ENABLE   0x01000000
#define PORTE_CLOCK_ENABLE   0x02000000
//                           0x04000000 is empty
#define BKP_CLOCK_ENABLE     0x08000000

//                           0x10000000 is empty
#define PORTF_CLOCK_ENABLE   0x20000000
#define EBUSC_CLOCK_ENABLE   0x40000000
//                           0x80000000 is empty



  RST_CLK->PER_CLOCK=( PORTA_CLOCK_ENABLE 
                     | PORTB_CLOCK_ENABLE 
                     | PORTC_CLOCK_ENABLE 
                     | PORTD_CLOCK_ENABLE 
                     | PORTE_CLOCK_ENABLE 
                     | PORTF_CLOCK_ENABLE 
                     | RST_CLK_CLOCK_ENABLE 
                     | UART1_CLOCK_ENABLE 
                     | UART2_CLOCK_ENABLE 
                     | TIMER1_CLOCK_ENABLE 
                     );

  PORTB->FUNC = (2<<(5*2)) | (2<<(6*2)) | (2<<(10*2)); // UART1 and EXT_INT2
  PORTB->ANALOG = 0xFFE0;    // кроме jtag
  //PORTB->PULL = 0x4000BFE0;      // исключая jtag
  PORTB->PD = 0x0;
  PORTB->PWR = 0xFFFFFC00;   // 3333 3333 3330 0000 //это в системе счисления с 
  PORTB->GFEN = 0x0;         //                       основанием 4 :-)
  PORTB->RXTX = 0x0280;      // 0000 0010 1000 0000 = 0x0280  UART2 RXen
  //temp = PORTB->OE;
  //temp |= 0xFBA0;
  PORTB->OE = 0xFBA0;//temp;          //   oooo oioo oioi iiii = 
                             // = 1111 1011 1010 0000 = 0xFBA0

  SYS->ISER00 = (1<<6) | (1<<7) | (1<<14) | (1<<29) | (1<<30); 
  //вкл. прерыв. UART1,   UART2,   TIM1,     EXT2,     EXT3


/*******************************************************************************
* Function Name  : EXT_INT2_IRQHandler
* Description    : This function handles EXT_INT2 interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void __attribute__((interrupt)) EXT_INT2_IRQHandler()
{
  //  PORTF->RXTX &= ~4;
  // XXXXXXXXXXXX_handler();
}

@
@ Startup code for Cortex-M3 microcontrollers.
@
@ Copyright (C) 2010 Serge Vakulenko, <serge@vak.ru>
@
@ This file is distributed in the hope that it will be useful, but WITHOUT
@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@ FITNESS FOR A PARTICULAR PURPOSE.
@
@ You can redistribute this file and/or modify it under the terms of the GNU
@ General Public License (GPL) as published by the Free Software Foundation;
@ either version 2 of the License, or (at your discretion) any later version.
@ See the accompanying file "COPYING.txt" for more details.
@
@ As a special exception to the GPL, permission is granted for additional
@ uses of the text contained in this file.  See the accompanying file
@ "COPY-UOS.txt" for details.
@
		.syntax unified

@---------------------------------------
@ Vector table for Cortex M3.
@
		.section .init
		.align	2
		.extern	main		@ startup
		.extern	NMI_Handler		@ handle faults and software interrupt
		.extern	HardFault_Handler 	@ handle supervisor call
		.extern MemManage_Handler
		.extern	BusFault_Handler	@ handle interrupts and systick
		.extern UsageFault_Handler	
		.extern SVC_Handler
		.extern DebugMon_Handler
		.extern PendSV_Handler
		.extern SysTick_Handler
		.extern CAN1_IRQHandler
		.extern	CAN2_IRQHandler      
		.extern	USB_IRQHandler                         
		.extern DMA_IRQHandler       
		.extern	UART1_IRQHandler     
		.extern UART2_IRQHandler     
		.extern SSP1_IRQHandler      
		.extern I2C_IRQHandler       
		.extern POWER_IRQHandler     
		.extern WWDG_IRQHandler      
		.extern	Timer1_IRQHandler    
		.extern	Timer2_IRQHandler    
		.extern	Timer3_IRQHandler    
		.extern	ADC_IRQHandler       
		.extern	COMPARATOR_IRQHandler
		.extern	SSP2_IRQHandler      
		.extern	BACKUP_IRQHandler    
		.extern	EXT_INT1_IRQHandler  
		.extern	EXT_INT2_IRQHandler  
		.extern	EXT_INT3_IRQHandler  
		.extern	EXT_INT4_IRQHandler  
			
			
			
			
			
			
			
			
			

		.thumb
_start_:	.global	_start_
		@
		@ End of user mode stack
		@
		.word  _estack			@ 0

		@
		@ Exception handlers.
		@
		.word	main     	      @ 1 - reset
		.word	NMI_Handler        	@ 2 - non-maskable interrupt
		.word	HardFault_Handler  	@ 3 - hard fault
		.word	MemManage_Handler  	@ 4 - memory management fault
		.word	BusFault_Handler   	@ 5 - bus fault
		.word	UsageFault_Handler 	@ 6 - usage fault
		.word	0                   	@ 7 - reserved
		.word	0                   	@ 8 - reserved
		.word	0                   	@ 9 - reserved
		.word	0                   	@ 10 - reserved
		.word	SVC_Handler        @ 11 - supervisor call
		.word	DebugMon_Handler   	@ 12 - reserved
		.word	0                   	@ 13 - reserved
		.word	PendSV_Handler     	@ 14 - software interrupt
		.word	SysTick_Handler    @ 15 - system timer tick
                        
		@
		@ IRQs.
		@
		.word	CAN1_IRQHandler      		@ 0 - CAN1
		.word	CAN2_IRQHandler      		@ 1 - CAN2
		.word	USB_IRQHandler       		@ 2 - USB
		.word	0                     		@ 3 - reserved
		.word	0                     		@ 4 - reserved
		.word	DMA_IRQHandler       		@ 5 - DMA
		.word	UART1_IRQHandler     		@ 6 - UART1
		.word	UART2_IRQHandler     		@ 7 - UART2
		.word	SSP1_IRQHandler      		@ 8 - SSP1
		.word	0                     		@ 9 - reserved
		.word	I2C_IRQHandler       		@ 10 - I2C
		.word	POWER_IRQHandler     		@ 11 - POWER
		.word	WWDG_IRQHandler      		@ 12 - WWDG
		.word	0                     		@ 13 - reserved
		.word	Timer1_IRQHandler    		@ 14 - Timer1
		.word	Timer2_IRQHandler    		@ 15 - Timer2
		.word	Timer3_IRQHandler    		@ 16 - Timer3
		.word	ADC_IRQHandler       		@ 17 - ADC
		.word	0                     		@ 18 - reserved
		.word	COMPARATOR_IRQHandler		@ 19 - COMPARATOR
		.word	SSP2_IRQHandler      		@ 20 - SSP2
		.word	0                     		@ 21 - reserved
		.word	0                     		@ 22 - reserved
		.word	0                     		@ 23 - reserved
		.word	0                     		@ 24 - reserved
		.word	0                     		@ 25 - reserved
		.word	0                     		@ 26 - reserved
		.word	BACKUP_IRQHandler    		@ 27 - BACKUP
		.word	EXT_INT1_IRQHandler  		@ 28 - EXT_INT1, pin PA[0]
		.word	EXT_INT2_IRQHandler  		@ 29 - EXT_INT2, pin PB[10]
		.word	EXT_INT3_IRQHandler  		@ 30 - EXT_INT3, pin PE[15]
		.word	EXT_INT4_IRQHandler  		@ 31 - EXT_INT4, pin PC[13]
                      
EXT_INT3 настраевается аналогично.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 11:23 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
prostoRoman писал(а):
В регистрах ISPR0 и ICPR0 стоят единицы на используемых прерываниях и, почему-то, ещё и DMA, хотя блок DMA выключен и не используется.
Получается следующая картина: при настройке порта на работу с EXT_INT2, если линия висит в воздухе (не подключена к внешнему устройству) или подключена, но внешнее устройство выдает не 0, то она автоматом подтягивается к 1, в результате эта 1 попадает в регистр ожидания прерывания - ISPR и как только прерывание разрешается, мы сразу попадаем в обработчик, хотя на самом деле прерывания на линии нет. Предлагаю вам следующее решение, притянуть линию к 0 с использование регистра PORTx_PULL и избавится от "ложных" значений в регистре ожидания прерывания(ICPR |= (1<<28 ) | (1<<29) | (1<<30) | (1<<31)). Относительно прерывания от DMA, первопричиной этого прерывания являются блоки SSP. Чтобы этого не возникало достаточно подать тактовую частоту на эти блоки и тоже избавиться от "ложных" значений в регистре ожидания прерывания(ICPR |= (1<<5)).


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 12:34 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
Tatyana писал(а):
Получается следующая картина: при настройке порта на работу с EXT_INT2, если линия висит в воздухе (не подключена к внешнему устройству) или подключена, но внешнее устройство выдает не 0, то она автоматом подтягивается к 1, в результате эта 1 попадает в регистр ожидания прерывания - ISPR и как только прерывание разрешается, мы сразу попадаем в обработчик, хотя на самом деле прерывания на линии нет. Предлагаю вам следующее решение, притянуть линию к 0 с использование регистра PORTx_PULL и избавится от "ложных" значений в регистре ожидания прерывания(ICPR |= (1<<28 ) | (1<<29) | (1<<30) | (1<<31)). Относительно прерывания от DMA, первопричиной этого прерывания являются блоки SSP. Чтобы этого не возникало достаточно подать тактовую частоту на эти блоки и тоже избавиться от "ложных" значений в регистре ожидания прерывания(ICPR |= (1<<5)).
На ножке ноль. Этот вопрос закрыт.
"Ложных" значений не наблюдается. На "всякий случай" пробовали сбрасывать - непомогло. Точнее камень не метается в прерывание из инициализации, но при возникновении прерывания зацикливается в обработчике. Если запретить прерывание "из вне" - выйдет, но стоит флаг запроса на это прерывание.
С DMA ясно. Оно не сильно беспокоит.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-авг-08 08:04 
Не в сети

Зарегистрирован: 2011-мар-17 07:58
Сообщения: 8
Не могу в описании найти регист отвечающий за выбор срабатывания прерывания для EXT_INT2: по фронту, по срезу или по уровню.
Подскажите или лучше дайте ссылку на литературу.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-авг-08 08:29 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1302
Откуда: АО "ПКК Миландр"
geotech писал(а):
Не могу в описании найти регист отвечающий за выбор срабатывания прерывания для EXT_INT2: по фронту, по срезу или по уровню.
Подскажите или лучше дайте ссылку на литературу.
всегда по высокому уровню.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 2011-авг-24 11:01 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1501
Откуда: Тула
geotech писал(а):
Не могу в описании найти регист отвечающий за выбор срабатывания прерывания для EXT_INT2: по фронту, по срезу или по уровню.
Подскажите или лучше дайте ссылку на литературу.
В спеке есть описание прирываний в целом (что процессор метаестя в него до тех пор, пока уровень высокий и т.п.). Описания конкретно внешнихь прерываний практически нет. Я сделал вывод что это оголенные сигналы NVIC'а. Это смело, но с Миландром по-другому нельзя =)

ЗЫ. Мой вопрос открыт, ради спортивного интереса.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 51 сообщение ]  На страницу 1 2 3 4 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB