搜档网
当前位置:搜档网 › Cortex M3汇编程序示例

Cortex M3汇编程序示例

GET ..\ASMFILE\LPC1700Cfg.s ;包含CPU特殊寄存器定义文件
GET ..\ASMFILE\LPC1700PinCfg.s ;包含芯片管脚功能定义文件
GET ..\ASMFILE\TargetCfg.s ;包含目标板常数内存定义文件

PRESERVE8
THUMB
;Vector Table Mapped to Address 0 at Reset复位后映射在地址0x00000000处的向量表
AREA RESET, CODE, READONLY
DCD Stack_Top ; 0: Top of Stack 堆栈顶端定义
DCD START ; 1: Reset Handler 复位入口地址
DCD NMI_Handler ; 2: NMI Handler 不可屏蔽中断
DCD HardFault_Handler ; 3: Hard Fault Handler 硬件失败中断
DCD MemManage_Handler ; 4: MPU Fault Handler 存储器管理失败
DCD BusFault_Handler ; 5: Bus Fault Handler 总线失败
DCD UsageFault_Handler ; 6: Usage Fault Handler 用法失败
DCD 0 ; 7: Reserved 保留[自生成校验和值]
DCD 0 ; 8: Reserved 保留
DCD 0 ; 9: Reserved 保留
DCD 0 ;10: Reserved 保留
DCD SVC_Handler ;11: SVCall Handler 调用SVC异常中断
DCD DebugMon_Handler ;12: Debug Monitor Handler 调试监视器请求中断
DCD 0 ;13: Reserved 保留
DCD PendSV_Handler ;14: PendSV Handler 系统设备挂起请求
DCD SysTick_Handler ;15: SysTick Handler 系统节拍定时器
;External Interrupts 外部中断
DCD WDT_IRQHandler ;16: Watchdog Timer 看门狗定时器中断
DCD TIMER0_IRQHandler ;17: Timer0 定时/计数器0中断
DCD TIMER1_IRQHandler ;18: Timer1 定时/计数器1中断
DCD TIMER2_IRQHandler ;19: Timer2 定时/计数器2中断
DCD TIMER3_IRQHandler ;20: Timer3 定时/计数器3中断
DCD UART0_IRQHandler ;21: UART0 串口0中断
DCD UART1_IRQHandler ;22: UART1 串口1中断
DCD UART2_IRQHandler ;23: UART2 串口2中断
DCD UART3_IRQHandler ;24: UART3 串口3中断
DCD PWM1_IRQHandler

;25: PWM1 PWM1中断
DCD I2C0_IRQHandler ;26: I2C0 I2C0中断
DCD I2C1_IRQHandler ;27: I2C1 I2C1中断
DCD I2C2_IRQHandler ;28: I2C2 I2C2中断
DCD SPI_IRQHandler ;29: SPI SPI中断
DCD SSP0_IRQHandler ;30: SSP0 SSP0中断
DCD SSP1_IRQHandler ;31: SSP1 SSP1中断
DCD PLL0_IRQHandler ;32: PLL0 Lock (Main PLL) PLL0锁定中断
DCD RTC_IRQHandler ;33: Real Time Clock 实时时钟中断
DCD EINT0_IRQHandler ;34: External Interrupt 0 外部中断0
DCD EINT1_IRQHandler ;35: External Interrupt 1 外部中断1
DCD EINT2_IRQHandler ;36: External Interrupt 2 外部中断2
DCD EINT3_IRQHandler ;37: External Interrupt 3 外部中断3
DCD ADC_IRQHandler ;38: A/D Converter A/D转换器中断
DCD BOD_IRQHandler ;39: Brown-Out Detect 掉电检测中断
DCD USB_IRQHandler ;40: USB USB中断
DCD CAN_IRQHandler ;41: CAN CAN总线中断
DCD DMA_IRQHandler ;42: General Purpose DMA GPDMA中断
DCD I2S_IRQHandler ;43: I2S I2S中断
DCD ENET_IRQHandler ;44: Ethernet 以太网中断
DCD RIT_IRQHandler ;45: Repetitive Interrupt Timer 重复中断定时器
DCD MCPWM_IRQHandler ;46: Motor Control PWM 电机控制PWM
DCD QEI_IRQHandler ;47: Quadrature Encoder Interface正交编码器
DCD PLL1_IRQHandler ;48: PLL1 Lock (USB PLL) PLL1锁定中断
DCD USBActivity_IRQHandler ;49: USB Activity interrupt to wakeup USB活动
DCD CANActivity_IRQHandler ;50: CAN Activity interrupt to wakeup CAN活动
;Address 0x0000 02FC ISP-Flash在地址0x0000 02FC处定义ISP访问片内Flash的限制等级[调试-0,商用-2]
AREA |.ARM.__at_0x02FC|, CODE, READONLY
DCD 0xFFFFFFFF ;调试CRP_LEVEL=0 0xFFFFFFFF
;商用CRP_LEVEL=2 0x87654321
AREA |.itext|, CODE, READONLY ;异常中断代码段
NMI_Handler ; 2: NMI Handler 不可屏蔽中断
NOP ;P2_10未配置为NMI输入不会引起该中断

LDR R1, =AIRCR ;应用程序中断及复位控制寄存器[0xFA050000]
LDR R0, =0x05FA0004 ;SYSRESETREQ=1请求芯片的控制逻辑产生一次复位
STR R0, [R1]
deadloop
B deadloop ;死循环,等待芯片复位
BX lr ;中断返回
ALIGN ;代码存储对齐
HardFault_Handler ; 3: Hard Fault Handler 硬件失败中断
MemManage_Handler ; 4: MPU Fault Handler 存储器管理失败
BusFault_Handler ; 5: Bus Fault Handler 总线失败
UsageFault_Handler ; 6: Usage Fault Handler 用法失败
MOVW R1, #Stacked_NUM ;fault计数值
MOVT R1, #MEMADDG ;内存单元地址高16位
LDR R0, [R1]
ADD R0, R0, #1 ;fault计数值+1
STR R0, [R1]
TST LR, #0x04
ITE EQ
MRSEQ R2, MSP
MRSNE R2, PSP
STR R2, [R1, #0x04] ;Stacked_MSP=fault压栈MSP值
LDR R0, [R2, #0x00]
STR R0, [R1, #0x08] ;Stacked_R0=fault压栈R0值
LDR R0, [R2, #0x04]
STR R0, [R1, #0x0C] ;Stacked_R1=fault压栈R1值
LDR R0, [R2, #0x08]
STR R0, [R1, #0x10] ;Stacked_R2=fault压栈R2值
LDR R0, [R2, #0x0C]
STR R0, [R1, #0x14] ;Stacked_R3=fault压栈R3值
LDR R0, [R2, #0x10]
STR R0, [R1, #0x18] ;Stacked_R12=fault压栈R12值
LDR R0, [R2, #0x14]
STR R0, [R1, #0x1C] ;Stacked_LR=fault压栈LR值
LDR R0, [R2, #0x18]
STR R0, [R1, #0x20] ;Stacked_PC=fault压栈PC值
LDR R0, [R2, #0x1C]
STR R0, [R1, #0x24] ;Stacked_PSR=fault压栈PSR值
LDR R2, =MMAR ;存储器管理失败状态寄存器-R/W[0]
LDR R0, [R2]
STR R0, [R1, #0x28] ;Stacked_MMAR=fault压栈MMAR值
LDR R2, =BFAR ;总线失败地址寄存器-R/W
LDR R0, [R2]
STR R0, [R1, #0x2C] ;Stacked_BFAR=fault压栈BFAR值
LDR R2, =CFSR ;可配置失败状态寄存器-R/W[0]
LDR R0, [R2]
STR R0, [R1, #0x30] ;Stacked_CFSR=fault压栈CFSR值
LDR R2, =HFSR ;硬

件失败状态寄存器-R/W[0]
LDR R0, [R2]
STR R0, [R1, #0x34] ;Stacked_HFSR=fault压栈HFSR值
LDR R2, =DFSR ;调试失败状态寄存器-R/W[0]
LDR R0, [R2]
STR R0, [R1, #0x38] ;Stacked_DFSR=fault压栈DFSR值
LDR R2, =AFSR ;辅助失败寄存器-R/W
LDR R0, [R2]
STR R0, [R1, #0x3C] ;Stacked_AFSR=fault压栈AFSR值
NOP
LDR R1, =AIRCR ;应用程序中断及复位控制寄存器[0xFA050000]
LDR R0, =0x05FA0002 ;VECTCLRACTIVE=1清零所有异常的活动状态信息
STR R0, [R1]
BX lr ;中断返回
ALIGN ;代码存储对齐
SVC_Handler ;11: SVCall Handler 调用SVC异常中断
DebugMon_Handler ;12: Debug Monitor Handler 调试监视器请求中断
PendSV_Handler ;14: PendSV Handler 系统设备挂起请求
SysTick_Handler ;15: SysTick Handler 系统节拍定时器
BX lr ;中断返回
ALIGN ;代码存储对齐
;External Interrupts外部中断
WDT_IRQHandler ;16: Watchdog Timer 看门狗定时器中断
BX lr ;中断返回
TIMER0_IRQHandler ;17: Timer0 定时/计数器0中断
LDR R1, =T0IR ;T0中断寄存器-R/W[0x00]
MOV R0, #0x01 ;复位(清零)中断标志
STR R0, [R1]
NOP
MOVW R1, #Base_timer0 ;基础定时计数器字节0[32:500us+1循环计数]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDR R0, [R1]
ADD R0, R0, #1 ;500us+1
STR R0, [R1]
NOP
MOVW R1, #BtimeCh ;基础定时计数器改变
MOVT R1, #MEMADDG ;内存单元地址高16位
MOV R0, #0x01
STRB R0, [R1]
BX lr ;中断返回
TIMER1_IRQHandler ;18: Timer1 定时/计数器1中断
TIMER2_IRQHandler ;19: Timer2 定时/计数器2中断
TIMER3_IRQHandler ;20: Timer3 定时/计数器3中断


BX lr ;中断返回
UART0_IRQHandler ;21: UART0 串口0中断[数据接收]
LDR R1, =U0IIR ;U0中断ID寄存器-R0[0x01]
LDR R0, [R1]
TST R0, #0x01 ;bit0=0/1=有中断挂起/无中断
BNE UART0_IRQ9 ;不相等/非0[Z==0]转移
AND R0, R0, #0x0E
CMP R0, #0x04 ;接收数据可用[8字符]
BNE UART0_IRQ5 ;不相等/非0[Z==0]转移
MOV R3, #0x08 ;待收8字符数据
MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R2, [R1]
UART0_IRQ1
LDR R1, =U0RBR ;U0接收器缓冲寄存器-RO
LDR R0, [R1]
MOVW R1, #UART0_RecBuff ;Uart0接收数据缓冲区[256单元]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1, R2]
ADD R2, R2, #1
AND R2, R2, #0xFF
SUBS R3, R3, #1
BNE UART0_IRQ1 ;不相等/非0[Z==0]转移
MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R2, [R1]
MOVW R1, #UART0_Stat ;Uart0状态字节
MOVT R1, #MEMADDG ;内存单元地址高16位
MOV R0, #0x01 ;已收到新数据
STRB R0, [R1]
B UART0_IRQ9
UART0_IRQ5
CMP R0, #0x0C ;字符超时指示
BNE UART0_IRQ9 ;不相等/非0[Z==0]转移
UART0_IRQ6
LDR R1, =U0LSR ;U0线状态寄存器-R0[0x60]
LDR R0, [R1]
TST R0, #0x01 ;bit0=0/1=U0RBR空/有有效数据
BEQ UART0_IRQ9 ;相等/为0[Z==1]转移
MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R2, [R1]
LDR R1, =U0RBR ;U0接收器缓冲寄存器-RO
LDR R0, [R1]
MOVW R1, #UART0_RecBuff ;Uart0接收数据缓冲区[256单元]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1, R2]
ADD R2, R2, #1
AND R2, R2, #0xFF

MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R2, [R1]
MOVW R1, #UART0_Stat ;Uart0状态字节
MOVT R1, #MEMADDG ;内存单元地址高16位
MOV R0, #0x01 ;已收到新数据
STRB R0, [R1]
B UART0_IRQ6
UART0_IRQ9
BX lr ;中断返回
UART1_IRQHandler ;22: UART1 串口1中断[数据接收]
UART2_IRQHandler ;23: UART2 串口2中断[数据接收]
UART3_IRQHandler ;24: UART3 串口3中断[数据接收]
BX lr ;中断返回
ALIGN
PWM1_IRQHandler ;25: PWM1 PWM1中断
I2C0_IRQHandler ;26: I2C0 I2C0中断
I2C1_IRQHandler ;27: I2C1 I2C1中断
I2C2_IRQHandler ;28: I2C2 I2C2中断
SPI_IRQHandler ;29: SPI SPI中断
SSP0_IRQHandler ;30: SSP0 SSP0中断
SSP1_IRQHandler ;31: SSP1 SSP1中断
PLL0_IRQHandler ;32: PLL0 Lock (Main PLL) PLL0锁定中断
RTC_IRQHandler ;33: Real Time Clock 实时时钟中断
EINT0_IRQHandler ;34: External Interrupt 0 外部中断0
EINT1_IRQHandler ;35: External Interrupt 1 外部中断1
EINT2_IRQHandler ;36: External Interrupt 2 外部中断2
EINT3_IRQHandler ;37: External Interrupt 3 外部中断3
ADC_IRQHandler ;38: A/D Converter A/D转换器中断
BOD_IRQHandler ;39: Brown-Out Detect 掉电检测中断
USB_IRQHandler ;40: USB USB中断
CAN_IRQHandler ;41: CAN CAN总线中断
DMA_IRQHandler ;42: General Purpose DMA GPDMA中断
I2S_IRQHandler ;43: I2S I2S中断
ENET_IRQHandler ;44: Ethernet 以太网中断
RIT_IRQHandler ;45: Repetitive Interrupt Timer 重复中断定时器
MCPWM_IRQHandler ;46: Motor Control PWM 电机

控制PWM
QEI_IRQHandler ;47: Quadrature Encoder Interface正交编码器
PLL1_IRQHandler ;48: PLL1 Lock (USB PLL) PLL1锁定中断
USBActivity_IRQHandler ;49: USB Activity interrupt to wakeup USB活动
CANActivity_IRQHandler ;50: CAN Activity interrupt to wakeup CAN活动
BX lr ;中断返回
ALIGN
LTORG ;异常中断文字池
AREA |.mtext|, CODE, READONLY ;主处理代码段
ENTRY ;程序执行入口
START ;程序开始
CPSID I ;关中断PRIMASK=1
NOP
BL MemInit ;内存数据初始化
NOP
BL ClockInit ;系统时钟初始化
NOP
BL PinInit ;芯片管脚初始化
NOP
BL Timer0Init ;定时器0初始化
NOP
BL Uart0Init ;串口0初始化
NOP
BL WDTInit ;看门狗定时器初始化
CPSIE I ;开中断PRIMASK=0
NOP ;BEEP用P0.7连接
LDR R1, =FIO0DIR ;BEEP_INIT()
LDR R0, [R1] ;FIO0DIR |= BEEP
ORR R0, #0x80 ;BEEP=(1ul<<7)=0x80
STR R0, [R1]
LDR R1, =FIO0SET ;BEEP_OFF()
MOV R0, #0x80 ;FIO0SET = BEEP
STR R0, [R1]
NOP ;LED1-4用P2.0-3连接
LDR R1, =FIO2DIR ;LED1/2/3/4_INIT()
LDR R0, [R1] ;FIO2DIR |= LED1|LED2|LED3|LED4
ORR R0, #0x0F ;LED1=(1ul<<0)=0x01
STR R0, [R1] ;LED2=0x02,LED3=0x04,LED4=0x08
LDR R1, =FIO2SET ;LED1_OFF()
MOV R0, #0x0F ;FIO2SET = LED1|LED2|LED3|LED4
STR R0, [R1]
B Mainloop ;转主循环
MemInit ;内存数据初始化
MOVW R1, #Init_Mem_Flag ;初始化[0x0040-0x007F]标志
MOVT R1, #MEMADDG ;内存单元地址高16位
LDR R2, [R1] ;=0x55AA55AA不清0x0000-0x007F区
MOV32 R3, #0x55AA55AA
CMP R2, R3
ITE EQ

MOVEQ R2, #0x0080 ;不清0x0000-0x007F区
MOVNE R2, #0x0000 ;清零0x0000-0x007F区
MOVT R2, #MEMADDG ;内存单元地址高16位
MOV R0, #0x00
MOV32 R1, #Stack_Top ;堆栈顶点地址
SUB R1, R1, #0x100 ;预留256个堆栈单元不清零
MemInit0
STR R0, [R1, #-0x04]!
CMP R1, R2
BNE MemInit0 ;不相等/非0[Z==0]转移
MOVW R1, #Init_Mem_Flag ;初始化[0x0040-0x007F]标志
MOVT R1, #MEMADDG ;内存单元地址高16位
STR R3, [R1] ;=0x55AA55AA
BX lr ;子程返回
ClockInit ;系统时钟初始化
LDR R1, =FLASHCFG ;FLASH安全有效运行,避免调试错误[使用6个CPU时钟]
MOV R0, #0x503A ;FLASHCFG=((0x05ul<<12)&(~(0x003f)))|0x003a
STR R0, [R1]
NOP
LDR R1, =PCLKSEL0 ;外设时钟选择寄存器
MOV32 R0, #0x00000000 ;PCLK=CCLK/4,PCLKSEL0=PCLKSEL1=0x00000000[24MHz]
STR R0, [R1] ;PCLK=CCLK/2,PCLKSEL0=PCLKSEL1=0xAAAAAAAA[48MHz]
LDR R1, =PCLKSEL0 ;PCLK=CCLK ,PCLKSEL0=PCLKSEL1=0x55555555[96MHz]
MOV32 R0, #0x00000000 ;PCLK=CCLK/8,PCLKSEL0=PCLKSEL1=0xFFFFFFFF[12MHz]
STR R0, [R1]
NOP
LDR R1, =CLKOUTCFG ;关闭时钟输出[CLKOUT脚=P1.27]
MOV R0, #0x00
STR R0, [R1]
NOP
LDR R1, =PLL0STAT ;关闭PLL,避免调速错误
LDR R0, [R1] ;bit24=PLLE0=1=PLL0处于激活状态
MOV R0, R0, LSR #24 ;bit25=PLLC0=1=PLL0连接控制
CMP R0, #0x01 ;bit26=PLOCK0=1=PLL0锁定状态
BNE ClockInit0 ;不相等/非0[Z==0]转移
LDR R1, =PLL0CON ;如果PLL0已连接,则先断开PLL0连接
MOV R0, #0x01 ;Enable PLL,,disconnected
STR R0, [R1]
LDR R1, =PLL0FEED
MOV R0, #0xAA
STR R0, [R1]
MOV R0, #0x55
STR R0, [R1]
ClockInit0
LDR R1, =PLL0CON ;禁止PLL0
MOV R0, #0x00 ;Disable PLL,disconnected
STR R0, [R1]
LDR R1, =PLL0FEED
MOV R0, #0xAA
STR

R0, [R1]
MOV R0, #0x55
STR R0, [R1]
NOP
ClockInit1
LDR R1, =PLL0STAT ;检查PLL0状态
LDR R0, [R1]
TST R0, #0x3000000 ;测试bit25.bit24[=00]
BNE ClockInit1 ;不相等/非0[Z==0]转移
NOP
LDR R1, =SCS ;设置主要时钟
LDR R0, [R1] ;使能主振荡器1-20MHz
AND R0, #0x04 ;Enable mainOSC,1MHz-20MHz
ORR R0, #0x20 ;bit5=1=主振荡器使能
STR R0, [R1] ;bit4=0=频率范围1MHz-20MHz
NOP
ClockInit2
LDR R1, =SCS ;检查主振荡器状态
LDR R0, [R1]
TST R0, #0x40 ;测试bit6[=1 主振荡器已稳定]
BEQ ClockInit2 ;相等/为0[Z==1]转移
NOP
LDR R1, =CLKSRCSEL ;select main OSC as the PLL clock source
MOV R0, #0x01 ;选择主振荡器作为PLL0输入时钟源
STR R0, [R1]
NOP
LDR R1, =PLL0CFG ;Enable but disconnect PLL,设置M和N
MOV R0, #0x0B ;((PLL_NVALUE-1)<<16)|(PLL_MVALUE-1)
STR R0, [R1] ;PLL_NVALUE=1,PLL_MVALUE=12
LDR R1, =PLL0FEED
MOV R0, #0xAA
STR R0, [R1]
MOV R0, #0x55
STR R0, [R1]
LDR R1, =PLL0CON ;Enable but disconnect PLL
MOV R0, #0x01 ;使能但不连接PLL0
STR R0, [R1]
LDR R1, =PLL0FEED
MOV R0, #0xAA
STR R0, [R1]
MOV R0, #0x55
STR R0, [R1]
NOP
ClockInit3
LDR R1, =PLL0STAT ;等待PLL0可用
LDR R0, [R1]
TST R0, #0x1000000 ;测试bit24[=1 PLL0使能]
BEQ ClockInit3 ;相等/为0[Z==1]转移
NOP
LDR R1, =CCLKCFG ;设置CCLKCFG,对PLL0输出进行3分频产生CCLK
MOV R0, #0x02 ;(FCCO/FCCLK)-1
STR R0, [R1]; ;FCC0=288MHz,FCCLK=96MHz
NOP
ClockInit4
LDR R1, =PLL0STAT ;Check lock bit status
LDR R0, [R1] ;等待PLL0锁定
TST R0, #0x4000000 ;测试bit26[=1 PLL0锁定]
BEQ ClockInit4

;相等/为0[Z==1]转移
NOP
ClockInit5
LDR R1, =PLL0STAT ;((PLL0STAT&0x00007FFF)!=(PLL_MVALUE-1))
LDR R0, [R1]
UBFX R0, R0, #0, #15 ;提取bit14-bit0[=&0x00007FFF],(msb=0+15-1)
CMP R0, #0x0B; ;检查PLL_MVALUE=12
BEQ ClockInit6 ;相等/为0[Z==1]转移
LDR R1, =PLL0STAT ;((PLL0STAT&0x00FF0000)>>16)!=(PLL_NVALUE-1)
LDR R0, [R1]; ;检查PLL_NVALUE=1
UBFX R0, R0, #16, #8 ;提取bit23-bit16[=&0x00FF0000],(msb=16+8-1)
CMP R0, #0x00
BNE ClockInit5 ;不相等/非0[Z==0]转移
ClockInit6
LDR R1, =PLL0CON ;connect the PLL
MOV R0, #0x03 ;使能并连接PLL0
STR R0, [R1]
LDR R1, =PLL0FEED
MOV R0, #0xAA
STR R0, [R1]
MOV R0, #0x55
STR R0, [R1]
NOP
ClockInit7
LDR R1, =PLL0STAT ;Wait until the PLL is connected and locked
LDR R0, [R1] ;等待PLL0锁定并连接
TST R0, #0x2000000 ;测试bit25[=1 连接]
BEQ ClockInit7 ;相等/为0[Z==1]转移
NOP
LDR R1, =USBCLKCFG ;设置USB时钟
MOV R0, #0x05 ;(FCCO/FUSBCLK)-1,FCC0=288MHz,FUSBCLK=48MHz
STR R0, [R1]
LDR R1, =PLL1CON ;未使用PLL1
MOV R0, #0x00
STR R0, [R1]
LDR R1, =PLL1FEED
MOV R0, #0xAA
STR R0, [R1]
MOV R0, #0x55
STR R0, [R1]
NOP
LDR R1, =FLASHCFG ;设置存储器加速模块,6个CPU时钟,完全安全有效
MOV R0, #0x503A ;FLASHCFG=((0x05ul<<12)&(~(0x003f)))|0x003a
STR R0, [R1]
NOP
LDR R1, =STCALIB ;系统定时器校准值[复位值0x0F423F]
MOV32 R0, #0x000EA600 ;FCCLK/100[产生系统10ms中断定时信号]
STR R0, [R1]
BX lr ;子程返回
PinInit ;芯片管脚初始化
LDR R1, =PINSEL0 ;引脚连接配置P0.00 -- P0.15
MOV32 R0, #((P0_15_FNUC << 30):OR:(P0_11_FNUC << 22):OR:(P0_10_FNUC << 20):OR:\
(P0_9_FNUC << 18):OR:(P0_8_FNUC << 16):OR:(P0_7_FNUC << 14):OR:\

(P0_6_FNUC << 12):OR:(P0_5_FNUC << 10):OR:(P0_4_FNUC << 8):OR:\
(P0_3_FNUC << 6):OR:(P0_2_FNUC << 4):OR:(P0_1_FNUC << 2):OR:\
(P0_0_FNUC << 0))
STR R0, [R1]
LDR R1, =PINSEL1 ;引脚连接配置P0.16 -- P0.30
MOV32 R0, #((P0_30_FNUC << 28):OR:(P0_29_FNUC << 26):OR:(P0_28_FNUC << 24):OR:\
(P0_27_FNUC << 22):OR:(P0_26_FNUC << 20):OR:(P0_25_FNUC << 18):OR:\
(P0_24_FNUC << 16):OR:(P0_23_FNUC << 14):OR:(P0_22_FNUC << 12):OR:\
(P0_21_FNUC << 10):OR:(P0_20_FNUC << 8):OR:(P0_19_FNUC << 6):OR:\
(P0_18_FNUC << 4):OR:(P0_17_FNUC << 2):OR:(P0_16_FNUC << 0))
STR R0, [R1]
LDR R1, =PINSEL2 ;引脚连接配置P1.0 -- P1.15
MOV32 R0, #((P1_15_FNUC << 30):OR:(P1_14_FNUC << 28):OR:(P1_10_FNUC << 20):OR:\
(P1_9_FNUC << 18):OR:(P1_8_FNUC << 16):OR:(P1_4_FNUC << 8):OR:\
(P1_1_FNUC << 2):OR:(P1_0_FNUC << 0))
STR R0, [R1]
LDR R1, =PINSEL3 ;引脚连接配置P1.16 -- P1.31
MOV32 R0, #((P1_31_FNUC << 30):OR:(P1_30_FNUC << 28):OR:(P1_29_FNUC << 26):OR:\
(P1_28_FNUC << 24):OR:(P1_27_FNUC << 22):OR:(P1_26_FNUC << 20):OR:\
(P1_25_FNUC << 18):OR:(P1_24_FNUC << 16):OR:(P1_23_FNUC << 14):OR:\
(P1_22_FNUC << 12):OR:(P1_21_FNUC << 10):OR:(P1_20_FNUC << 8):OR:\
(P1_19_FNUC << 6):OR:(P1_18_FNUC << 4):OR:(P1_17_FNUC << 2):OR:\
(P1_16_FNUC << 0))
STR R0, [R1]
LDR R1, =PINSEL4 ;引脚连接配置P2.0 -- P2.13
MOV32 R0, #((P2_13_FNUC << 26):OR:(P2_12_FNUC << 24):OR:(P2_11_FNUC << 22):OR:\
(P2_10_FNUC << 20):OR:(P2_9_FNUC << 18):OR:(P2_8_FNUC << 16):OR:\
(P2_7_FNUC << 14):OR:(P2_6_FNUC << 12):OR:(P2_5_FNUC << 10):OR:\
(P2_4_FNUC << 8):OR:(P2_3_FNUC << 6):OR:(P2_2_FNUC << 4):OR:\
(P2_1_FNUC << 2):OR:(P2_0_FNUC << 0))
STR R0, [R1]
LDR R1, =PINSEL7 ;引脚连接配置P3.25 -- P3.26
MOV32 R0, #((P3_26_FNUC << 20):OR:(P3_25_FNUC << 18))
STR R0, [R1]
LDR R1, =PINSEL9 ;引脚连接配置P4.28 -- P4.29
MOV32 R0, #((P4_29_FNUC <<26):OR:(P4_28_FNUC <<24))
STR R0, [R1]
LDR R1, =PINSEL10
MOV R0, #P10_3_FNUC ;禁止ETM接口功能
STR R0, [R1]

NOP
LDR R1, =PINMODE0 ;引脚内部上下拉电阻配置
MOV32 R0, #((P0_15_MODE << 30):OR:(P0_14_MODE << 28):OR:(P0_13_MODE << 26):OR:\
(P0_12_MODE << 24):OR:(P0_11_MODE << 22):OR:(P0_10_MODE << 20):OR:\
(P0_9_MODE << 18):OR:(P0_8_MODE << 16):OR:(P0_7_MODE << 14):OR:\
(P0_6_MODE << 12):OR:(P0_5_MODE << 10):OR:(P0_4_MODE << 8):OR:\
(P0_3_MODE << 6):OR:(P0_2_MODE << 4):OR:(P0_1_MODE << 2):OR:\
(P0_0_MODE << 0))
STR R0, [R1]
LDR R1, =PINMODE1
MOV32 R0, #((P0_30_MODE << 28):OR:(P0_29_MODE << 26):OR:(P0_28_MODE << 24):OR:\
(P0_27_MODE << 22):OR:(P0_26_MODE << 20):OR:(P0_25_MODE << 18):OR:\
(P0_24_MODE << 16):OR:(P0_23_MODE << 14):OR:(P0_22_MODE << 12):OR:\
(P0_21_MODE << 10):OR:(P0_20_MODE << 8):OR:(P0_19_MODE << 6):OR:\
(P0_18_MODE << 4):OR:(P0_17_MODE << 2):OR:(P0_16_MODE << 0))
STR R0, [R1]
LDR R1, =PINMODE2
MOV32 R0, #((P1_15_MODE << 30):OR:(P1_14_MODE << 28):OR:(P1_13_MODE << 26):OR:\
(P1_12_MODE << 24):OR:(P1_11_MODE << 22):OR:(P1_10_MODE << 20):OR:\
(P1_9_MODE << 18):OR:(P1_8_MODE << 16):OR:(P1_7_MODE << 14):OR:\
(P1_6_MODE << 12):OR:(P1_5_MODE << 10):OR:(P1_4_MODE << 8):OR:\
(P1_3_MODE << 6):OR:(P1_2_MODE << 4):OR:(P1_1_MODE << 2):OR:\
(P1_0_MODE << 0))
STR R0, [R1]
LDR R1, =PINMODE3
MOV32 R0, #((P1_31_MODE << 30):OR:(P1_30_MODE << 28):OR:(P1_29_MODE << 26):OR:\
(P1_28_MODE << 24):OR:(P1_27_MODE << 22):OR:(P1_26_MODE << 20):OR:\
(P1_25_MODE << 18):OR:(P1_24_MODE << 16):OR:(P1_23_MODE << 14):OR:\
(P1_22_MODE << 12):OR:(P1_21_MODE << 10):OR:(P1_20_MODE << 8):OR:\
(P1_19_MODE << 6):OR:(P1_18_MODE << 4):OR:(P1_17_MODE << 2):OR:\
(P1_16_MODE << 0))
STR R0, [R1]
LDR R1, =PINMODE4
MOV32 R0, #((P2_15_MODE << 30):OR:(P2_14_MODE << 28):OR:(P2_13_MODE << 26):OR:\
(P2_12_MODE << 24):OR:(P2_11_MODE << 22):OR:(P2_10_MODE << 20):OR:\
(P2_9_MODE << 18):OR:(P2_8_MODE << 16):OR:(P2_7_MODE << 14):OR:\
(P2_6_MODE << 12):OR:(P2_5_MODE << 10):OR:(P2_4_MODE << 8):OR:\
(P2_3_MODE << 6):OR:(P2_2_MODE << 4):OR:(P2_1_MODE << 2):OR:\
(P2_0_MODE << 0))

STR R0, [R1]
LDR R1, =PINMODE7
MOV32 R0, #((P3_26_MODE << 20):OR:(P3_25_MODE << 18))
STR R0, [R1]
LDR R1, =PINMODE9
MOV32 R0, #((P4_29_MODE << 26):OR:(P4_28_MODE << 24))
STR R0, [R1]
MOV R0, #0x00 ;不屏蔽引脚高速功能
LDR R1, =FIO0MASK
STR R0, [R1]
LDR R1, =FIO1MASK
STR R0, [R1]
LDR R1, =FIO2MASK
STR R0, [R1]
LDR R1, =FIO3MASK
STR R0, [R1]
LDR R1, =FIO4MASK
STR R0, [R1]
NOP
LDR R1, =PCONP ;外设功能初始化[1-使能/0-禁止]
MOV32 R0, #((PCTIM0_FUNC << 1):OR:(PCTIM1_FUNC << 2):OR:(PCUART0_FUNC << 3):OR:\
(PCUART1_FUNC << 4):OR:(PWM1_FUNC << 6):OR:(PCI2C0_FUNC << 7):OR:\
(PCSPI_FUNC << 8):OR:(PCRTC_FUNC << 9):OR:(PCSSP1_FUNC << 10):OR:\
(PCAD_FUNC << 12):OR:(PCCAN1_FUNC << 13):OR:(PCCAN2_FUNC << 14):OR:\
(PCGPIO_FUNC << 15):OR:(PCRIT_FUNC << 16):OR:(PCMC_FUNC << 17):OR:\
(PCQEI_FUNC << 18):OR:(PCI2C1_FUNC << 19):OR:(PCSSP0_FUNC << 21):OR:\
(PCTIM2_FUNC << 22):OR:(PCTIM3_FUNC << 23):OR:(PCUART2_FUNC << 24):OR:\
(PCUART3_FUNC << 25):OR:(PCI2C2_FUNC << 26):OR:(PCI2S_FUNC << 27):OR:\
(PCGPDMA_FUNC << 29):OR:(PCENET_FUNC << 30):OR:(PCUSB_FUNC << 31))
STR R0, [R1]
BX lr ;子程返回
Timer0Init ;定时器0初始化
LDR R1, =T0TCR ;T0定时器控制寄存器-R/W[0x00]
MOV R0, #0x02 ;计数器复位
STR R0, [R1]
LDR R1, =T0IR ;T0中断寄存器-R/W[0x00]
MOV R0, #0x01 ;匹配通道0的中断标志
STR R0, [R1]
LDR R1, =T0CTCR ;T0计数控制寄存器-R/W[0x00]
MOV R0, #0x00 ;定时器模式
STR R0, [R1]
LDR R1, =T0TC ;T0保存定时器/计数器的计数值-R/W[0x00]
MOV R0, #0x00 ;TC+1
STR R0, [R1]
LDR R1, =T0PR ;T0预分频寄存器-R/W[0x00]
MOV R0, #0x00 ;PR=0,TC每1个PCLK周期+1
STR R0, [R1]
LDR R1, =T0MR0 ;T0匹配寄存器0-R/W[0x00]

MOV R0, #0x2EE0 ;=FPCLK=24000000为每秒产生1次中断[T0TC=T0MR0值]
STR R0, [R1] ;0x2EE0=12000=24000000/2000 => 500us中断
LDR R1, =T0MCR ;T0匹配控制寄存器-R/W[0x00]
MOV R0, #0x03 ;MR0与TC值匹配时产生中断并使TC复位
STR R0, [R1]
NOP ;设置系统中断并使能
LDR R1, =IPR0 ;外部中断优先级寄存器组的基地址[0xE000E400]
MOV R0, #PRIO_THREE ;优先级为3,NVIC_TIMER0=17 => IRQ #N=#(17-16)=#1
STRB R0, [R1, #(NVIC_TIMER0-16)]
NOP
LDR R1, =SETENA0 ;中断使能寄存器组的基地址[0xE000E100]
LDR R0, [R1] ;中断使能,NVIC_TIMER0=17 => IRQ #N=#(17-16)=#1
ORR R0, R0, #(1<<(NVIC_TIMER0-16))
STR R0, [R1]
NOP
LDR R1, =T0TCR ;T0定时器控制寄存器-R/W[0x00]
MOV R0, #0x01 ;计数器使能
STR R0, [R1]
NOP
NOP
MOV R0, #0x00 ;初始化计时单元
MOVW R1, #Base_timer0 ;基础定时计数器字节0[32:500us+1循环计数]
MOVT R1, #MEMADDG ;内存单元地址高16位
STR R0, [R1]
MOVW R1, #Time_10ms ;10ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1]
STRB R0, [R1, #1] ;Time_50ms=50ms定时计数器字节
STRB R0, [R1, #2] ;Time_200ms=200ms定时计数器字节
STRB R0, [R1, #3] ;Time_1000ms=1000ms定时计数器字节
STRB R0, [R1, #4] ;Time_5s=5s定时计数器字节
STRB R0, [R1, #5] ;Time_10s=10s定时计数器字节
STRB R0, [R1, #6] ;Time_20s=20s定时计数器字节
MOVW R1, #BtimeCh ;基础定时计数器改变
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1]
BX lr ;子程返回
Uart0Init ;串口0初始化
LDR R1, =U0LCR ;U0线控制寄存器-R/W[0]
MOV R0, #0x83 ;访问除数锁存,禁止间隔发送,禁止校验,1停8字符
STR R0, [R1]
NOP
LDR R1, =U0DLM ;U0除数锁存MSB-R/W[0x00]
MOV R0,

#0x00 ;9600=(24000000/(16*125))*8/(8+2)
STR R0, [R1] ;U0DLM=0
LDR R1, =U0DLL ;U0除数锁存LSB-R/W[0x01]
MOV R0, #0x7D ;U0DLL=125 => 7D
STR R0, [R1]
LDR R1, =U0FDR ;U0小数分频器寄存器-R/W[0x10]
MOV R0, #0x82 ;MULVAL=8,DIVADDVAL=2
STR R0, [R1]
NOP
LDR R1, =U0LCR ;U0线控制寄存器-R/W[0]
MOV R0, #0x03 ;禁访除数锁存,禁止间隔发送,禁止校验,1停8字符
STR R0, [R1]
LDR R1, =U0FCR ;U0-FIFO控制寄存器-WO[0]
MOV R0, #0x87 ;8字符触发,清发送FIFO,清接收FIFO,使能FIFO
STR R0, [R1]
LDR R1, =U0IER ;U0中断使能寄存器-R/W[0]
MOV R0, #0x01 ;使能接收中断
STR R0, [R1]
NOP
LDR R1, =IPR0 ;外部中断优先级寄存器组的基地址[0xE000E400]
MOV R0, #PRIO_FOUR ;优先级为4,NVIC_UART0=21 => IRQ #N=#(21-16)=#5
STRB R0, [R1, #(NVIC_UART0-16)]
NOP
LDR R1, =SETENA0 ;中断使能寄存器组的基地址[0xE000E100]
LDR R0, [R1] ;中断使能,NVIC_UART0=21 => IRQ #N=#(21-16)=#5
ORR R0, R0, #(1<<(NVIC_UART0-16))
STR R0, [R1]
NOP
MOV R0, #0x00 ;初始化收发指针
MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1]
STRB R0, [R1, #1] ;UART0_RecPt=Uart0接收数据尾指针[已处理]
STRB R0, [R1, #2] ;UART0_SndPh=Uart0发送数据头指针[待发送]
STRB R0, [R1, #3] ;UART0_SndPt=Uart0发送数据尾指针[已发送]
MOVW R1, #UART0_Stat ;Uart0状态字节
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R0, [R1]
BX lr ;子程返回
WDTInit ;看门狗定时器初始化
LDR R1, =WDCLKSEL ;看门狗时钟源选择寄存器-R/W[0x00]
MOV R0, #0x00 ;选择内部RC振荡器作为看门狗时钟源
STR R0, [R1]
LDR R1, =WDTC ;看门狗定时器常数寄存器-R/W[0xFF]

MOV R0, #0x80000 ;设置看门狗定时器参数 4M=>0.25us
STR R0, [R1] ;524289us=(0x80000+1)*0.25*4us
LDR R1, =WDMOD ;看门狗模式寄存器-R/W[0x00]
MOV R0, #0x03 ;设置看门狗模式-中断且复位
STR R0, [R1]
BX lr ;子程返回
ALIGN
LTORG ;初始化程序文字池
Mainloop ;主循环
MOVW R1, #BtimeCh ;基础定时计数器改变
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
CMP R0, #0x01
BEQ Main2mss ;相等/为0[Z==1]转移
B Mainloop ;跳转主循环
Main2mss ;500us计时处理
MOV R0, #0x00 ;清除计时待处理标志
STRB R0, [R1]
MOVW R1, #Base_timer0 ;基础定时计数器字节0[32:500us+1循环计数]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
AND R0, R0, #0x03
TBB [PC, R0]
Main2mst
DCB ((Main2ms0-Main2mst)/2)
DCB ((Main2ms1-Main2mst)/2)
DCB ((Main2ms2-Main2mst)/2)
DCB ((Main2ms3-Main2mst)/2)
Main2ms0
BL Uart0Send ;串口0发送数据[2ms]
;BL Uart2Send ;串口2发送数据[2ms]
B Mainloop ;跳转主循环
Main2ms1
;BL Uart1Send ;串口1发送数据[2ms]
;BL Uart3Send ;串口3发送数据[2ms]
B Mainloop ;跳转主循环
Main2ms2
NOP ;2ms处理
B Mainloop ;跳转主循环
Main2ms3 ;2ms计时处理
MOVW R1, #Time_10ms ;10ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;2ms+1
SUBS R2, R0, #0x05
BCC Main10mss ;无符号数小于转移[C==0]
MOV R0, #0x00
Main10mss
STRB R0, [R1]
TBB [PC, R0]
Main10mst
DCB ((Main10ms0-Main10mst)/2)
DCB ((Main10ms1-Main10mst)/2)
DCB ((Main10ms2-Main10mst)/2)

DCB ((Main10ms3-Main10mst)/2)
DCB ((Main10ms4-Main10mst)/2)
ALIGN
Main10ms0
BL Uart0Revc ;串口0接收数据处理[10ms]
B Mainloop ;跳转主循环
Main10ms1
NOP ;10ms处理
B Mainloop ;跳转主循环
Main10ms2
NOP ;10ms处理
B Mainloop ;跳转主循环
Main10ms3
NOP ;10ms处理
B Mainloop ;跳转主循环
Main10ms4 ;10ms计时处理
MOVW R1, #Time_50ms ;50ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;10ms+1
SUBS R2, R0, #0x05
BCC Main50mss ;无符号数小于转移[C==0]
MOV R0, #0x00
Main50mss
STRB R0, [R1]
TBB [PC, R0]
Main50mst
DCB ((Main50ms0-Main50mst)/2)
DCB ((Main50ms1-Main50mst)/2)
DCB ((Main50ms2-Main50mst)/2)
DCB ((Main50ms3-Main50mst)/2)
DCB ((Main50ms4-Main50mst)/2)
ALIGN
Main50ms0
BL Uart0Sedc ;串口0发送数据处理[50ms]
B Mainloop ;跳转主循环
Main50ms1
NOP ;50ms处理
B Mainloop ;跳转主循环
Main50ms2
NOP ;50ms处理
B Mainloop ;跳转主循环
Main50ms3
NOP ;50ms处理
B Mainloop ;跳转主循环
Main50ms4 ;50ms计时处理
MOVW R1, #Time_200ms ;200ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;50ms+1
SUBS R2, R0, #0x04
BCC Main200mss ;无符号数小于转移[C==0]
MOV R0, #0x00
Main200mss
STRB R0, [R1]
TBB [PC, R0]
Main200mst
DCB ((Main200ms0-Main200mst)/2)
DCB ((Main200ms1-Main200mst)/2)
DCB ((Main200ms2-Main200mst)/2)
DCB ((Main200ms3-Main200mst)/2)
Main200ms0
BL BEEP_OFF ;****关闭蜂鸣器
NOP

;200ms处理
B Mainloop ;跳转主循环
Main200ms1
BL LED1CH ;修改LED1[200ms]
BL WDT_Reset ;看门狗定时器喂狗[200ms]
B Mainloop ;跳转主循环
Main200ms2
NOP ;200ms处理
B Mainloop ;跳转主循环
Main200ms3 ;200ms计时处理
MOVW R1, #Time_1000ms ;1000ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;200ms+1
SUBS R2, R0, #0x05
BCC Main1000mss ;无符号数小于转移[C==0]
MOV R0, #0x00
Main1000mss
STRB R0, [R1]
TBB [PC, R0]
Main1000mst
DCB ((Main1000ms0-Main1000mst)/2)
DCB ((Main1000ms1-Main1000mst)/2)
DCB ((Main1000ms2-Main1000mst)/2)
DCB ((Main1000ms3-Main1000mst)/2)
DCB ((Main1000ms4-Main1000mst)/2)
ALIGN
Main1000ms0
NOP ;1000ms处理
B Mainloop ;跳转主循环
Main1000ms1
BL LED2CH ;修改LED2[1000ms]
B Mainloop ;跳转主循环
Main1000ms2
NOP ;1000ms处理
B Mainloop ;跳转主循环
Main1000ms3
NOP ;1000ms处理
B Mainloop ;跳转主循环
Main1000ms4 ;1000ms计时处理
MOVW R1, #Time_5000ms ;5000ms定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;1000ms+1
SUBS R2, R0, #0x05
BCC Main5000mss ;无符号数小于转移[C==0]
MOV R0, #0x00
Main5000mss
STRB R0, [R1]
TBB [PC, R0]
Main5000mst
DCB ((Main5000ms0-Main5000mst)/2)
DCB ((Main5000ms1-Main5000mst)/2)
DCB ((Main5000ms2-Main5000mst)/2)
DCB ((Main5000ms3-Main5000mst)/2)
DCB ((Main5000ms4-Main5000mst)/2)
ALIGN
Main5000ms0
NOP ;5000ms处理
B Mainloop ;跳转主循环
Main5000ms1
NOP ;50

00ms处理
B Mainloop ;跳转主循环
Main5000ms2
NOP ;5000ms处理
B Mainloop ;跳转主循环
Main5000ms3
NOP ;5000ms处理
B Mainloop ;跳转主循环
Main5000ms4 ;5000ms计时处理
MOVW R1, #Time_10s ;10s定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;5000ms+1
SUBS R2, R0, #0x02
BCC Main10s0 ;无符号数小于转移[C==0]
MOV R0, #0x00
Main10s0
STRB R0, [R1]
CBNZ R0, Main10s1 ;结果非0转移
NOP ;10s处理
B Mainloop ;跳转主循环
Main10s1 ;10s计时处理
MOVW R1, #Time_20s ;20s定时计数器字节
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
ADD R0, R0, #1 ;10s+1
SUBS R2, R0, #0x02
BCC Main20s0 ;无符号数小于转移[C==0]
MOV R0, #0x00
Main20s0
STRB R0, [R1]
CBNZ R0, Main20s1 ;结果非0转移
NOP ;20s处理
B Mainloop ;跳转主循环
Main20s1
BL BEEP_ON ;****打开蜂鸣器
NOP ;20s处理
B Mainloop ;跳转主循环
ALIGN
DELAY_1s ;延时控制-1s
MOV R7, #0x3E8 ;约1000*1ms
DELAY_R7
MOV R6, #0x7D00 ;约1ms循环
DELAY_R6
SUBS R6, R6, #1
BNE DELAY_R6 ;不相等/非0[Z==0]转移
SUBS R7, R7, #1
BNE DELAY_R7 ;不相等/非0[Z==0]转移
BX lr ;子程返回
Uart0Send ;串口0发送数据
LDR R1, =U0LSR ;U0线状态寄存器-R0[0x60]
LDR R0, [R1]
TST R0, #0x20 ;bit5=0/1=FIFO含有效数据/发送FIFO空
BEQ Uart0Send1 ;相等/为0[Z==1]转移
MOV R3, #0x10 ;每次最多发送16字节数据

Uart0Send0
MOVW R1, #UART0_SndPh ;Uart0发送数据头指针[待发送]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
LDRB R2, [R1, #1] ;UART0_SndPt=Uart0发送数据尾指针[已发送]
CMP R0, R2
BEQ Uart0Send1 ;相等/为0[Z==1]转移
MOVW R1, #UART0_SndBuff ;Uart0发送数据缓冲区[256单元]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1, R2]
LDR R1, =U0THR ;U0发送器保持寄存器-WO
STRB R0, [R1]
ADD R2, R2, #1
AND R2, R2, #0xFF
MOVW R1, #UART0_SndPt ;Uart0发送数据尾指针[已发送]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R2, [R1]
SUBS R3, R3, #1
BNE Uart0Send0 ;不相等/非0[Z==0]转移
Uart0Send1
BX lr ;子程返回
Uart0Revc ;串口0接收数据处理[10ms]
MOVW R1, #UART0_RecPh ;Uart0接收数据头指针[待处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R0, [R1]
LDRB R2, [R1, #1] ;UART0_RecPt=Uart0接收数据尾指针[已处理]
CMP R0, R2
BEQ Uart0Revc1 ;相等/为0[Z==1]转移
MOVW R1, #UART0_RecBuff ;Uart0接收数据缓冲区[256单元]
MOVT R1, #MEMADDG ;内存单元地址高16位
LDRB R3, [R1, R2]
CMP R3, #0xF5 ;DATA0=#0F5H
BEQ Uart0Revc2 ;相等/为0[Z==1]转移
Uart0Revc0
ADD R2, R2, #1
AND R2, R2, #0xFF
MOVW R1, #UART0_RecPt ;Uart0接收数据尾指针[已处理]
MOVT R1, #MEMADDG ;内存单元地址高16位
STRB R2, [R1]
Uart0Revc1
BX lr ;子程返回
Uart0Revc2
SUBS R3, R0, R2 ;判收一组数据(10个BYTE)
BCS Uart0Revc3 ;无符号数大于或等于转移[C==1]
ADD R0, #0x100
SUBS R3, R0, R2
Uart0Revc3
SUBS R3, R3, #10
BCC Uart0Revc1 ;无符号数小于转移[C==0]
ADD R0, R2, #10
AND R0, R0, #0xFF
MOVW R1, #UART0_RecPt ;Uart0接收数据尾指针[已处理]

相关主题