2016-07-08 15 views
0

향후 설계에서 NXP LPC4330 마이크로 컨트롤러를 사용할 때 고려해야 할 기능 중 하나는 부트 로더를 사용하여 현장에서 플래시를 업데이트하는 것입니다. 과거에는 NXP IAP 명령을 사용하여이 작업을 수행했지만 4330은 SPIFI 플래시를 사용하기 때문에 IAP를 사용할 수 없습니다.SPIFI 플래시를 사용하여 LPC4330을 사용하여 부트 로더를 구현하는 방법

내가 수집 한 것부터, 내 부트 로더 응용 프로그램을 RAM에서 실행해야하고 NXP의 SPIFI 라이브러리를 사용하여 플래시에 쓸 수있는 것 같습니다. 내 질문은 다음과 같습니다.

IAR Embedded Workbench를 사용하면 플래시에서 시작하여 RAM을 통해 실행하여 SPIFI 칩에 쓸 수있는 프로그램을 어떻게 만들 수 있습니까? 아래 예를 살펴 보았지만 LPC4330으로 이식하는 방법은 명확하지 않습니다. 내가 시작 코드에서 RAM에 복사 된 코드를 가지고 있지만 RAM에 인터럽트 벡터 테이블을 복사하는 방법이나 RAM에서 실행을 시작하는 방법을 모르겠다. https://www.iar.com/support/tech-notes/general/execute-in-ram-after-copying-from-flashrom-v5.20-and-later/

답변

0

나는이 작업을 수행하는 방법을 알아 냈어 질문에있는 링크를 사용하여 일반 프로세스에 대한 좋은 아이디어를 얻으십시오.

플래시에 인터럽트 벡터 테이블이 있고 모든 인터럽트 벡터가 dumm을 가리키고 있습니다. y 처리기. 그런 다음 나중에 RAM에 저장된 인터럽트 벡터 테이블이 사용됩니다.

;Interrupt vector table in flash, will never be used since VTOR 
;(interrupt vector table)will be mapped to RAM on startup 
     MODULE ?cstartup 

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

     SECTION .intvec:CODE:NOROOT(2) 

     EXTERN __iar_program_start 
     EXTERN SystemInit   
     PUBLIC __vector_table_RAM 
     PUBLIC __vector_table_0x1c 
     PUBLIC __Vectors 
     PUBLIC __Vectors_End 
     PUBLIC __Vectors_Size 

     DATA 

__vector_table 
     DCD  sfe(CSTACK) 
     DCD  Reset_Handler 
     DCD  NMI_Handler 
     DCD  HardFault_Handler 
     DCD  MemManage_Handler 
     DCD  BusFault_Handler 
     DCD  UsageFault_Handler 
__vector_table_0x1c 
     DCD  0 
     DCD  0 
     DCD  0 
     DCD  0 
     DCD  SVC_Handler 
     DCD  DebugMon_Handler 
     DCD  0 
     DCD  PendSV_Handler 
     DCD  SysTick_Handler 

     ; External Interrupts 
     DCD  Dummy_Handler_ROM    ; 16 D/A Converter 
     DCD  Dummy_Handler_ROM    ; 17 CortexM0 (LPC43XX ONLY) 
     DCD  Dummy_Handler_ROM    ; 18 General Purpose DMA 
     DCD  0        ; 19 Reserved 
     DCD  Dummy_Handler_ROM    ; 20 ORed flash bank A, flash bank B, EEPROM interrupts 
     DCD  Dummy_Handler_ROM    ; 21 Ethernet 
     DCD  Dummy_Handler_ROM    ; 22 SD/MMC 
     DCD  Dummy_Handler_ROM    ; 23 LCD 
     DCD  Dummy_Handler_ROM    ; 24 USB0 
     DCD  Dummy_Handler_ROM    ; 25 USB1 
     DCD  Dummy_Handler_ROM    ; 26 State Configurable Timer 
     DCD  Dummy_Handler_ROM    ; 27 Repetitive Interrupt Timer 
     DCD  Dummy_Handler_ROM    ; 28 Timer0 
     DCD  Dummy_Handler_ROM    ; 29 Timer1 
     DCD  Dummy_Handler_ROM    ; 30 Timer2 
     DCD  Dummy_Handler_ROM    ; 31 Timer3 
     DCD  Dummy_Handler_ROM    ; 32 Motor Control PWM 
     DCD  Dummy_Handler_ROM    ; 33 A/D Converter 0 
     DCD  Dummy_Handler_ROM    ; 34 I2C0 
     DCD  Dummy_Handler_ROM    ; 35 I2C1 
     DCD  Dummy_Handler_ROM    ; 36 SPI (LPC43XX ONLY) 
     DCD  Dummy_Handler_ROM    ; 37 A/D Converter 1 
     DCD  Dummy_Handler_ROM    ; 38 SSP0 
     DCD  Dummy_Handler_ROM    ; 39 SSP1 
     DCD  Dummy_Handler_ROM    ; 40 UART0 
     DCD  Dummy_Handler_ROM    ; 41 UART1 
     DCD  Dummy_Handler_ROM    ; 42 UART2 
     DCD  Dummy_Handler_ROM    ; 43 UART3 
     DCD  Dummy_Handler_ROM    ; 44 I2S0 
     DCD  Dummy_Handler_ROM    ; 45 I2S1 
     DCD  Dummy_Handler_ROM    ; 46 SPI Flash Interface 
     DCD  Dummy_Handler_ROM    ; 47 SGPIO (LPC43XX ONLY) 
     DCD  Dummy_Handler_ROM    ; 48 GPIO0 
     DCD  Dummy_Handler_ROM    ; 49 GPIO1 
     DCD  Dummy_Handler_ROM    ; 50 GPIO2 
     DCD  Dummy_Handler_ROM    ; 51 GPIO3 
     DCD  Dummy_Handler_ROM    ; 52 GPIO4 
     DCD  Dummy_Handler_ROM    ; 53 GPIO5 
     DCD  Dummy_Handler_ROM    ; 54 GPIO6 
     DCD  Dummy_Handler_ROM    ; 55 GPIO7 
     DCD  Dummy_Handler_ROM    ; 56 GINT0 
     DCD  Dummy_Handler_ROM    ; 57 GINT1 
     DCD  Dummy_Handler_ROM    ; 58 Event Router 
     DCD  Dummy_Handler_ROM    ; 59 C_CAN1 
     DCD  0 
     DCD  Dummy_Handler_ROM    ; 61 ADCHS combined interrupt 
     DCD  Dummy_Handler_ROM    ; 62 ATIMER 
     DCD  Dummy_Handler_ROM    ; 63 RTC 
     DCD  0 
     DCD  Dummy_Handler_ROM    ; 65 WDT 
     DCD  Dummy_Handler_ROM    ; 66 M0SUB TXEVT 
     DCD  Dummy_Handler_ROM    ; 67 C_CAN0 
     DCD  Dummy_Handler_ROM    ; 68 QEI 




;Interrupt vector table which will be placed in RAM 
     SECTION .vectors_RAM:CODE:ROOT(2) 

     EXTERN __iar_program_start 
     EXTERN SystemInit   
     PUBLIC __vector_table 
     PUBLIC __vector_table_0x1c 
     PUBLIC __Vectors 
     PUBLIC __Vectors_End 
     PUBLIC __Vectors_Size 

     DATA 
__vector_table_RAM 
     DCD  sfe(CSTACK) 
     DCD  Reset_Handler 
     DCD  NMI_Handler 
     DCD  HardFault_Handler 
     DCD  MemManage_Handler 
     DCD  BusFault_Handler 
     DCD  UsageFault_Handler 
     DCD  0 
     DCD  0 
     DCD  0 
     DCD  0 
     DCD  SVC_Handler 
     DCD  DebugMon_Handler 
     DCD  0 
     DCD  PendSV_Handler 
     DCD  SysTick_Handler 

     ; External Interrupts 
     DCD  DAC_IRQHandler    ; 16 D/A Converter 
     DCD  M0APP_IRQHandler   ; 17 CortexM0 (LPC43XX ONLY) 
     DCD  DMA_IRQHandler    ; 18 General Purpose DMA 
     DCD  0       ; 19 Reserved 
     DCD  FLASH_EEPROM_IRQHandler  ; 20 ORed flash bank A, flash bank B, EEPROM interrupts 
     DCD  ETH_IRQHandler    ; 21 Ethernet 
     DCD  SDIO_IRQHandler    ; 22 SD/MMC 
     DCD  LCD_IRQHandler    ; 23 LCD 
     DCD  USB0_IRQHandler    ; 24 USB0 
     DCD  USB1_IRQHandler    ; 25 USB1 
     DCD  SCT_IRQHandler    ; 26 State Configurable Timer 
     DCD  RIT_IRQHandler    ; 27 Repetitive Interrupt Timer 
     DCD  TIMER0_IRQHandler   ; 28 Timer0 
     DCD  TIMER1_IRQHandler   ; 29 Timer1 
     DCD  TIMER2_IRQHandler   ; 30 Timer2 
     DCD  TIMER3_IRQHandler   ; 31 Timer3 
     DCD  MCPWM_IRQHandler   ; 32 Motor Control PWM 
     DCD  ADC0_IRQHandler    ; 33 A/D Converter 0 
     DCD  I2C0_IRQHandler    ; 34 I2C0 
     DCD  I2C1_IRQHandler    ; 35 I2C1 
     DCD  SPI_IRQHandler    ; 36 SPI (LPC43XX ONLY) 
     DCD  ADC1_IRQHandler    ; 37 A/D Converter 1 
     DCD  SSP0_IRQHandler    ; 38 SSP0 
     DCD  SSP1_IRQHandler    ; 39 SSP1 
     DCD  UART0_IRQHandler   ; 40 UART0 
     DCD  UART1_IRQHandler   ; 41 UART1 
     DCD  UART2_IRQHandler   ; 42 UART2 
     DCD  UART3_IRQHandler   ; 43 UART3 
     DCD  I2S0_IRQHandler    ; 44 I2S0 
     DCD  I2S1_IRQHandler    ; 45 I2S1 
     DCD  SPIFI_IRQHandler   ; 46 SPI Flash Interface 
     DCD  SGPIO_IRQHandler   ; 47 SGPIO (LPC43XX ONLY) 
     DCD  GPIO0_IRQHandler   ; 48 GPIO0 
     DCD  GPIO1_IRQHandler   ; 49 GPIO1 
     DCD  GPIO2_IRQHandler   ; 50 GPIO2 
     DCD  GPIO3_IRQHandler   ; 51 GPIO3 
     DCD  GPIO4_IRQHandler   ; 52 GPIO4 
     DCD  GPIO5_IRQHandler   ; 53 GPIO5 
     DCD  GPIO6_IRQHandler   ; 54 GPIO6 
     DCD  GPIO7_IRQHandler   ; 55 GPIO7 
     DCD  GINT0_IRQHandler   ; 56 GINT0 
     DCD  GINT1_IRQHandler   ; 57 GINT1 
     DCD  EVRT_IRQHandler    ; 58 Event Router 
     DCD  CAN1_IRQHandler    ; 59 C_CAN1 
     DCD  0 
     DCD  ADCHS_IRQHandler   ; 61 ADCHS combined interrupt 
     DCD  ATIMER_IRQHandler   ; 62 ATIMER 
     DCD  RTC_IRQHandler    ; 63 RTC 
     DCD  0 
     DCD  WDT_IRQHandler    ; 65 WDT 
     DCD  M0SUB_IRQHandler   ; 66 M0SUB TXEVT 
     DCD  CAN0_IRQHandler    ; 67 C_CAN0 
     DCD  QEI_IRQHandler    ; 68 QEI 
__Vectors_End 

__Vectors  EQU __vector_table 
__Vectors_Size EQU __Vectors_End - __Vectors 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;; 
;; Default interrupt handlers. 
;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

     THUMB 

     PUBWEAK Reset_Handler 
     SECTION .text:CODE:REORDER:NOROOT(2) 
Reset_Handler 
     LDR  R0, =SystemInit 
     BLX  R0 
     LDR  R0, =__iar_program_start 
     BX  R0 

     PUBWEAK NMI_Handler 
     PUBWEAK HardFault_Handler 
     PUBWEAK MemManage_Handler 
     PUBWEAK BusFault_Handler 
     PUBWEAK UsageFault_Handler 
     PUBWEAK SVC_Handler 
     PUBWEAK DebugMon_Handler 
     PUBWEAK PendSV_Handler 
     PUBWEAK SysTick_Handler 
     PUBWEAK DAC_IRQHandler 
     PUBWEAK M0APP_IRQHandler 
     PUBWEAK DMA_IRQHandler 
     PUBWEAK FLASH_EEPROM_IRQHandler 
     PUBWEAK ETH_IRQHandler 
     PUBWEAK SDIO_IRQHandler 
     PUBWEAK LCD_IRQHandler 
     PUBWEAK USB0_IRQHandler 
     PUBWEAK USB1_IRQHandler 
     PUBWEAK SCT_IRQHandler 
     PUBWEAK RIT_IRQHandler 
     PUBWEAK TIMER0_IRQHandler 
     PUBWEAK TIMER1_IRQHandler 
     PUBWEAK TIMER2_IRQHandler 
     PUBWEAK TIMER3_IRQHandler 
     PUBWEAK MCPWM_IRQHandler 
     PUBWEAK ADC0_IRQHandler 
     PUBWEAK I2C0_IRQHandler 
     PUBWEAK I2C1_IRQHandler 
     PUBWEAK SPI_IRQHandler 
     PUBWEAK ADC1_IRQHandler 
     PUBWEAK SSP0_IRQHandler 
     PUBWEAK SSP1_IRQHandler 
     PUBWEAK UART0_IRQHandler 
     PUBWEAK UART1_IRQHandler 
     PUBWEAK UART2_IRQHandler 
     PUBWEAK UART3_IRQHandler 
     PUBWEAK I2S0_IRQHandler 
     PUBWEAK I2S1_IRQHandler 
     PUBWEAK SPIFI_IRQHandler 
     PUBWEAK SGPIO_IRQHandler 
     PUBWEAK GPIO0_IRQHandler 
     PUBWEAK GPIO1_IRQHandler 
     PUBWEAK GPIO2_IRQHandler 
     PUBWEAK GPIO3_IRQHandler 
     PUBWEAK GPIO4_IRQHandler 
     PUBWEAK GPIO5_IRQHandler 
     PUBWEAK GPIO6_IRQHandler 
     PUBWEAK GPIO7_IRQHandler 
     PUBWEAK GINT0_IRQHandler 
     PUBWEAK GINT1_IRQHandler 
     PUBWEAK EVRT_IRQHandler 
     PUBWEAK CAN1_IRQHandler 
     PUBWEAK ADCHS_IRQHandler 
     PUBWEAK ATIMER_IRQHandler 
     PUBWEAK RTC_IRQHandler 
     PUBWEAK WDT_IRQHandler 
     PUBWEAK M0SUB_IRQHandler 
     PUBWEAK CAN0_IRQHandler 
     PUBWEAK QEI_IRQHandler 
     SECTION .text:CODE:REORDER:NOROOT(1) 
NMI_Handler 
     B NMI_Handler 
SVC_Handler 
     B SVC_Handler 
DebugMon_Handler 
     B DebugMon_Handler 
PendSV_Handler 
     B PendSV_Handler 
SysTick_Handler 
     B SysTick_Handler 
HardFault_Handler 
     B HardFault_Handler 
MemManage_Handler 
     B MemManage_Handler 
BusFault_Handler 
     B BusFault_Handler 
UsageFault_Handler 
DAC_IRQHandler 
M0APP_IRQHandler 
DMA_IRQHandler 
FLASH_EEPROM_IRQHandler 
ETH_IRQHandler 
SDIO_IRQHandler 
LCD_IRQHandler 
USB0_IRQHandler 
USB1_IRQHandler 
SCT_IRQHandler 
RIT_IRQHandler 
TIMER0_IRQHandler 
TIMER1_IRQHandler 
TIMER2_IRQHandler 
TIMER3_IRQHandler 
MCPWM_IRQHandler 
ADC0_IRQHandler 
I2C0_IRQHandler 
I2C1_IRQHandler 
SPI_IRQHandler 
ADC1_IRQHandler 
SSP0_IRQHandler 
SSP1_IRQHandler 
UART0_IRQHandler 
UART1_IRQHandler 
UART2_IRQHandler 
UART3_IRQHandler 
I2S0_IRQHandler 
I2S1_IRQHandler 
SPIFI_IRQHandler 
SGPIO_IRQHandler 
GPIO0_IRQHandler 
GPIO1_IRQHandler 
GPIO2_IRQHandler 
GPIO3_IRQHandler 
GPIO4_IRQHandler 
GPIO5_IRQHandler 
GPIO6_IRQHandler 
GPIO7_IRQHandler 
GINT0_IRQHandler 
GINT1_IRQHandler 
EVRT_IRQHandler 
CAN1_IRQHandler 
ADCHS_IRQHandler 
ATIMER_IRQHandler 
RTC_IRQHandler 
WDT_IRQHandler 
CAN0_IRQHandler 
M0SUB_IRQHandler 
QEI_IRQHandler 
Default_IRQHandler 
     B Default_IRQHandler 

/* CRP Section - not needed for flashless devices */ 

;;;  SECTION .crp:CODE:ROOT(2) 
;;;  DATA 
/* Code Read Protection 
NO_ISP 0x4E697370 - Prevents sampling of pin PIO0_1 for entering ISP mode 
CRP1 0x12345678 - Write to RAM command cannot access RAM below 0x10000300. 
        - Copy RAM to flash command can not write to Sector 0. 
        - Erase command can erase Sector 0 only when all sectors 
        are selected for erase. 
        - Compare command is disabled. 
        - Read Memory command is disabled. 
CRP2 0x87654321 - Read Memory is disabled. 
        - Write to RAM is disabled. 
        - "Go" command is disabled. 
        - Copy RAM to flash is disabled. 
        - Compare is disabled. 
CRP3 0x43218765 - Access to chip via the SWD pins is disabled. ISP entry 
        by pulling PIO0_1 LOW is disabled if a valid user code is 
        present in flash sector 0. 
Caution: If CRP3 is selected, no future factory testing can be 
performed on the device. 
*/ 
;;;  DCD 0xFFFFFFFF 
;;; 

; -------------------- 
; Dummy handler placed in ROM 

Dummy_Handler_ROM 
       b  Dummy_Handler_ROM 

     END 

그러면 링커 파일 (.icf)는 아래와 같이 RAM (READWRITE 부)의 판독 전용의 모든 항목을 넣어 편집 할 필요가있다. 중요한 라인은 "copy by initialize"입니다.

그런 다음 남은 것은 인터럽트 벡터 테이블을 ROM에서 RAM으로 다시 매핑하는 것입니다. 인터럽트가 활성화되기 전에 응용 프로그램이 수행하는 첫 번째 작업이어야합니다. 코드는 다음과 같아야합니다.

VTOR = (unsigned int) 0x10000000; 
0

내가 자주하는 일은 메인 프로그램을 작성하고 램 전용으로 링크하여 완전한 바이너리를 만든다. 그런 다음 전체 작업이 복사하고 점프하는 플래시 용 쉘 프로그램을 작성합니다. 보통 몇 줄의 어셈블리와 메인 프로그램을위한 바이너리 파일의 내용 (플래시 프로그램과 링크하기 위해 C를 사용한다면 메인 프로그램을 .word 나 단어 배열로 변환하는 임시 호스트 유틸리티를 작성하는 경향이있다.

내가 십오 특정 도구 그래서 캔트 도움을 위해 아무 소용이 없다, 나는 그들이 IDE 호출 명령 줄 도구를 가지고 당신이 그와 메이크 파일을 사용할 수 있습니다 가정합니다.

+0

"필요한 것은 모두"해당 기능이 램에 있어야한다고 링커에 알리는 경우 일 수 있습니다. 그리고 부트 스트랩은 .data를 좋아해야하며, 당신을 위해 램에 복사하십시오. 일반적인 gnu 부트 스트랩과 링커 스크립트는 그렇게하지 않지만 스스로 할 수 있습니다. 얼마나 열심히 당신의 환경에 대해 확실하지 않습니다. –

+0

독립적 인 위치로 프로그램을 빌드 한 다음 복사하고 점프하십시오. 리셋이 아닌 다른 벡터가 필요합니까? –

+0

http://www.embedded.com/electronics-blogs/break-points/4235934/A-SPIFI-New-Idea는 그들이 내가 일하는 곳과 칩에 대해 특허권을 부여 할 것이라고 생각하는지 궁금하지만 흥미 롭습니다. 우리는 몇 년 동안 사물에 매핑 된이 SPI 플래시를 사용하고 있습니다. 그들이 갖고 있지 않은 기능을 보지 못합니다. 어쨌든 우리가 변경하거나 프로그램하기 위해 플래시에서 벗어나야하는 동일한 문제, 그리고 위의 트릭을 사용하여 단순히 램에 복사하고 건너 뜁니다. –