您的位置:首页 > 运动休闲 > 旅游用品 > LPC21XX Project For Keil uVision4建立心得

LPC21XX Project For Keil uVision4建立心得

luyued 发布于 2011-05-23 10:42   浏览 N 次  
  1. 概述:

我们习惯于使用别人的工程模板来建立单片机应用工程,这个习惯不好。

我原来一直使用从网络上下载的LPC214X工程模板来编写程序。一次要编写LPC2134单片机的程序,仍使用这个模板,结果在调试时出现问题:单步仿真不能正确返回到合理的位置。仔细想就是堆栈出了问题。

仔细检查编译器产生的MAP文件,证明判断没有错。

重新用Keil uVision4建立LPC2134的工程文件,使用其产生的Startup.s文件,编译后一切正常。

  1. 建立LPC2134工程文件:

  1. 使用Keil uVision4推荐的Startup.s文件:

  1. 修改IRQ.S和Startup.s文件:

    1. IRQ.S文件:

NoInt EQU 0x80

USR32Mode EQU 0x10

SVC32Mode EQU 0x13

SYS32Mode EQU 0x1f

IRQ32Mode EQU 0x12

FIQ32Mode EQU 0x11

;引入的外部标号在这声明

IMPORT OSIntCtxSw ;任务切换函数

IMPORT OSIntExit ;中断退出函数

IMPORT OSTCBCur

IMPORT OSTCBHighRdy

IMPORT OSIntNesting ;中断嵌套计数器

IMPORT StackUsr

IMPORT OsEnterSum

CODE32

PRESERVE8

AREA IRQ,CODE,READONLY

MACRO

$IRQ_Label HANDLER $IRQ_Exception_Function

EXPORT $IRQ_Label ; 输出的标号

IMPORT $IRQ_Exception_Function ; 引用的外部标号

$IRQ_Label

SUB LR, LR, #4 ; 计算返回地址

STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境

MRS R3, SPSR ; 保存状态

STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,LR,注意不能回写

; 如果回写的是用户的SP,所以后面要调整SP

LDR R2, =OSIntNesting ; OSIntNesting++

LDRB R1, [R2]

ADD R1, R1, #1

STRB R1, [R2]

SUB SP, SP, #4*3

MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式

CMP R1, #1

LDREQ SP, =StackUsr

BL $IRQ_Exception_Function ; 调用c语言的中断处理程序

; MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式

LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出时中断关闭

MOV R1, #1

STR R1, [R2]

BL OSIntExit

LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0

MOV R1, #0

STR R1, [R2]

MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式

LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR,注意不能回写

; 如果回写的是用户的SP,所以后面要调整SP

LDR R0, =OSTCBHighRdy

LDR R0, [R0]

LDR R1, =OSTCBCur

LDR R1, [R1]

CMP R0, R1

ADD SP, SP, #4*3 ;

MSR SPSR_cxsf, R3

LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换

LDR PC, =OSIntCtxSw ; 进行任务切换

MEND

;/* 以下添加中断句柄,用户根据实际情况改变 */

;/*中断*/

IRQ_Handler HANDLER IRQ_Exception

;/*定时器0中断*/

Timer0_Handler HANDLER Timer0_Exception

Uart0_Handler HANDLER Uart0_Exception

Manchester_Handler HANDLER Manchester_Exception

;Uart1_Handler HANDLER Uart1_Exception

;ADC0_Handler HANDLER ADC0Handler

;ADC1_Handler HANDLER ADC1Handler

END

  1. Startup.s文件:

Mode_USR EQU 0x10

Mode_FIQ EQU 0x11

Mode_IRQ EQU 0x12

Mode_SVC EQU 0x13

Mode_ABT EQU 0x17

Mode_UND EQU 0x1B

Mode_SYS EQU 0x1F

I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled

F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled

;// Stack Configuration (Stack Sizes in Bytes)

;// Undefined Mode <0x0-0xFFFFFFFF:8>

;// Supervisor Mode <0x0-0xFFFFFFFF:8>

;// Abort Mode <0x0-0xFFFFFFFF:8>

;// Fast Interrupt Mode <0x0-0xFFFFFFFF:8>

;// Interrupt Mode <0x0-0xFFFFFFFF:8>

;// User/System Mode <0x0-0xFFFFFFFF:8>

;//

UND_Stack_Size EQU 0x00000000

SVC_Stack_Size EQU 0x00000008

ABT_Stack_Size EQU 0x00000000

FIQ_Stack_Size EQU 0x00000000

IRQ_Stack_Size EQU 0x00000080

USR_Stack_Size EQU 0x00000400

ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \

FIQ_Stack_Size + IRQ_Stack_Size)

;红字为增加的内容

EXPORT StackUsr

AREA STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE USR_Stack_Size

StackUsr

__initial_sp SPACE ISR_Stack_Size

Stack_Top

;// Heap Configuration

;// Heap Size (in Bytes) <0x0-0xFFFFFFFF>

;//

Heap_Size EQU 0x00000000

AREA HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem SPACE Heap_Size

__heap_limit

; VPBDIV definitions

VPBDIV EQU 0xE01FC100 ; VPBDIV Address

;// VPBDIV Setup

;// Peripheral Bus Clock Rate

;// VPBDIV: VPB Clock

;// <0=> VPB Clock = CPU Clock / 4

;// <1=> VPB Clock = CPU Clock

;// <2=> VPB Clock = CPU Clock / 2

;// XCLKDIV: XCLK Pin

;// <0=> XCLK Pin = CPU Clock / 4

;// <1=> XCLK Pin = CPU Clock

;// <2=> XCLK Pin = CPU Clock / 2

;//

VPBDIV_SETUP EQU 0

VPBDIV_Val EQU 0x00000000

; Phase Locked Loop (PLL) definitions

PLL_BASE EQU 0xE01FC080 ; PLL Base Address

PLLCON_OFS EQU 0x00 ; PLL Control Offset

PLLCFG_OFS EQU 0x04 ; PLL Configuration Offset

PLLSTAT_OFS EQU 0x08 ; PLL Status Offset

PLLFEED_OFS EQU 0x0C ; PLL Feed Offset

PLLCON_PLLE EQU (1<<0) ; PLL Enable

PLLCON_PLLC EQU (1<<1) ; PLL Connect

PLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier

PLLCFG_PSEL EQU (0x03<<5) ; PLL Divider

PLLSTAT_PLOCK EQU (1<<10) ; PLL Lock Status

;// PLL Setup

;// MSEL: PLL Multiplier Selection

;// <1-32><#-1>

;// M Value

;// PSEL: PLL Divider Selection

;// <0=> 1 <1=> 2 <2=> 4 <3=> 8

;// P Value

;//

PLL_SETUP EQU 1

PLLCFG_Val EQU 0x00000024

; Memory Accelerator Module (MAM) definitions

MAM_BASE EQU 0xE01FC000 ; MAM Base Address

MAMCR_OFS EQU 0x00 ; MAM Control Offset

MAMTIM_OFS EQU 0x04 ; MAM Timing Offset

;// MAM Setup

;// MAM Control

;// <0=> Disabled

;// <1=> Partially Enabled

;// <2=> Fully Enabled

;// Mode

;// MAM Timing

;// <0=> Reserved <1=> 1 <2=> 2 <3=> 3

;// <4=> 4 <5=> 5 <6=> 6 <7=> 7

;// Fetch Cycles

;//

MAM_SETUP EQU 1

MAMCR_Val EQU 0x00000002

MAMTIM_Val EQU 0x00000004

; External Memory Controller (EMC) definitions

EMC_BASE EQU 0xFFE00000 ; EMC Base Address

BCFG0_OFS EQU 0x00 ; BCFG0 Offset

BCFG1_OFS EQU 0x04 ; BCFG1 Offset

BCFG2_OFS EQU 0x08 ; BCFG2 Offset

BCFG3_OFS EQU 0x0C ; BCFG3 Offset

;// External Memory Controller (EMC)

EMC_SETUP EQU 0

;// Bank Configuration 0 (BCFG0)

;// IDCY: Idle Cycles <0-15>

;// WST1: Wait States 1 <0-31>

;// WST2: Wait States 2 <0-31>

;// RBLE: Read Byte Lane Enable

;// WP: Write Protect

;// BM: Burst ROM

;// MW: Memory Width <0=> 8-bit <1=> 16-bit

;// <2=> 32-bit <3=> Reserved

;//

BCFG0_SETUP EQU 0

BCFG0_Val EQU 0x0000FBEF

;// Bank Configuration 1 (BCFG1)

;// IDCY: Idle Cycles <0-15>

;// WST1: Wait States 1 <0-31>

;// WST2: Wait States 2 <0-31>

;// RBLE: Read Byte Lane Enable

;// WP: Write Protect

;// BM: Burst ROM

;// MW: Memory Width <0=> 8-bit <1=> 16-bit

;// <2=> 32-bit <3=> Reserved

;//

BCFG1_SETUP EQU 0

BCFG1_Val EQU 0x0000FBEF

;// Bank Configuration 2 (BCFG2)

;// IDCY: Idle Cycles <0-15>

;// WST1: Wait States 1 <0-31>

;// WST2: Wait States 2 <0-31>

;// RBLE: Read Byte Lane Enable

;// WP: Write Protect

;// BM: Burst ROM

;// MW: Memory Width <0=> 8-bit <1=> 16-bit

;// <2=> 32-bit <3=> Reserved

;//

BCFG2_SETUP EQU 0

BCFG2_Val EQU 0x0000FBEF

;// Bank Configuration 3 (BCFG3)

;// IDCY: Idle Cycles <0-15>

;// WST1: Wait States 1 <0-31>

;// WST2: Wait States 2 <0-31>

;// RBLE: Read Byte Lane Enable

;// WP: Write Protect

;// BM: Burst ROM

;// MW: Memory Width <0=> 8-bit <1=> 16-bit

;// <2=> 32-bit <3=> Reserved

;//

BCFG3_SETUP EQU 0

BCFG3_Val EQU 0x0000FBEF

;// End of EMC

; External Memory Pins definitions

PINSEL2 EQU 0xE002C014 ; PINSEL2 Address

PINSEL2_Val EQU 0x0E6149E4 ; CS0..3, OE, WE, BLS0..3,

; D0..31, A2..23, JTAG Pins

PRESERVE8

; Area Definition and Entry Point

; Startup Code must be linked first at Address at which it expects to run.

AREA RESET, CODE, READONLY

ARM

; Exception Vectors

; Mapped to Address 0.

; Absolute addressing mode must be used.

; Dummy Handlers are implemented as infinite loops which can be modified.

Vectors LDR PC, Reset_Addr

LDR PC, Undef_Addr

LDR PC, SWI_Addr

LDR PC, PAbt_Addr

LDR PC, DAbt_Addr

NOP ; Reserved Vector

; LDR PC, IRQ_Addr

LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr

LDR PC, FIQ_Addr

;添加外部标号的定义:

IMPORT SoftwareInterrupt(在os_cpu_s.s中定义)

Reset_Addr DCD Reset_Handler

Undef_Addr DCD Undef_Handler

SWI_Addr DCD SWI_Handler;修改SWI_Handler 为SoftwareInterrupt

PAbt_Addr DCD PAbt_Handler

DAbt_Addr DCD DAbt_Handler

DCD 0 ; Reserved Address

IRQ_Addr DCD IRQ_Handler

FIQ_Addr DCD FIQ_Handler

Undef_Handler B Undef_Handler

SWI_Handler B SWI_Handler

PAbt_Handler B PAbt_Handler

DAbt_Handler B DAbt_Handler

IRQ_Handler B IRQ_Handler

FIQ_Handler B FIQ_Handler

; Reset Handler

EXPORT Reset_Handler

Reset_Handler

; Setup External Memory Pins

IF :DEF:EXTERNAL_MODE

LDR R0, =PINSEL2

LDR R1, =PINSEL2_Val

STR R1, [R0]

ENDIF

; Setup External Memory Controller

IF EMC_SETUP <> 0

LDR R0, =EMC_BASE

IF BCFG0_SETUP <> 0

LDR R1, =BCFG0_Val

STR R1, [R0, #BCFG0_OFS]

ENDIF

IF BCFG1_SETUP <> 0

LDR R1, =BCFG1_Val

STR R1, [R0, #BCFG1_OFS]

ENDIF

IF BCFG2_SETUP <> 0

LDR R1, =BCFG2_Val

STR R1, [R0, #BCFG2_OFS]

ENDIF

IF BCFG3_SETUP <> 0

LDR R1, =BCFG3_Val

STR R1, [R0, #BCFG3_OFS]

ENDIF

ENDIF ; EMC_SETUP

; Setup VPBDIV

IF VPBDIV_SETUP <> 0

LDR R0, =VPBDIV

LDR R1, =VPBDIV_Val

STR R1, [R0]

ENDIF

; Setup PLL

IF PLL_SETUP <> 0

LDR R0, =PLL_BASE

MOV R1, #0xAA

MOV R2, #0x55

; Configure and Enable PLL

MOV R3, #PLLCFG_Val

STR R3, [R0, #PLLCFG_OFS]

MOV R3, #PLLCON_PLLE

STR R3, [R0, #PLLCON_OFS]

STR R1, [R0, #PLLFEED_OFS]

STR R2, [R0, #PLLFEED_OFS]

; Wait until PLL Locked

PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]

ANDS R3, R3, #PLLSTAT_PLOCK

BEQ PLL_Loop

; Switch to PLL Clock

MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)

STR R3, [R0, #PLLCON_OFS]

STR R1, [R0, #PLLFEED_OFS]

STR R2, [R0, #PLLFEED_OFS]

ENDIF ; PLL_SETUP

; Setup MAM

IF MAM_SETUP <> 0

LDR R0, =MAM_BASE

MOV R1, #MAMTIM_Val

STR R1, [R0, #MAMTIM_OFS]

MOV R1, #MAMCR_Val

STR R1, [R0, #MAMCR_OFS]

ENDIF ; MAM_SETUP

; Memory Mapping (when Interrupt Vectors are in RAM)

MEMMAP EQU 0xE01FC040 ; Memory Mapping Control

IF :DEF:REMAP

LDR R0, =MEMMAP

IF :DEF:EXTMEM_MODE

MOV R1, #3

ELIF :DEF:RAM_MODE

MOV R1, #2

ELSE

MOV R1, #1

ENDIF

STR R1, [R0]

ENDIF

; Initialise Interrupt System

; ...

; Setup Stack for each mode

LDR R0, =Stack_Top

; Enter Undefined Instruction Mode and set its Stack Pointer

MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit

MOV SP, R0

SUB R0, R0, #UND_Stack_Size

; Enter Abort Mode and set its Stack Pointer

MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit

MOV SP, R0

SUB R0, R0, #ABT_Stack_Size

; Enter FIQ Mode and set its Stack Pointer

MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit

MOV SP, R0

SUB R0, R0, #FIQ_Stack_Size

; Enter IRQ Mode and set its Stack Pointer

MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit

MOV SP, R0

SUB R0, R0, #IRQ_Stack_Size

; Enter Supervisor Mode and set its Stack Pointer

MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit

MOV SP, R0

SUB R0, R0, #SVC_Stack_Size

; Enter User Mode and set its Stack Pointer

MSR CPSR_c, #Mode_USR

IF :DEF:__MICROLIB

EXPORT __initial_sp

ELSE

MOV SP, R0

SUB SL, SP, #USR_Stack_Size

ENDIF

; Enter the C code

IMPORT __main

LDR R0, =__main

BX R0

IF :DEF:__MICROLIB

EXPORT __heap_base

EXPORT __heap_limit

ELSE

; User Initial Stack & Heap

AREA |.text|, CODE, READONLY

IMPORT __use_two_region_memory

EXPORT __user_initial_stackheap

__user_initial_stackheap

LDR R0, = Heap_Mem

LDR R1, =(Stack_Mem + USR_Stack_Size)

LDR R2, = (Heap_Mem + Heap_Size)

LDR R3, = Stack_Mem

BX LR

ENDIF

END

  1. os_cpu_s.s文件:

/****************************************Copyright (c)**************************************************

;** 广州周立功单片机发展有限公司

;** 研 究 所

;** 产品一部

;**

;** http://www.zlgmcu.com

;**

;**--------------文件信息--------------------------------------------------------------------------------

;**文 件 名: os_cpu_s.s

;**创 建 人: 陈明计

;**最后修改日期: 2003年6月19日

;**描 述: μCOS-II在LPC210x上的移植代码汇编代码部分,用ADS1.2编译

;**

;**--------------历史版本信息----------------------------------------------------------------------------

;** 创建人: 陈明计

;** 版 本: V1.0

;** 日 期: 2003年6月5日

;** 描 述: 原始版

;**

;**------------------------------------------------------------------------------------------------------

;** 修改人: 陈明计

;** 版 本: V1.1

;** 日 期: 2003年6月11日

;** 描 述: 配合Vectors.s更正IRQ嵌套的BUG而作相应的修改

;**

;**------------------------------------------------------------------------------------------------------

;** 修改人: 陈明计

;** 版 本: V1.2

;** 日 期: 2003年6月13日

;** 描 述: 按照μCOS-II V2.52的要求修改(以前是基于μCOS-II V2.0)

;**

;**------------------------------------------------------------------------------------------------------

;** 修改人: 陈明计

;** 版 本: V1.3

;** 日 期: 2003年6月19日

;** 描 述: 不完全按照μCOS-II V2.52的要求以提高效率

;**

;**------------------------------------------------------------------------------------------------------

;** 修改人: 陈明计

;** 版 本: V1.3

;** 日 期: 2004年8月27日

;** 描 述: 提高SWI异常服务程序的效率

;**

图文资讯
广告赞助商