📄 usart.txt
字号:
; generated by ARM C/C++ Compiler, 4.1 [Build 481]
; commandline ArmCC [--debug -c --asm --interleave -o.\OBJ\usart.o --depend=.\OBJ\usart.d --cpu=Cortex-M3 --apcs=interwork -O0 -I..\Demo -I.\HARDWARE\EXTI -I.\HARDWARE\KEY -I.\HARDWARE\LCD -I.\HARDWARE\LED -I.\HARDWARE\TIMER -I.\HARDWARE\WDG -I.\SYSTEM\delay -I.\SYSTEM\sys -I.\SYSTEM\usart -I.\USER -IC:\Keil\ARM\INC -IC:\Keil\ARM\INC\ST\STM32F10x --omf_browse=.\OBJ\usart.crf SYSTEM\usart\usart.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
_sys_exit PROC
;;;28 //定义_sys_exit()以避免使用半主机模式
;;;29 _sys_exit(int x)
000000 4601 MOV r1,r0
;;;30 {
;;;31 x = x;
000002 bf00 NOP
;;;32 }
000004 4770 BX lr
;;;33 //重定义fputc函数
ENDP
fputc PROC
;;;34 int fputc(int ch, FILE *f)
000006 b2c2 UXTB r2,r0
;;;35 {
;;;36 USART1->DR = (u8) ch;
000008 4b3e LDR r3,|L1.260|
00000a 801a STRH r2,[r3,#0]
;;;37 while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
00000c bf00 NOP
|L1.14|
00000e 4a3e LDR r2,|L1.264|
000010 8812 LDRH r2,[r2,#0]
000012 f0120f40 TST r2,#0x40
000016 d0fa BEQ |L1.14|
;;;38 return ch;
;;;39 }
000018 4770 BX lr
;;;40 #endif
ENDP
USART1_IRQHandler PROC
;;;53
;;;54 void USART1_IRQHandler(void)
00001a b510 PUSH {r4,lr}
;;;55 {
;;;56 u8 res;
;;;57 if(USART1->SR&(1<<5))//接收到数据
00001c 483a LDR r0,|L1.264|
00001e 8800 LDRH r0,[r0,#0]
000020 f0100f20 TST r0,#0x20
000024 d005 BEQ |L1.50|
;;;58 {
;;;59 res=USART1->DR;
000026 4837 LDR r0,|L1.260|
000028 8800 LDRH r0,[r0,#0]
00002a b2c4 UXTB r4,r0
;;;60 /*if((USART_RX_STA&0x80)==0)//接收未完成
;;;61 {
;;;62 if(USART_RX_STA&0x40)//接收到了0x0d
;;;63 {
;;;64 if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
;;;65 else USART_RX_STA|=0x80; //接收完成了
;;;66 }else //还没收到0X0D
;;;67 {
;;;68 if(res==0x0d)USART_RX_STA|=0x40;
;;;69 else
;;;70 {
;;;71 USART_RX_BUF[USART_RX_STA&0X3F]=res;
;;;72 USART_RX_STA++;
;;;73 if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
;;;74 }
;;;75 }
;;;76 }*/
;;;77 UART0_RxIsrHandler(res);
00002c 4620 MOV r0,r4
00002e f7fffffe BL UART0_RxIsrHandler
|L1.50|
;;;78 }
;;;79 }
000032 bd10 POP {r4,pc}
;;;80 #endif
ENDP
uart_init PROC
;;;85 //091209
;;;86 void uart_init(u32 pclk2,u32 bound)
000034 e92d5ff0 PUSH {r4-r12,lr}
;;;87 {
000038 4605 MOV r5,r0
00003a 460e MOV r6,r1
;;;88 float temp;
;;;89 u16 mantissa;
;;;90 u16 fraction;
;;;91 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
00003c 0130 LSLS r0,r6,#4
00003e f7fffffe BL __aeabi_ui2f
000042 4681 MOV r9,r0
000044 4931 LDR r1,|L1.268|
000046 fb05f001 MUL r0,r5,r1
00004a f7fffffe BL __aeabi_ui2f
00004e 4682 MOV r10,r0
000050 4649 MOV r1,r9
000052 f7fffffe BL __aeabi_fdiv
000056 4607 MOV r7,r0
;;;92 mantissa=temp; //得到整数部分
000058 4638 MOV r0,r7
00005a f7fffffe BL __aeabi_f2uiz
00005e b284 UXTH r4,r0
;;;93 fraction=(temp-mantissa)*16; //得到小数部分
000060 4620 MOV r0,r4
000062 f7fffffe BL __aeabi_ui2f
000066 4683 MOV r11,r0
000068 4639 MOV r1,r7
00006a f7fffffe BL __aeabi_frsub
00006e 4682 MOV r10,r0
000070 f04f4183 MOV r1,#0x41800000
000074 f7fffffe BL __aeabi_fmul
000078 4681 MOV r9,r0
00007a f7fffffe BL __aeabi_f2uiz
00007e 4680 MOV r8,r0
;;;94 mantissa<<=4;
000080 0124 LSLS r4,r4,#4
;;;95 mantissa+=fraction;
000082 eb040008 ADD r0,r4,r8
000086 b284 UXTH r4,r0
;;;96 RCC->APB2ENR|=1<<2; //使能PORTA口时钟
000088 4821 LDR r0,|L1.272|
00008a 6980 LDR r0,[r0,#0x18]
00008c f0400004 ORR r0,r0,#4
000090 491f LDR r1,|L1.272|
000092 6188 STR r0,[r1,#0x18]
;;;97 RCC->APB2ENR|=1<<14; //使能串口时钟
000094 4608 MOV r0,r1
000096 6980 LDR r0,[r0,#0x18]
000098 f4404080 ORR r0,r0,#0x4000
00009c 6188 STR r0,[r1,#0x18]
;;;98 GPIOA->CRH=0X444444B4;//IO状态设置
00009e 481d LDR r0,|L1.276|
0000a0 491d LDR r1,|L1.280|
0000a2 6008 STR r0,[r1,#0]
;;;99
;;;100 RCC->APB2RSTR|=1<<14; //复位串口1
0000a4 481a LDR r0,|L1.272|
0000a6 68c0 LDR r0,[r0,#0xc]
0000a8 f4404080 ORR r0,r0,#0x4000
0000ac 4918 LDR r1,|L1.272|
0000ae 60c8 STR r0,[r1,#0xc]
;;;101 RCC->APB2RSTR&=~(1<<14);//停止复位
0000b0 4608 MOV r0,r1
0000b2 68c0 LDR r0,[r0,#0xc]
0000b4 f4204080 BIC r0,r0,#0x4000
0000b8 60c8 STR r0,[r1,#0xc]
;;;102 //波特率设置
;;;103 USART1->BRR=mantissa; // 波特率设置
0000ba 4818 LDR r0,|L1.284|
0000bc f8a04808 STRH r4,[r0,#0x808]
;;;104 USART1->CR1|=0X200C; //1位停止,无校验位.
0000c0 4817 LDR r0,|L1.288|
0000c2 8800 LDRH r0,[r0,#0]
0000c4 f242010c MOV r1,#0x200c
0000c8 ea400001 ORR r0,r0,r1
0000cc 4913 LDR r1,|L1.284|
0000ce f8a1080c STRH r0,[r1,#0x80c]
;;;105 #ifdef EN_USART1_RX //如果使能了接收
;;;106 //使能接收中断
;;;107 USART1->CR1|=1<<8; //PE中断使能
0000d2 4608 MOV r0,r1
0000d4 f8b0080c LDRH r0,[r0,#0x80c]
0000d8 f4407080 ORR r0,r0,#0x100
0000dc f8a1080c STRH r0,[r1,#0x80c]
;;;108 USART1->CR1|=1<<5; //接收缓冲区非空中断使能
0000e0 4608 MOV r0,r1
0000e2 f8b0080c LDRH r0,[r0,#0x80c]
0000e6 f0400020 ORR r0,r0,#0x20
0000ea f8a1080c STRH r0,[r1,#0x80c]
;;;109 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
0000ee f04f0302 MOV r3,#2
0000f2 f04f0225 MOV r2,#0x25
0000f6 f04f0103 MOV r1,#3
0000fa 4608 MOV r0,r1
0000fc f7fffffe BL MY_NVIC_Init
;;;110 #endif
;;;111 }
000100 e8bd9ff0 POP {r4-r12,pc}
ENDP
|L1.260|
DCD 0x40013804
|L1.264|
DCD 0x40013800
|L1.268|
DCD 0x000f4240
|L1.272|
DCD 0x40021000
|L1.276|
DCD 0x444444b4
|L1.280|
DCD 0x40010804
|L1.284|
DCD 0x40013000
|L1.288|
DCD 0x4001380c
AREA ||.bss||, DATA, NOINIT, ALIGN=0
USART_RX_BUF
% 64
AREA ||.data||, DATA, ALIGN=2
USART_RX_STA
000000 00000000 DCB 0x00,0x00,0x00,0x00
__stdout
DCD 0x00000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -