超市门口垃圾桶里捡的电子秤拆出显示屏,用STM8S103F3P6编了HT1621的模拟时钟的汇编程序,程序能运行,屏能显示,但有问题,现在的情况是BCD码转换第一个转换的数据会有底数比如小时=1解码后应该是R1=0,R2=0,R3=1,但实际上R1=10,R2=2,R3=5,第一次写STM8的汇编程序,边学边写,折腾一天也没找到原因,求助坛里大神帮忙看看问题出在哪里。
![]() ![]() 程序如下 stm8/ #include "mapping.inc" #include "STM8S103F3P.inc" #DEFINE LCDSDA PD_ODR,#1 ; #DEFINE LCDSCK PD_ODR,#2 ; #DEFINE LCDCS PD_ODR,#3 ; #DEFINE SECFLAG FLAG,#0 ; ; #define txflag flag,#1 segment 'ram0' FLAG DS.B 1 ; R1 DS.B 1 ; R2 DS.B 1 ; R3 DS.B 1 ; R4 DS.B 1 ; R5 DS.B 1 ; R6 DS.B 1 ; R7 DS.B 1 ; R8 DS.B 1 ; SECOND DS.B 1 ; MINUTE DS.B 1 ; HOUR DS.B 1 ; DAY DS.B 1 ; TEMP DS.B 1 ; TEMP1 DS.B 1 ; TEMP2 DS.B 1 ; LCDDD DS.B 16 ; segment 'rom' main: ; NOP ; NOP ; initialize SP ldw X,#stack_end ldw SP,X ; clear stack stack_start.w EQU $stack_segment_start stack_end.w EQU $stack_segment_end ldw X,#stack_start clear_stack: clr (X) incw X cpw X,#stack_end jrule clear_stack ; 下面初始化IO端口 ; PD3设置成推挽输出 ; PD7设置成悬浮输入 LD A,#$08 LD PA_DDR,A ; 将PD3设置成输出 LD A,#$08 LD PA_CR1,A ; 将PD3设置成推挽输出 LD A,#00 LD PA_CR2,A ; LD A,#$7E LD PD_DDR,A ; 将PD3设置成输出 LD A,#$7E LD PD_CR1,A ; 将PD3设置成推挽输出 LD A,#00 LD PD_CR2,A ; ; 初始化A/D模块 ; LD A,#$00 ; LD ADC_CR2,A ; A/D结果数据左对齐 ; LD A,#$00 ; LD ADC_CR1,A ; ADC时钟=主时钟/2=1MHZ ; ADC转换模式=单次 ; 禁止ADC转换 ; LD A,#$03 ; LD ADC_CSR,A ; 选择通道3 ; LD A,#$20 ; LD ADC_TDRL,A ; 下面初始化定时器4 LD A,#$01 LD TIM2_EGR,A ; 允许产生更新事件 LD A,#$06 ;1=2分频=1徽秒,2=4=2,3=8=4,4=16=8,5=32=16,6=64=32,7=128=64 LD TIM2_PSCR,A ; 计数器时钟=主时钟/4=2MHZ/4 ; ; 设定重装载时的寄存器值 ; 注意必须保证先写入高8位,再写入低8位 LD A,#$7a LD TIM2_ARRH,A ; 设定重装载时的寄存器值的高8位 LD A,#$12 LD TIM2_ARRL,A ; 设定重装载时的寄存器值的低8位 LD A,#$7a LD TIM2_CNTRH,A ; 设定计数器的初值的高8位 LD A,#$12 LD TIM2_CNTRL,A ; 设定计数器的初值的低8位 ; 定时周期=60000*1=60mS LD A,#$01 ; b0 = 1,允许计数器工作 ; b1 = 0,允许更新 LD TIM2_CR1,A ; 设置控制器,启动定时器 LD A,#$01 ; 允许更新中断 LD TIM2_IER,A RIM ; 允许CPU全局中断 CALL DELAY_MS ; 延时100MS CALL LCDINIT CALL DDINIT CALL LCDDIS CALL DELAY_MS ; 延时100MS CALL DELAY_MS ; 延时100MS CALL DELAY_MS ; 延时100MS MOV DAY,#11 MOV HOUR,#12 MOV MINUTE,#34 MOV SECOND,#56 LOOP: BTJF SECFLAG,LOOP BRES SECFLAG CALL TIMEPRO CALL LCDDIS JRA LOOP LCDDIS: BRES LCDCS CALL LCDWR101 CALL LCDWR000000 CLRW X ; MOV TEMP1,#16 ; LDW Y,#LCDDD ; LD010: LD A,(Y) ; LD XL,A ; LD A,(NUMTAB,X) ; CALL LCDWRBYTE ; INCW Y ; DEC TEMP1 ; JRNE LD010 ; BSET LCDCS RET DDINIT: LDW X,#LCDDD MOV TEMP,#16 DI010: LD A,#17 LD (X),A INCW X DEC TEMP JRNE DI010 RET TIMEPRO: MOV TEMP,DAY CALL BCD8BIT MOV {LCDDD+11},R1 MOV {LCDDD+10},R2 MOV {LCDDD+9},R3 MOV TEMP,DAY CALL BCD8BIT MOV R1,#16 MOV {LCDDD+11},R1 MOV {LCDDD+10},R2 MOV {LCDDD+9},R3 MOV TEMP,HOUR CALL BCD8BIT MOV R1,#16 MOV {LCDDD+8},R1 MOV {LCDDD+7},R2 MOV {LCDDD+6},R3 MOV TEMP,MINUTE CALL BCD8BIT MOV R1,#16 MOV {LCDDD+5},R1 MOV {LCDDD+4},R2 MOV {LCDDD+3},R3 MOV TEMP,SECOND CALL BCD8BIT MOV R1,#16 MOV {LCDDD+2},R1 MOV {LCDDD+1},R2 MOV LCDDD,R3 RET ;*******************8位 二 进 制 的 数 值 转 化 为 BCD码 *************************** ;把 8 位二进制的数值转化为 BCD 码 ;要转换的数值放在 TEMP 中 ;转换结果的高位在 R1, 中位在 R2,低位在 R3 BCD8BIT.L LD A,TEMP LD XL,A LD A,#100 DIV X,A LD R4,A LD A,XL LD R1,A LD A,R4 LD XL,A LD A,#10 DIV X,A LD R3,A LD A,XL LD R2,A RET ;BCD16BIT: ;16位二进制--BCD码 ;入口参数:BINDATA DS.W(16位二进制数存放在BINDATA变量中) ;出口参数:BCDDATA DS.B 5(非压缩形式的BCD存放在以BCDDATA DS.B开始的RAM存储区中 ;使用资料:A,X,Y ; LDW X,BINDATA ; LDW Y,#10000 ; DIVW X,Y ; LD A,XL ; ; LD {BCDDATA+0},A ; ; LDW X,Y ; ; LDW Y,#1000 ; DIVW X,Y ; LD A,XL ; ; LD {BCDDATA+1},A ; ; LDW X,Y ; ; LD A,#100 ; DIV X,A ; ; EXG A,XL ; ; LD {BCDDATA+2},A ; ; LD A,#10 ; DIV X,A ; ; LD {BCDDATA+4},A ; ; LD A,XL ; LD {BCDDATA+3},A ; RET LCDINIT: LD A,#$06 ;打开偏压发生器 CALL LCDWRCOM LD A,#$02 ;打开系统时钟 CALL LCDWRCOM LD A,#$52 ;1/3 偏压4 背极 CALL LCDWRCOM RET LCDWR1000: BSET LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSCK BSET LCDSCK BRES LCDSCK BSET LCDSCK RET LCDWR101: BSET LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSDA BRES LCDSCK BSET LCDSCK BSET LCDSDA BRES LCDSCK BSET LCDSCK RET LCDWR000000: BRES LCDSDA MOV TEMP,#06 LCDWR06: BRES LCDSCK BSET LCDSCK DEC TEMP JRNE LCDWR06 RET LCDWRCOM: BRES LCDCS CALL LCDWR1000 CALL LCDWRBYTE BSET LCDCS BSET LCDSDA RET LCDWRBYTE: MOV TEMP,#08 LCDWB000: RLC A BCCM LCDSDA BRES LCDSCK BSET LCDSCK DEC TEMP JRNE LCDWB000 RET ; 函数功能:延时 ; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ ; 输出参数:无 ; 返 回 值:无 ; 备 注:无 DELAY_MS.L PUSH A ; 将入口参数保存到堆栈中 LD A,#250 ; 寄存器A<-250,作为下面的循环数 DELAY_MS_1.L NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T DEC A ; 寄存器A<-A-1,本条指令执行之间为1T JRNE DELAY_MS_1 ; 若不等于0,则循环, ; 本条指令执行时间为2T(跳时)或1T(不跳时) POP A ; 从堆栈中恢复入口参数 DEC A ; 将要延时的MS数-1 JRNE DELAY_MS ; 若不等于0,则循环 RET ; 函数返回 ; 下面是定时器2的中断服务程序 Timer2_Update_ISR.L LD A,#0 ; 清除更新标志 LD TIM2_SR1,A BSET SECFLAG BCPL PA_ODR,#3 INC SECOND LD A,SECOND CP A,#60 JRNE T2ISREND CLR SECOND INC MINUTE LD A,MINUTE CP A,#60 JRNE T2ISREND CLR MINUTE INC HOUR LD A,HOUR CP A,#24 JRNE T2ISREND CLR HOUR T2ISREND: IRET ; 中断返回 ; 下面是定时器4的中断服务程序 TIMER4_ISR.L LD A,#0 ; 清除更新标志 LD TIM4_SR,A ; BCPL PA_ODR,#3 IRET ; 中断返回 ; 16位显示对应16个字节,显示屏第一位显示对应最后一个字节,第一个字节对应最后一位显示 ;第1位显示和第5位显示没有小数点,小数点对应两个箭头,第6位和第10位也没有小数点,也是对应两个箭头 ;11位,12位,16位显示也没有小数点,对应三段电池显示 NUMTAB: DC.B $7D,$60,$3E,$7A,$63,$5B,$5F,$70 DC.B $7F,$7B,$77,$4F,$1D,$6E,$1F,$17,$02,$FF,$00 ;hcbadegf ;01111101-0(7D) ;01100000-1(60) ;00111110-2(3E) ;01111010-3(7A) ;01100011-4(63) ;01011011-5(5B) ;01011111-6(5F) ;01110000-7(70) ;01111111-8(7F) ;01111011-9(7B) ;01110111-A(77) ;01001111-b(4F) ;00011101-C(1D) ;01101110-d(6E) ;00011111-E(1F) ;00010111-F(17) ;00000010--(02) interrupt NonHandledInterrupt NonHandledInterrupt: IRET segment 'vectit' dc.l {$82000000+main} ; reset 复位 dc.l {$82000000+NonHandledInterrupt} ; trap 软件中断 dc.l {$82000000+NonHandledInterrupt} ; irq0 TLI 外部最高级中断 dc.l {$82000000+NonHandledInterrupt} ; irq1 AWU 自动唤醒HALT模式中断 dc.l {$82000000+NonHandledInterrupt} ; irq2 CLK 时钟控制 dc.l {$82000000+NonHandledInterrupt} ; irq3 EXTI0 端口A 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq4 EXTI1 端口B 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq5 EXTI2 端口C 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq6 EXTI3 端口D 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq7 EXTI4 端口E 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq8 CAN RX中断 dc.l {$82000000+NonHandledInterrupt} ; irq9 CAN TX/ER/SC中断 dc.l {$82000000+NonHandledInterrupt} ; irq10 SPI 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq11 TIM1更新/上溢出/下溢出/触发/刹车 dc.l {$82000000+NonHandledInterrupt} ; irq12 TIM1捕获比较 dc.l {$82000000+Timer2_Update_ISR} ; irq13 TIM2更新上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq14 TIM2捕获比较 dc.l {$82000000+NonHandledInterrupt} ; irq15 TIM3 更新/上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq16 TIM3 捕获/比较 dc.l {$82000000+NonHandledInterrupt} ; irq17 UART1 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq18 UART1 接收寄存器满 dc.l {$82000000+NonHandledInterrupt} ; irq19 I2C I2C中断 dc.l {$82000000+NonHandledInterrupt} ; irq20 UART2/3 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq21 UART2/3 接始寄存器满 dc.l {$82000000+NonHandledInterrupt} ; irq22 ADC 转换结束 dc.l {$82000000+TIMER4_ISR} ; irq23 TIM4更新/上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq24 FLASH 编程结束/禁止编程 dc.l {$82000000+NonHandledInterrupt} ; irq25 dc.l {$82000000+NonHandledInterrupt} ; irq26 dc.l {$82000000+NonHandledInterrupt} ; irq27 dc.l {$82000000+NonHandledInterrupt} ; irq28 dc.l {$82000000+NonHandledInterrupt} ; irq29 end |
汇编这个估计没几个人帮得了你了 这个驱动IC是串行接口吧,对着手册上的时序图在研究一下吧
搞定了,T2中断里加了A的入栈和出栈,是不是这个原因不管了。反正程序正常了。 正常的程序如下。程序可用于STM8汇编的学习和入门。 stm8/ #include "mapping.inc" #include "STM8S103F3P.inc" #DEFINE LCDSDA PD_ODR,#1 ; #DEFINE LCDSCK PD_ODR,#2 ; #DEFINE LCDCS PD_ODR,#3 ; #DEFINE SECFLAG FLAG,#0 ; ; #define txflag flag,#1 segment 'ram0' FLAG DS.B 1 ; R1 DS.B 1 ; R2 DS.B 1 ; R3 DS.B 1 ; R4 DS.B 1 ; R5 DS.B 1 ; R6 DS.B 1 ; R7 DS.B 1 ; R8 DS.B 1 ; SECOND DS.B 1 ; MINUTE DS.B 1 ; HOUR DS.B 1 ; DAY DS.B 1 ; TEMP DS.B 1 ; TEMP1 DS.B 1 ; TEMP2 DS.B 1 ; LCDDD DS.B 16 ; segment 'rom' main: ; NOP ; NOP ; initialize SP ldw X,#stack_end ldw SP,X ; clear stack stack_start.w EQU $stack_segment_start stack_end.w EQU $stack_segment_end ldw X,#stack_start clear_stack: clr (X) incw X cpw X,#stack_end jrule clear_stack ; 下面初始化IO端口 ; PD3设置成推挽输出 ; PD7设置成悬浮输入 LD A,#$08 LD PA_DDR,A ; 将PD3设置成输出 LD A,#$08 LD PA_CR1,A ; 将PD3设置成推挽输出 LD A,#00 LD PA_CR2,A ; LD A,#$7E LD PD_DDR,A ; 将PD3设置成输出 LD A,#$7E LD PD_CR1,A ; 将PD3设置成推挽输出 LD A,#00 LD PD_CR2,A ; ; 初始化A/D模块 ; LD A,#$00 ; LD ADC_CR2,A ; A/D结果数据左对齐 ; LD A,#$00 ; LD ADC_CR1,A ; ADC时钟=主时钟/2=1MHZ ; ADC转换模式=单次 ; 禁止ADC转换 ; LD A,#$03 ; LD ADC_CSR,A ; 选择通道3 ; LD A,#$20 ; LD ADC_TDRL,A ; 下面初始化定时器4 LD A,#$01 LD TIM2_EGR,A ; 允许产生更新事件 LD A,#$06 ;1=2分频=1徽秒,2=4=2,3=8=4,4=16=8,5=32=16,6=64=32,7=128=64 LD TIM2_PSCR,A ; 计数器时钟=主时钟/4=2MHZ/4 ; ; 设定重装载时的寄存器值 ; 注意必须保证先写入高8位,再写入低8位 LD A,#$7a LD TIM2_ARRH,A ; 设定重装载时的寄存器值的高8位 LD A,#$12 LD TIM2_ARRL,A ; 设定重装载时的寄存器值的低8位 LD A,#$7a LD TIM2_CNTRH,A ; 设定计数器的初值的高8位 LD A,#$12 LD TIM2_CNTRL,A ; 设定计数器的初值的低8位 ; 定时周期=60000*1=60mS LD A,#$01 ; b0 = 1,允许计数器工作 ; b1 = 0,允许更新 LD TIM2_CR1,A ; 设置控制器,启动定时器 LD A,#$01 ; 允许更新中断 LD TIM2_IER,A RIM ; 允许CPU全局中断 CALL DELAY_MS ; 延时100MS CALL LCDINIT ; CALL DDINIT ; CALL LCDDIS ; CALL DELAY_MS ; 延时100MS CALL DELAY_MS ; 延时100MS CALL DELAY_MS ; 延时100MS MOV DAY,#0 MOV HOUR,#12 MOV MINUTE,#34 MOV SECOND,#56 LOOP: BTJF SECFLAG,LOOP BRES SECFLAG CALL TIMEPRO CALL LCDDIS JRA LOOP LCDDIS: BRES LCDCS CALL LCDWR101 CALL LCDWR000000 CLRW X ; MOV TEMP1,#16 ; LDW Y,#LCDDD ; LD010: LD A,(Y) ; LD XL,A ; LD A,(NUMTAB,X) ; CALL LCDWRBYTE ; INCW Y ; DEC TEMP1 ; JRNE LD010 ; BSET LCDCS RET DDINIT: LDW X,#LCDDD MOV TEMP,#16 DI010: LD A,#17 LD (X),A INCW X DEC TEMP JRNE DI010 RET TIMEPRO: MOV TEMP,DAY CALL BCD8BIT MOV R1,#16 MOV {LCDDD+11},R1 MOV {LCDDD+10},R2 MOV {LCDDD+9},R3 MOV TEMP,HOUR CALL BCD8BIT MOV R1,#16 MOV {LCDDD+8},R1 MOV {LCDDD+7},R2 MOV {LCDDD+6},R3 MOV TEMP,MINUTE CALL BCD8BIT MOV R1,#16 MOV {LCDDD+5},R1 MOV {LCDDD+4},R2 MOV {LCDDD+3},R3 MOV TEMP,SECOND CALL BCD8BIT MOV R1,#16 MOV {LCDDD+2},R1 MOV {LCDDD+1},R2 MOV LCDDD,R3 RET ;8位 二 进 制 的 数 值 转 化 为 BCD码 ;把 8 位二进制的数值转化为 BCD 码 ;要转换的数值放在 TEMP 中 ;转换结果的高位在 R1, 中位在 R2,低位在 R3 BCD8BIT: LD A,TEMP LD XL,A LD A,#100 DIV X,A LD R4,A LD A,XL LD R1,A LD A,R4 LD XL,A LD A,#10 DIV X,A LD R3,A LD A,XL LD R2,A RET ;BCD16BIT: ;16位二进制--BCD码 ;入口参数:BINDATA DS.W(16位二进制数存放在BINDATA变量中) ;出口参数:BCDDATA DS.B 5(非压缩形式的BCD存放在以BCDDATA DS.B开始的RAM存储区中 ;使用资料:A,X,Y ; LDW X,BINDATA ; LDW Y,#10000 ; DIVW X,Y ; LD A,XL ; ; LD {BCDDATA+0},A ; ; LDW X,Y ; ; LDW Y,#1000 ; DIVW X,Y ; LD A,XL ; ; LD {BCDDATA+1},A ; ; LDW X,Y ; ; LD A,#100 ; DIV X,A ; ; EXG A,XL ; ; LD {BCDDATA+2},A ; ; LD A,#10 ; DIV X,A ; ; LD {BCDDATA+4},A ; ; LD A,XL ; LD {BCDDATA+3},A ; RET LCDINIT: LD A,#$06 ;打开偏压发生器 CALL LCDWRCOM LD A,#$02 ;打开系统时钟 CALL LCDWRCOM LD A,#$52 ;1/3 偏压4 背极 CALL LCDWRCOM RET LCDWR1000: BSET LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSCK BSET LCDSCK BRES LCDSCK BSET LCDSCK RET LCDWR101: BSET LCDSDA BRES LCDSCK BSET LCDSCK BRES LCDSDA BRES LCDSCK BSET LCDSCK BSET LCDSDA BRES LCDSCK BSET LCDSCK RET LCDWR000000: BRES LCDSDA MOV TEMP,#06 LCDWR06: BRES LCDSCK BSET LCDSCK DEC TEMP JRNE LCDWR06 RET LCDWRCOM: BRES LCDCS CALL LCDWR1000 CALL LCDWRBYTE BSET LCDCS BSET LCDSDA RET LCDWRBYTE: MOV TEMP,#08 LCDWB000: RLC A BCCM LCDSDA BRES LCDSCK BSET LCDSCK DEC TEMP JRNE LCDWB000 RET ; 函数功能:延时 ; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ ; 输出参数:无 ; 返 回 值:无 ; 备 注:无 DELAY_MS: PUSH A ; 将入口参数保存到堆栈中 LD A,#250 ; 寄存器A<-250,作为下面的循环数 DELAY_MS_1: NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T NOP ; 用空操作指令进行延时4T DEC A ; 寄存器A<-A-1,本条指令执行之间为1T JRNE DELAY_MS_1 ; 若不等于0,则循环, ; 本条指令执行时间为2T(跳时)或1T(不跳时) POP A ; 从堆栈中恢复入口参数 DEC A ; 将要延时的MS数-1 JRNE DELAY_MS ; 若不等于0,则循环 RET ; 函数返回 ; 下面是定时器2的中断服务程序 Timer2_Update_ISR: PUSH A LD A,#0 ; 清除更新标志 LD TIM2_SR1,A BSET SECFLAG BCPL PA_ODR,#3 INC SECOND LD A,SECOND CP A,#60 JRNE T2ISREND CLR SECOND INC MINUTE LD A,MINUTE CP A,#60 JRNE T2ISREND CLR MINUTE INC HOUR LD A,HOUR CP A,#24 JRNE T2ISREND CLR HOUR T2ISREND: POP A IRET ; 中断返回 ; 下面是定时器4的中断服务程序 TIMER4_ISR: LD A,#0 ; 清除更新标志 LD TIM4_SR,A ; BCPL PA_ODR,#3 IRET ; 中断返回 ; 16位显示对应16个字节,显示屏第一位显示对应最后一个字节,第一个字节对应最后一位显示 ;第1位显示和第5位显示没有小数点,小数点对应两个箭头,第6位和第10位也没有小数点,也是对应两个箭头 ;11位,12位,16位显示也没有小数点,对应三段电池显示 NUMTAB: DC.B $7D,$60,$3E,$7A,$63,$5B,$5F,$70 DC.B $7F,$7B,$77,$4F,$1D,$6E,$1F,$17,$02,$FF,$00 ;hcbadegf ;01111101-0(7D) ;01100000-1(60) ;00111110-2(3E) ;01111010-3(7A) ;01100011-4(63) ;01011011-5(5B) ;01011111-6(5F) ;01110000-7(70) ;01111111-8(7F) ;01111011-9(7B) ;01110111-A(77) ;01001111-b(4F) ;00011101-C(1D) ;01101110-d(6E) ;00011111-E(1F) ;00010111-F(17) ;00000010--(02) interrupt NonHandledInterrupt NonHandledInterrupt: IRET segment 'vectit' dc.l {$82000000+main} ; reset 复位 dc.l {$82000000+NonHandledInterrupt} ; trap 软件中断 dc.l {$82000000+NonHandledInterrupt} ; irq0 TLI 外部最高级中断 dc.l {$82000000+NonHandledInterrupt} ; irq1 AWU 自动唤醒HALT模式中断 dc.l {$82000000+NonHandledInterrupt} ; irq2 CLK 时钟控制 dc.l {$82000000+NonHandledInterrupt} ; irq3 EXTI0 端口A 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq4 EXTI1 端口B 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq5 EXTI2 端口C 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq6 EXTI3 端口D 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq7 EXTI4 端口E 外部中断 dc.l {$82000000+NonHandledInterrupt} ; irq8 CAN RX中断 dc.l {$82000000+NonHandledInterrupt} ; irq9 CAN TX/ER/SC中断 dc.l {$82000000+NonHandledInterrupt} ; irq10 SPI 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq11 TIM1更新/上溢出/下溢出/触发/刹车 dc.l {$82000000+NonHandledInterrupt} ; irq12 TIM1捕获比较 dc.l {$82000000+Timer2_Update_ISR} ; irq13 TIM2更新上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq14 TIM2捕获比较 dc.l {$82000000+NonHandledInterrupt} ; irq15 TIM3 更新/上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq16 TIM3 捕获/比较 dc.l {$82000000+NonHandledInterrupt} ; irq17 UART1 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq18 UART1 接收寄存器满 dc.l {$82000000+NonHandledInterrupt} ; irq19 I2C I2C中断 dc.l {$82000000+NonHandledInterrupt} ; irq20 UART2/3 发送完成 dc.l {$82000000+NonHandledInterrupt} ; irq21 UART2/3 接始寄存器满 dc.l {$82000000+NonHandledInterrupt} ; irq22 ADC 转换结束 dc.l {$82000000+TIMER4_ISR} ; irq23 TIM4更新/上溢出 dc.l {$82000000+NonHandledInterrupt} ; irq24 FLASH 编程结束/禁止编程 dc.l {$82000000+NonHandledInterrupt} ; irq25 dc.l {$82000000+NonHandledInterrupt} ; irq26 dc.l {$82000000+NonHandledInterrupt} ; irq27 dc.l {$82000000+NonHandledInterrupt} ; irq28 dc.l {$82000000+NonHandledInterrupt} ; irq29 end
历害!
汇编看得头晕。。。。我倒是有运行没问题的 C语言。。