Перейти к содержанию
    

AT91SAM7S256 не срабатывает прерывание UART

при получении байта вызывается прерывание UART1 и процессор попадает в область FIQ_STACK$$Limit:

и там крутится....

 

помогите найти ошибку

в приложении - проект для IAR5.41

 

код main.c

#include "at91sam7s256.h"
#include <intrinsics.h>
//------------------------------------------------------------------------------
#define Main_Oscillator 10000000 // 10.000 MHz
#define UART_CLOCK_9600 16 // 2500000/(9600x16) 
#define UART_CONVERTER_TURN_ON (1<<15) // PA15 
//------------------------------------------------------------------------------
volatile unsigned int i = 0;
volatile unsigned int RX_FLAG = 0;
//------------------------------------------------------------------------------
void LowLevelInit (void); // runs once at startup
void defaultSpuriousHandler (void) {return;}; 
void defaultFiqHandler (void) {return;};
void defaultIrqHandler (void) {return;};
void init_COM1 (void);
void init_IRQ (void);
//------------------------------------------------------------------------------
void Usart1IrqHandler (void);
//------------------------------------------------------------------------------
int main (void) { 
init_COM1 ();
init_IRQ ();
AT91C_BASE_PIOA->PIO_SODR = UART_CONVERTER_TURN_ON; // Enable MAX3237 conveter
__enable_interrupt(); 
for (;;) {	  
	while (!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)==1); 
	AT91C_BASE_US1->US_THR = AT91C_BASE_US1->US_RHR; // simple RX1 -> TX1 works fine! 
	for (i = 0; i < 10000; i++) {
		asm ("nop");  // simple NoOPeration instruction
	}
	if (RX_FLAG) {
		RX_FLAG = 0;
		while (!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)==1); 
		AT91C_BASE_US1->US_THR = 'Y';
	}
}
}
//------------------------------------------------------------------------------
void LowLevelInit (void) {
unsigned char i;
unsigned int tmp = 0; 
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Watchdog disable
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(22<<16)) | AT91C_MC_FWS_0FWS; // Set Flash Wait sate: 0 wait states
AT91C_BASE_PMC->PMC_MOR = (AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN; // Initialize Main_Oscillator
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
tmp =  AT91C_BASE_PMC->PMC_MCKR; // Switch Master Clock (MCK) to Main_Oscillator
tmp &= ~AT91C_PMC_CSS;
tmp |= AT91C_PMC_CSS_MAIN_CLK;
AT91C_BASE_PMC->PMC_MCKR = tmp;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // clock debounce
tmp =  AT91C_BASE_PMC->PMC_MCKR; // set PRESCALER 
tmp &= ~AT91C_PMC_PRES;
tmp |= AT91C_PMC_PRES_CLK_4; // divisor of main clock is 4
AT91C_BASE_PMC->PMC_MCKR = tmp;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // clock debounce  
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; // Initialize AIC
AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; // map default interrupt handlers
for (i = 1; i < 31; i++) AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; // map default interrupt handlers
AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // map default interrupt handlers
for (i = 0; i < 8; i++) AT91C_BASE_AIC->AIC_EOICR = 0; // Unstack nested interrupts
AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Enable Debug mode
AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB; // Remap the internal SRAM at 0x0  
AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); // Disable RTT and PIT interrupts 
AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; 
AT91C_BASE_PMC->PMC_PCER = (1UL<<AT91C_ID_UDP); // Disable the USB Transceiver, DDM è DDP conneted to GND
AT91C_BASE_UDP->UDP_TXVC = AT91C_UDP_TXVDIS;
AT91C_BASE_PMC->PMC_PCDR = (1UL<<AT91C_ID_UDP); // disable USB clock
AT91C_BASE_ADC->ADC_MR = AT91C_ADC_SLEEP_MODE; // Analog-to-Digital Converter de-activated
}
//------------------------------------------------------------------------------
void init_COM1 (void) {  
AT91C_BASE_PMC->PMC_PCER = (1UL<<AT91C_ID_PIOA); // Enable the PIO clock 
AT91C_BASE_PIOA->PIO_IDR = UART_CONVERTER_TURN_ON; // Pin Interrupt Disable Register PA15   
AT91C_BASE_PIOA->PIO_PER = UART_CONVERTER_TURN_ON; // PIO Enable Register	   
AT91C_BASE_PIOA->PIO_PPUDR = UART_CONVERTER_TURN_ON; // Pull-Up Disable Resistor
AT91C_BASE_PIOA->PIO_CODR = UART_CONVERTER_TURN_ON; // clear Output Data Register
AT91C_BASE_PIOA->PIO_OER = UART_CONVERTER_TURN_ON; // Output Enable Register  
AT91C_BASE_PIOA->PIO_PDR = (1UL<<21) | (1UL<<22); // Disables the PIO from controlling the corresponding pin (enables peripheral control of the pin)
AT91C_BASE_PIOA->PIO_ASR = (1UL<<21) | (1UL<<22); // Assigns the I/O line to the Peripheral A function PA21 and PA22
AT91C_BASE_PIOA->PIO_BSR = 0; // Assigns the I/O line to the Peripheral B function 
AT91C_BASE_PMC->PMC_PCER = (1UL<<AT91C_ID_US1); //enable the clock of UART
AT91C_BASE_US1->US_RTOR = 0; // receiver time-out (disabled)
AT91C_BASE_US1->US_TTGR = 0; // transmitter timeguard (disabled)
AT91C_BASE_US1->US_BRGR = UART_CLOCK_9600; // set baud rate divisor register EXT_CLOCK_DIV/9600x16 
AT91C_BASE_US1->US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode 
						AT91C_US_CLKS_CLOCK	|  // Clock = MCK 
						AT91C_US_CHRL_8_BITS   |  // 8-bit Data  
						AT91C_US_PAR_NONE	  |  // No Parity   
						AT91C_US_NBSTOP_1_BIT;	// 1 Stop Bit  
}
//------------------------------------------------------------------------------
void init_IRQ (void) {
AT91C_BASE_AIC->AIC_IDCR = (1<<AT91C_ID_US1); // Disable USART1 interrupt in AIC 
AT91C_BASE_US1->US_CR = AT91C_US_RSTRX |  // reset receiver
			  AT91C_US_RSTTX | // reset transmitter
			  AT91C_US_RXDIS | // disable receiver
			  AT91C_US_TXDIS; // disable transmitter	 
AT91C_BASE_US1->US_IER = 0x00; // no usart1 interrupts enabled  (no effect)
AT91C_BASE_US1->US_IDR = 0xFFFF; // disable all USART1 interrupts   
AT91C_BASE_AIC->AIC_SVR [AT91C_ID_US1] = (unsigned int) Usart1IrqHandler;
AT91C_BASE_AIC->AIC_SMR [AT91C_ID_US1] = (AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x4 ); // priority (4) in AIC Source Mode Reg
// Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = (1UL<<AT91C_ID_US1);	
AT91C_BASE_AIC->AIC_IECR = (1UL<<AT91C_ID_US1);
// enable the USART1 receive interrupt
AT91C_BASE_US1->US_IER = AT91C_US_RXRDY; // enable RXRDY usart1 receive interrupt
AT91C_BASE_US1->US_IDR = ~AT91C_US_RXRDY; // disable all interrupts except RXRDY  
// enable the USART1 receiver and transmitter
AT91C_BASE_US1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;  
}
//------------------------------------------------------------------------------
void Usart1IrqHandler (void) { 
if ((AT91C_BASE_US1->US_CSR & AT91C_US_RXRDY) == AT91C_US_RXRDY) { // we have a receive interrupt
	RX_FLAG = 1;
}
}
//------------------------------------------------------------------------------

 

код startup.s

		
MODULE  ?cstartup

  ;; Forward declaration of sections.
	SECTION IRQ_STACK:DATA:NOROOT(2)
	SECTION CSTACK:DATA:NOROOT(3)

//------------------------------------------------------------------------------
//		 Headers
//------------------------------------------------------------------------------

#define __ASSEMBLY__
#include "at91sam7s256.h"

//------------------------------------------------------------------------------
//		 Definitions
//------------------------------------------------------------------------------

#define ARM_MODE_ABT	 0x17
#define ARM_MODE_FIQ	 0x11
#define ARM_MODE_IRQ	 0x12
#define ARM_MODE_SVC	 0x13
#define ARM_MODE_SYS	 0x1F

#define I_BIT			0x80
#define F_BIT			0x40

//------------------------------------------------------------------------------
//		 Startup routine
//------------------------------------------------------------------------------

/*
  Exception vectors
*/
	SECTION .vectors:CODE:NOROOT(2)

	PUBLIC  resetVector
	PUBLIC  irqHandler

	EXTERN  Undefined_Handler
	EXTERN  SWI_Handler
	EXTERN  Prefetch_Handler
	EXTERN  Abort_Handler
	EXTERN  FIQ_Handler

	ARM

__iar_init$$done:			 ; The interrupt vector is not needed
						  ; until after copy initialization is done

resetVector:
  ; All default exception handlers (except reset) are
  ; defined as weak symbol definitions.
  ; If a handler is defined by the application it will take precedence.
	LDR	 pc, =resetHandler	  ; Reset
	LDR	 pc, Undefined_Addr	 ; Undefined instructions
	LDR	 pc, SWI_Addr		; Software interrupt (SWI/SYS)
	LDR	 pc, Prefetch_Addr	  ; Prefetch abort
	LDR	 pc, Abort_Addr		 ; Data abort
	B	   .					  ; RESERVED
	LDR	 pc, =irqHandler		; IRQ
	LDR	 pc, FIQ_Addr		; FIQ

Undefined_Addr: DCD   Undefined_Handler
SWI_Addr:	   DCD   SWI_Handler
Prefetch_Addr:  DCD   Prefetch_Handler
Abort_Addr:	 DCD   Abort_Handler
FIQ_Addr:	   DCD   FIQ_Handler

/*
  Handles incoming interrupt requests by branching to the corresponding
  handler, as defined in the AIC. Supports interrupt nesting.
*/
irqHandler:
	/* Save interrupt context on the stack to allow nesting */
	SUB	 lr, lr, #4
	STMFD   sp!, {lr}
	MRS	 lr, SPSR
	STMFD   sp!, {r0, lr}

	/* Write in the IVR to support Protect Mode */
	LDR	 lr, =AT91C_BASE_AIC
	LDR	 r0, [r14, #AIC_IVR]
	STR	 lr, [r14, #AIC_IVR]

	/* Branch to interrupt handler in Supervisor mode */
	MSR	 CPSR_c, #ARM_MODE_SYS
	STMFD   sp!, {r1-r3, r4, r12, lr}
	MOV	 lr, pc
	BX	  r0
	LDMIA   sp!, {r1-r3, r4, r12, lr}
	MSR	 CPSR_c, #ARM_MODE_IRQ | I_BIT

	/* Acknowledge interrupt */
	LDR	 lr, =AT91C_BASE_AIC
	STR	 lr, [r14, #AIC_EOICR]

	/* Restore interrupt context and branch back to calling code */
	LDMIA   sp!, {r0, lr}
	MSR	 SPSR_cxsf, lr
	LDMIA   sp!, {pc}^


/*
  After a reset, execution starts here, the mode is ARM, supervisor
  with interrupts disabled.
  Initializes the chip and branches to the main() function.
*/
	SECTION .cstartup:CODE:NOROOT(2)

	PUBLIC  resetHandler
	EXTERN  LowLevelInit
	EXTERN  ?main
	REQUIRE resetVector
	ARM

resetHandler:

	/* Set pc to actual code location (i.e. not in remap zone) */
	LDR	 pc, =label

	/* Perform low-level initialization of the chip using LowLevelInit() */
label:
	LDR	 r0, =LowLevelInit
	LDR	 r4, =SFE(CSTACK)
	MOV	 sp, r4
	MOV	 lr, pc
	BX	  r0

	/* Set up the interrupt stack pointer. */
	MSR	 cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT	; Change the mode
	LDR	 sp, =SFE(IRQ_STACK)

	/* Set up the SYS stack pointer. */
	MSR	 cpsr_c, #ARM_MODE_SYS | F_BIT			; Change the mode
	LDR	 sp, =SFE(CSTACK)

	/* Branch to main() */
	LDR	 r0, =?main
	MOV	 lr, pc
	BX	  r0

	/* Loop indefinitely when program is finished */
loop4:
	B	   loop4

	END

[/code]

 

текст sram.icf

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Memory Regions-*/
define symbol __ICFEDIT_region_RAM_start__   = 0x200000;
define symbol __ICFEDIT_region_RAM_end__	 = 0x20FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_vectors__  = 0x100;
define symbol __ICFEDIT_size_cstack__   = 0x1000;
define symbol __ICFEDIT_size_sysstack__ = 0x60;
define symbol __ICFEDIT_size_irqstack__ = 0x60;
define symbol __ICFEDIT_size_heap__	 = 0x0;
/*-Exports-*/
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_sysstack__;
export symbol __ICFEDIT_size_irqstack__;
export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region VEC_region = mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_vectors__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];

define block CSTACK	with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block HEAP	  with alignment = 8, size = __ICFEDIT_size_heap__	 { };

do not initialize  { section .noinit };

place in VEC_region { section .vectors };
place in RAM_region { section .cstartup, readonly, readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };

UART_SAM7.ZIP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при получении байта вызывается прерывание UART1 и процессор попадает в область FIQ_STACK$$Limit:

и там крутится....

помогите найти ошибку

в приложении - проект для IAR5.41

 

 

#include "at91sam7s256.h"
#include <intrinsics.h>
//------------------------------------------------------------------------------
#define Main_Oscillator 10000000 // 10.000 MHz
#define UART_CLOCK_9600 16 // 2500000/(9600x16) 
#define UART_CONVERTER_TURN_ON (1<<15) // PA15 
//------------------------------------------------------------------------------
volatile unsigned int i = 0;
volatile unsigned int RX_FLAG = 0;
//------------------------------------------------------------------------------
void LowLevelInit (void); // runs once at startup
void defaultSpuriousHandler (void) {return;}; 
void defaultFiqHandler (void) {return;};
void defaultIrqHandler (void) {return;};
void init_COM1 (void);
void init_IRQ (void);
//------------------------------------------------------------------------------
void Usart1IrqHandler (void);
//------------------------------------------------------------------------------
int main (void) { 
    init_COM1 ();
    init_IRQ ();
    AT91C_BASE_PIOA->PIO_SODR = UART_CONVERTER_TURN_ON; // Enable MAX3237 conveter
    __enable_interrupt(); 
    for (;;) {      
        while (!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)==1); 
        AT91C_BASE_US1->US_THR = AT91C_BASE_US1->US_RHR; // simple RX1 -> TX1 works fine! 
        for (i = 0; i < 10000; i++) {
            asm ("nop");  // simple NoOPeration instruction
        }
        if (RX_FLAG) {
            RX_FLAG = 0;
            while (!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)==1); 
            AT91C_BASE_US1->US_THR = 'Y';
        }
    }
}


void Usart1IrqHandler (void) { 
    if ((AT91C_BASE_US1->US_CSR & AT91C_US_RXRDY) == AT91C_US_RXRDY) { // we have a receive interrupt
        RX_FLAG = 1;
    }
}

 

Судя по надписи в коде //simple RX1 -> TX1 works fine! уарт на передачу уарт работает?

Вы пытаетесь выполнять опрос AT91C_BASE_US1->US_CSR в основном цикле и в прерывании?

А прочитать AT91C_BASE_US1->US_RHR в прерывании не пробовали?

И почему такой странный опрос (!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)==1)?

Разве такое выражение не будет правильнее while(!(AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY)) или while((AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY) == 0)

 

У Вас на все прерывания uart всего один регистр AT91C_BASE_US1->US_CSR. Вы или выполняйте все операции по считыванию его в прерывании или запрещайте прерывание от уарта, читайте значение регистра в отдельный волатайлный регист а в нём по маскам определяйте что творится с уартом.

 

Пример моего обработчика прерываний уарт1 (вне пределов этого обработчика нет никаких манипуляций с регистром AT91C_BASE_US1->US_CSR)

 

//обработчик прерываний usart1
void USART1_ISR(void) 
{  
  int status;
  
  //читаем регистр статуса
  status = AT91C_BASE_US1->US_CSR; 
    
  if(status & AT91C_US_TXEMPTY)
  {
    //передача байта завершена
    if (Tx1Tail != Tx1Head)
    {
      AT91C_BASE_US1->US_THR = Tx1Buf[Tx1Tail++]; 
      if (Tx1Tail >= US1_TXBUFSIZE) Tx1Tail = 0;
    }
    else
    {
      //запрещаем прерывания по опустошению передающего буффера
      AT91C_BASE_US1->US_IDR = AT91C_US_TXEMPTY;
    }
  }
  
  if(status & AT91C_US_RXRDY)
  {
    //приём завершён, ложим байт в фифо
    Rx1Buf[Rx1Head++] = AT91C_BASE_US1->US_RHR;
    if (Rx1Head >= US1_RXBUFSIZE) Rx1Head = 0;
  }
  
  
  //ошибки
  if( (status & AT91C_US_OVRE) || (status & AT91C_US_FRAME) || (status & AT91C_US_PARE) )
  {
    AT91C_BASE_US1->US_CR = AT91C_US_RSTSTA;
  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) да, uart1 на прием/передачу работает пока не нажму клавишу в гипертерминале - тогда зависает

2) прочитать AT91C_BASE_US1->US_RHR в прерывании пробовал - ставил breakpoint в дебаггере (у меня sam-ice)

в обработчик ни разу не заходит

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) да, uart1 на прием/передачу работает пока не нажму клавишу в гипертерминале - тогда зависает

2) прочитать AT91C_BASE_US1->US_RHR в прерывании пробовал - ставил breakpoint в дебаггере (у меня sam-ice)

в обработчик ни разу не заходит

 

У Вас в настройках уарта разрешено только прерывание по приёму символа.

Упростите основной цикл (уберите лишние манипуляции с US_CSR) а в обработчике прерываний

по приёму символа ложите в передающий регистр что-нибудь.

Проверите работает ли у Вас прерывание по приёму в принципе.

 

for (;;) {
    }


void USART1_ISR(void) 
{  
  int status;
  
  //читаем регистр статуса
  status = AT91C_BASE_US1->US_CSR; 

  
  if(status & AT91C_US_RXRDY)
  {
    AT91C_BASE_US1->US_THR = 'Y';
  }
  
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

помогите найти ошибку

Скорее всего что-то напутали с remap'ом и копированием векторов, проверьте этот момент внимательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал сейчас ваш код - вылетает куда-то при прерывании на прием

в обработчик не попадает

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал сейчас ваш код - вылетает куда-то при прерывании на прием

в обработчик не попадает

 

Проект что Вы выложили это тот на котором идёт проверка?

К нему добавлен файл startup.s - то который приведён в первом посте?

в линкере в закладке library/Overraide default reset entry вписан resetHandler?

Также в линкере я указываю файл flash.icf а не sram.icf

Изменено пользователем mempfis_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) да, в этом проекте сейчас пытаюсь найти глюк

2) к проекту добавлен стандартный board_cstartup_iar.s

3) не нашел такой опции в iar'e

вижу только Linker->Library->Automatic library selection (стоит галочка)

и еще есть опция Linker->Library->Override default program entry: __iar_program_start (нет галочки)

 

 

в файл main.c добавил

#include "board_memories.h"

 

и добавил в конец функции LowLevelInit()

BOARD_RemapRam ();

 


/// \internal Flash is mirrored in the remap zone.
#define BOARD_FLASH             0

/// \internal RAM is mirrored in the remap zone.
#define BOARD_RAM               1




//------------------------------------------------------------------------------
/// Returns the current remap, either BOARD_FLASH or BOARD_RAM.
//------------------------------------------------------------------------------
static unsigned char BOARD_GetRemap( void )
{
   unsigned int *remap = (unsigned int *) 0;
   unsigned int *ram = (unsigned int *) AT91C_ISRAM;

   // Try to write in 0 and see if this affects the RAM
   unsigned int temp = *ram;
   *ram = temp + 1;
   if (*remap == *ram) {

       *ram = temp;
       return BOARD_RAM;
   }
   else {

       *ram = temp;
       return BOARD_FLASH;
   }
}


void BOARD_RemapRam( void )
{
   if (BOARD_GetRemap() != BOARD_RAM) {

       AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;
   }
}

 

эффект нулевой

 

при компиляции с flash.icf выдает предупреждение:

Warning[Lp012]: no sections with name FIQ_STACK included - special symbol FIQ_STACK$$Limit (referenced from cstartup.o(rt4t_al.a)) will be zero

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при компиляции с flash.icf выдает предупреждение:

Warning[Lp012]: no sections with name FIQ_STACK included - special symbol FIQ_STACK$$Limit (referenced from cstartup.o(rt4t_al.a)) will be zero

 

Я брал startup из примеров (1 в 1 совпадает из первого поста) и добавлял его к проекту (add/add files)

В задкладке Linker->Library->Override default program entry прописана моя точка входа в программу resetHandler а не стандартная.

У вас приведен свой resetHandler но подключен стандартный.

 

С добавление startup.s, подключением resetHandler, flash.icf и подключением "at91sam7s256.h" вместо "board.h" (чтоб не ругался на объявления) Ваш проек скомпилировался без единой ошибки и предупреждения.

 

и добавил в конец функции LowLevelInit()

BOARD_RemapRam ();

 

LowLevelInit вызывается из стартапа и вней выполняется ремап - не нужно дополнительно их вызывать

Изменено пользователем mempfis_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо! после установки опции опция Linker->Library->Override default program entry: resetHandler

я попадаю в обработчик прерывания!!!!!!! ура!

однако если использовать sram.icf ворнинги остались:

 

Warning[Lp005]: placement includes a mix of sections with content (example "ro code section .cstartup in board_cstartup_iar.o") and sections without E:\UART_SAM7\sram.icf 35

content (example "zi section .bss in main.o")

Warning[Lp006]: placement includes a mix of writable sections (example "zi section .bss in main.o") and non-writable sections (example "ro code E:\UART_SAM7\sram.icf 35

section .cstartup in board_cstartup_iar.o")

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выкладываю рабочий проект - UART с прерыванием

проект создан "с нуля", ничего лишнего в нем нет, никаких "библиотечек"

использую только

#include "at91sam7s256.h"

#include <intrinsics.h>

UART_AT91SAM7_echo.ZIP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...