реклама на сайте
подробности

 
 
> Непонятки с прерываниями M430F2122
rabbit-dj
сообщение Nov 9 2009, 01:47
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 11-07-09
Пользователь №: 51 138



Имеется следующая программка:

CODE
int __low_level_init(void)
{
int res=0;
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer
if (CALBC1_8MHZ ==0xFF || CALDCO_8MHZ == 0xFF)
{
while(1); // If calibration constants erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHz
DCOCTL = CALDCO_8MHZ;
//------ Èíèöèàëèçàöèÿ USART â ðåæèìå I2C -----------------
P3SEL |= 0x06; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMODE_3 + UCSYNC; // I2C Slave, synchronous mode
UCB0I2COA = 0x48; // Own Address is 048h
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB0I2CIE |= UCSTPIE + UCSTTIE; // Enable STT and STP interrupt
IE2 |= UCB0RXIE; // Enable RX interrupt
//------ Èíèöèàëèçàöèÿ TIMER_B ---------
TA1CCR0 = 30000;
TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode
TA1CCTL1 |= CCIE; // TACCR0 interrupt enabled

//---------------------------------------------------------
__enable_interrupt(); // Ãëîáàëüíîå ðàçðåøåíèå ïðåðûâàíèé
return 0;
}
//===========================================================
int main( void )
{

while (1)
{
PRxData = (unsigned char *)RxBuffer; // Start of RX buffer

if(RxComplete == 1)
{
RxComplete = 0;
write_flash(RxBuffer);
RXByteCtr = 0;
}
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
}
//------------------------------------------------------------------------------
// The USCI_B0 data ISR is used to move received data from the I2C master
// to the MSP430 memory.
//------------------------------------------------------------------------------
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
*PRxData++ = UCB0RXBUF; // Move RX data to address PRxData
RXByteCtr++; // Increment RX byte count

}
//------------------------------------------------------------------------------
// The USCI_B0 state ISR is used to wake up the CPU from LPM0 in order to
// process the received data in the main program. LPM0 is only exit in case
// of a (re-)start or stop condition when actual data was received.
//------------------------------------------------------------------------------
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{
UCB0STAT &= ~(UCSTPIFG + UCSTTIFG); // Clear interrupt flags
if (RXByteCtr) // Check RX byte counter
{
RxComplete = 1;
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0 if data was
}
}
//=============================================================
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMERA1_isr( void ) //
{

}
//======================= Çàïèñü âî ôëýø ========================
void write_flash(volatile unsigned int *Data)
{
unsigned int *Flash_ptr; // Flash pointer
char i;

Flash_ptr = (unsigned int *)SegOfData; // Initialize Flash pointer
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + ERASE; // Set Erase bit
*Flash_ptr = 0; // Dummy write to erase Flash seg
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i = 0; i < 32; i++)
{
*Flash_ptr++ = Data[i]; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit

}


В ней ведется прием по шине I2C и работает интервальный таймер. Проблема в том, что при разрешенном прерывании от таймера прерывания от модуля USCI игнорируются. Если отключить таймер, прием идет нормально. Объясните чайнику, в чем загвоздка?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Nov 9 2009, 16:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(rabbit-dj @ Nov 9 2009, 06:47) *
Объясните чайнику, в чем загвоздка?
Если вы посмотрите в datasheet раздел interrupt vector addresses и таблицу, приведенную там, то сможете заметить, что прерывания от TimerA имеют больший приоритет, чем прерывания от модуля USCI. И еще учитывайте, что при вызове любого прерывания флаг GIE автоматически сбрасывается. Поэтому вложенные прерывания невозможны, если вы сами не разрешите их принудительной установкой GIE внутри прерывания.
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016