; generated by Component: ARM Compiler 5.06 update 7 (build 960) Tool: ArmCC [4d365d] ; commandline ArmCC [--list --debug -c --asm --interleave -o.\output\can1.o --asm_dir=.\Listing\ --list_dir=.\Listing\ --depend=.\output\can1.d --cpu=Cortex-M3 --apcs=interwork -O3 --diag_suppress=9931 -I..\..\template\Libraries\CMSIS\startup -I..\..\template\Libraries\CMSIS -I..\..\template\Libraries\STM32F10x_StdPeriph_Driver\inc -I..\..\template\Libraries\STM32F10x_StdPeriph_Driver\src -I..\..\nlib -I..\user\inc -I..\user\src -ID:\Keil533\ARM\RV31\INC -ID:\Keil533\ARM\CMSIS\Include -ID:\Keil533\ARM\INC\ST\STM32F10x -D__MICROLIB -D__UVISION_VERSION=525 -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD --omf_browse=.\output\can1.crf ..\user\src\can1.c] THUMB AREA ||.text||, CODE, READONLY, ALIGN=2 REQUIRE _printf_percent REQUIRE _printf_d REQUIRE _printf_int_dec CAN_Mode_Init PROC ;;;24 // 其他,初始化失败; ;;;25 u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) 000000 e92d47f0 PUSH {r4-r10,lr} ;;;26 { 000004 b08a SUB sp,sp,#0x28 000006 4689 MOV r9,r1 000008 4680 MOV r8,r0 00000a 461e MOV r6,r3 00000c 4617 MOV r7,r2 ;;;27 GPIO_InitTypeDef GPIO_InitStructure; ;;;28 CAN_InitTypeDef CAN_InitStructure; ;;;29 CAN_FilterInitTypeDef CAN_FilterInitStructure; ;;;30 #if CAN_RX0_INT_ENABLE ;;;31 NVIC_InitTypeDef NVIC_InitStructure; ;;;32 #endif ;;;33 ;;;34 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟 00000e 2101 MOVS r1,#1 000010 2004 MOVS r0,#4 000012 f8dda048 LDR r10,[sp,#0x48] 000016 f7fffffe BL RCC_APB2PeriphClockCmd ;;;35 ;;;36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟 00001a 2101 MOVS r1,#1 00001c 0648 LSLS r0,r1,#25 00001e f7fffffe BL RCC_APB1PeriphClockCmd ;;;37 ;;;38 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 000022 f44f5080 MOV r0,#0x1000 000026 f8ad001c STRH r0,[sp,#0x1c] ;;;39 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 00002a 2003 MOVS r0,#3 00002c f88d001e STRB r0,[sp,#0x1e] ;;;40 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 000030 2018 MOVS r0,#0x18 ;;;41 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO 000032 4c5a LDR r4,|L1.412| 000034 f88d001f STRB r0,[sp,#0x1f] ;40 000038 a907 ADD r1,sp,#0x1c 00003a 4620 MOV r0,r4 00003c f7fffffe BL GPIO_Init ;;;42 ;;;43 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 000040 14e0 ASRS r0,r4,#19 000042 f8ad001c STRH r0,[sp,#0x1c] ;;;44 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 000046 2048 MOVS r0,#0x48 000048 f88d001f STRB r0,[sp,#0x1f] ;;;45 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO 00004c a907 ADD r1,sp,#0x1c 00004e 4620 MOV r0,r4 000050 f7fffffe BL GPIO_Init ;;;46 ;;;47 //CAN单元设置 ;;;48 CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 000054 2400 MOVS r4,#0 ;;;49 CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 ;;;50 CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) ;;;51 CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 ;;;52 CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 ;;;53 CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 ;;;54 CAN_InitStructure.CAN_Mode= mode; //模式设置: mode:0,普通模式;1,回环模式; 000056 f88da002 STRB r10,[sp,#2] ;;;55 //设置波特率 ;;;56 CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq 00005a f88d8003 STRB r8,[sp,#3] 00005e f88d4006 STRB r4,[sp,#6] ;48 000062 f88d4008 STRB r4,[sp,#8] ;50 000066 2501 MOVS r5,#1 ;51 ;;;57 CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq ;;;58 CAN_InitStructure.CAN_BS2=tbs2; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq ;;;59 CAN_InitStructure.CAN_Prescaler=brp; //分频系数(Fdiv)为brp+1 000068 f8ad6000 STRH r6,[sp,#0] 00006c f88d4007 STRB r4,[sp,#7] ;49 000070 f88d5009 STRB r5,[sp,#9] ;51 ;;;60 CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1 000074 4e4a LDR r6,|L1.416| 000076 f88d400a STRB r4,[sp,#0xa] ;52 00007a f88d7004 STRB r7,[sp,#4] ;57 00007e f88d400b STRB r4,[sp,#0xb] ;53 000082 f88d9005 STRB r9,[sp,#5] ;58 000086 4669 MOV r1,sp 000088 4630 MOV r0,r6 00008a f7fffffe BL CAN_Init ;;;61 ;;;62 CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0 00008e f88d4016 STRB r4,[sp,#0x16] ;;;63 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式 000092 f88d4017 STRB r4,[sp,#0x17] ;;;64 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 000096 f88d5018 STRB r5,[sp,#0x18] ;;;65 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //32位ID 00009a f8ad400c STRH r4,[sp,#0xc] ;;;66 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; ;;;67 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK 00009e f8ad4010 STRH r4,[sp,#0x10] 0000a2 f8ad400e STRH r4,[sp,#0xe] ;66 ;;;68 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 0000a6 f8ad4012 STRH r4,[sp,#0x12] ;;;69 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0 0000aa f8ad4014 STRH r4,[sp,#0x14] ;;;70 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0 0000ae f88d5019 STRB r5,[sp,#0x19] ;;;71 ;;;72 CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化 0000b2 a803 ADD r0,sp,#0xc 0000b4 f7fffffe BL CAN_FilterInit ;;;73 ;;;74 #if CAN_RX0_INT_ENABLE ;;;75 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0消息挂号中断允许. 0000b8 2201 MOVS r2,#1 0000ba 2102 MOVS r1,#2 0000bc 4630 MOV r0,r6 0000be f7fffffe BL CAN_ITConfig ;;;76 ;;;77 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; 0000c2 2014 MOVS r0,#0x14 0000c4 f88d0020 STRB r0,[sp,#0x20] ;;;78 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1 0000c8 f88d5021 STRB r5,[sp,#0x21] ;;;79 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0 0000cc f88d4022 STRB r4,[sp,#0x22] ;;;80 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 0000d0 f88d5023 STRB r5,[sp,#0x23] ;;;81 NVIC_Init(&NVIC_InitStructure); 0000d4 a808 ADD r0,sp,#0x20 0000d6 f7fffffe BL NVIC_Init ;;;82 #endif ;;;83 return 0; ;;;84 } 0000da b00a ADD sp,sp,#0x28 0000dc 2000 MOVS r0,#0 ;83 0000de e8bd87f0 POP {r4-r10,pc} ;;;85 ENDP USB_LP_CAN1_RX0_IRQHandler PROC ;;;87 //中断服务函数 ;;;88 void USB_LP_CAN1_RX0_IRQHandler(void) 0000e2 b530 PUSH {r4,r5,lr} ;;;89 { 0000e4 b085 SUB sp,sp,#0x14 ;;;90 CanRxMsg RxMessage; ;;;91 int i=0; 0000e6 2400 MOVS r4,#0 ;;;92 ;;;93 CAN_Receive(CAN1, 0, &RxMessage); 0000e8 466a MOV r2,sp 0000ea 4621 MOV r1,r4 0000ec 482c LDR r0,|L1.416| 0000ee f7fffffe BL CAN_Receive 0000f2 466d MOV r5,sp ;90 |L1.244| ;;;94 ;;;95 for(i=0;i<8;i++) ;;;96 { ;;;97 printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]); 0000f4 1928 ADDS r0,r5,r4 0000f6 4621 MOV r1,r4 0000f8 7ac2 LDRB r2,[r0,#0xb] 0000fa a02a ADR r0,|L1.420| 0000fc f7fffffe BL __2printf 000100 1c64 ADDS r4,r4,#1 000102 2c08 CMP r4,#8 ;95 000104 dbf6 BLT |L1.244| |L1.262| ;;;98 } ;;;99 } 000106 b005 ADD sp,sp,#0x14 000108 bd30 POP {r4,r5,pc} ;;;100 #endif ENDP Can_Send_Msg PROC ;;;106 // 其他,失败; ;;;107 u32 Can_Send_Msg(u8* msg,u8 len,u32 appid) 00010a b5f0 PUSH {r4-r7,lr} ;;;108 { 00010c b085 SUB sp,sp,#0x14 ;;;109 u8 mbox; ;;;110 u16 i=0; 00010e 2300 MOVS r3,#0 ;;;111 CanTxMsg TxMessage; ;;;112 // TxMessage.StdId=0x12; // 标准标识符 ;;;113 TxMessage.ExtId=appid; // 设置扩展标示符 ;;;114 TxMessage.IDE=CAN_Id_Extended ; // 000110 9201 STR r2,[sp,#4] 000112 2204 MOVS r2,#4 000114 f88d2008 STRB r2,[sp,#8] ;;;115 TxMessage.RTR=CAN_RTR_Data; // 数据帧 000118 f88d3009 STRB r3,[sp,#9] ;;;116 TxMessage.DLC=len; // 要发送的数据长度 00011c f88d100a STRB r1,[sp,#0xa] 000120 466a MOV r2,sp ;111 000122 e004 B |L1.302| |L1.292| ;;;117 for(i=0;i=0XFFF)return 1; 000158 42ac CMP r4,r5 00015a d302 BCC |L1.354| 00015c 2001 MOVS r0,#1 |L1.350| ;;;123 return 0; ;;;124 } 00015e b005 ADD sp,sp,#0x14 000160 bdf0 POP {r4-r7,pc} |L1.354| 000162 2000 MOVS r0,#0 ;123 000164 e7fb B |L1.350| ;;;125 //can口接收数据查询 ENDP Can_Receive_Msg PROC ;;;128 // 其他,接收的数据长度; ;;;129 u8 Can_Receive_Msg(u8 *buf) 000166 b530 PUSH {r4,r5,lr} ;;;130 { ;;;131 u32 i; ;;;132 CanRxMsg RxMessage; ;;;133 if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //没有接收到数据,直接退出 000168 4d0d LDR r5,|L1.416| 00016a 4604 MOV r4,r0 ;130 00016c b085 SUB sp,sp,#0x14 ;130 00016e 2100 MOVS r1,#0 000170 4628 MOV r0,r5 000172 f7fffffe BL CAN_MessagePending 000176 2800 CMP r0,#0 000178 d0c5 BEQ |L1.262| ;;;134 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据 00017a 466a MOV r2,sp 00017c 2100 MOVS r1,#0 00017e 4628 MOV r0,r5 000180 f7fffffe BL CAN_Receive ;;;135 for(i=0;i<8;i++) 000184 2100 MOVS r1,#0 000186 4668 MOV r0,sp ;132 |L1.392| ;;;136 buf[i]=RxMessage.Data[i]; 000188 1842 ADDS r2,r0,r1 00018a 7ad2 LDRB r2,[r2,#0xb] 00018c 5462 STRB r2,[r4,r1] 00018e 1c49 ADDS r1,r1,#1 000190 2908 CMP r1,#8 ;135 000192 d3f9 BCC |L1.392| ;;;137 return RxMessage.DLC; 000194 f89d000a LDRB r0,[sp,#0xa] ;;;138 } 000198 e7b5 B |L1.262| ;;;139 ENDP 00019a 0000 DCW 0x0000 |L1.412| DCD 0x40010800 |L1.416| DCD 0x40006400 |L1.420| 0001a4 72786275 DCB "rxbuf[%d]:%d\r\n",0 0001a8 665b2564 0001ac 5d3a2564 0001b0 0d0a00 0001b3 00 DCB 0