📄 main.lst
字号:
\ 00000066 04D0 BEQ ??AT91F_CAN1_Handler_4
\ 00000068 2200 MOVS R2,R4
\ 0000006A .... ADR R1,??DataTable19 ;; "%d"
\ 0000006C .... LDR R0,??DataTable26 ;; _Stdout
\ 0000006E ........ _BLF fprintf,??fprintf??rT
68 if((status & AT91C_CAN_WAKEUP) == AT91C_CAN_WAKEUP) {
\ ??AT91F_CAN1_Handler_4:
\ 00000072 0098 LDR R0,[SP, #+0]
\ 00000074 8002 LSLS R0,R0,#+10
\ 00000076 02D5 BPL ??AT91F_CAN1_Handler_5
69 testCAN1 = AT91C_TEST_OK;
\ 00000078 0748 LDR R0,??AT91F_CAN1_Handler_0+0x10 ;; testCAN1
\ 0000007A 0121 MOVS R1,#+1
\ 0000007C 0170 STRB R1,[R0, #+0]
70 TRACE_DEBUG_H("=> CAN1 WAKEUP ");
71 }
72
73 }
\ ??AT91F_CAN1_Handler_5:
\ 0000007E 01B0 ADD SP,SP,#+4
\ 00000080 30BC POP {R4,R5}
\ 00000082 01BC POP {R0}
\ 00000084 0047 BX R0 ;; return
\ 00000086 C046 Nop
\ ??AT91F_CAN1_Handler_0:
\ 00000088 0042F8FF DC32 0xfffffffffff84200
\ 0000008C ........ DC32 `?<Constant "\\r\\n______Interrupt rec...">`
\ 00000090 ........ DC32 `?<Constant "\\r\\n_______Interrupt re...">`
\ 00000094 1C42F8FF DC32 0xfffffffffff8421c
\ 00000098 ........ DC32 testCAN1
74
75 //*--------------------------------------------------------------------------------------
76 //* Function Name : Main
77 //* Object : Software entry point
78
79 //* 主程序主要实现 CAN 在较低拨特率( 5K , 10K )下的通讯 ,主要工作在于设置正确的拨特率 ,
80 //* 由于在 MCK=48mHz的情况下不能得到如此低的拨特率,于是采用降低主频的方式。在 波特率为5K
81 //* 的测试条件下,将主频降为 6mHz ,即 MCK的8分频。得到分频数 BRP= 6m/5K/16 -1 =74= 0x4A ,
82 //* 现在的状态即为 MCK=6M, CAN baudrate= 5 k 的测试程序。调试串口输出的拨特率为 9600 。
83 //***************************************************************************************
84 //***************在测试 CAN baudrate= 10 k 的时候,仅需要改动几个如下部分而已************
85 //* 1。将MCK 4分频,降低为 12mHz,即将 AT91C_BASE_PMC->PMC_MCKR |=AT91C_PMC_PRES_CLK_8 ;
86 //* 改为 AT91C_BASE_PMC->PMC_MCKR |=AT91C_PMC_PRES_CLK_4 ;
87 //* 2。将 DBGU调试串口配置为 :波特率设置为 115200 ,主时钟为 AT91C_MASTER_CLOCK/2
88 //* 改动点在函数 AT91F_US_Configure(...)中
89 //* 3。CAN 波特率寄存器的值 : 频数 BRP= 12m/10K /16 -1 =74= 0x4A , 所有低波特率情况下,当
90 //* CAN的传输延迟时间小于一个bit的时间时候,都可以 PROPAG=0 ,PHASE1= PHASE2=6。即 0x004A3066
91 //* 和 5K的时候一样。
92 //*********************************配置调试串口的一点注意********************************
93 //* 本测试程序在 10K 的时候设定波特率为 115200,却 在 5K的时候配置为9600 。按照串口的波特率
94 //* 计算公式 baudrate=MCK/16/ CD (CD为16 bit的波特率发生器寄存),5K 时,CD=6m/16/115200
95 //* =3.2552 似乎可行,但输出全是乱码, 原因在于当 CD小于 6.5的时候,波特率计算公式会根据不同的
96 //* 情况调整,可能得不到预期的值。最好大于6.5。(9600时,CD=39.0625)
97 //*--------------------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
98 void main()
99 {
\ main:
\ 00000000 10B5 PUSH {R4,LR}
100 ////////////////////////////////////////////////////////////////////////////////////////////////////
101 // 设置MCK ,can的时钟为 MCK ,如今MCK=48mHz ,为了降到5K的波特率,需要降低主时钟,现如今将MCK时钟
102 // 降为原来的 8 分之一 ,现 MCK=6M ,
103 ////////////////////////////////////////////////////////////////////////////////////////////////////
104 AT91C_BASE_CKGR->CKGR_MOR=0x00000701 ; //时钟在56个慢时钟周期后启动
\ 00000002 5A48 LDR R0,??main_0 ;; 0xfffffffffffffc20
\ 00000004 5A49 LDR R1,??main_0+0x4 ;; 0x701
\ 00000006 0160 STR R1,[R0, #+0]
105 //必须等待PMC_SR 寄存器中的MOSCS域置位,可通过轮询状态寄存器或等待当PMC_IER 寄存器中与MOSCS相关的中断的中断线上升
106 //>>>>>
107 unsigned int status ;
108 do{ //等待CKGR_MCFR寄存器中的MAINRDY域置位
109 status=AT91C_BASE_CKGR->CKGR_MCFR ;
\ ??main_1:
\ 00000008 5A48 LDR R0,??main_0+0x8 ;; 0xfffffffffffffc24
\ 0000000A 0068 LDR R0,[R0, #+0]
\ 0000000C 0400 MOVS R4,R0
110 status &= 0x00010000 ;
\ 0000000E 2000 MOVS R0,R4
\ 00000010 8024 MOVS R4,#+128
\ 00000012 6402 LSLS R4,R4,#+9 ;; #+65536
\ 00000014 0440 ANDS R4,R4,R0
111 }
112 while(status!=0x10000);
\ 00000016 8020 MOVS R0,#+128
\ 00000018 4002 LSLS R0,R0,#+9 ;; #+65536
\ 0000001A 8442 CMP R4,R0
\ 0000001C F4D1 BNE ??main_1
113 //等待CKGR_MCFR寄存器中的MAINRDY域置位(下)
114
115 do{
116 status=AT91C_BASE_CKGR->CKGR_MCFR ;
\ ??main_2:
\ 0000001E 5548 LDR R0,??main_0+0x8 ;; 0xfffffffffffffc24
\ 00000020 0068 LDR R0,[R0, #+0]
\ 00000022 0400 MOVS R4,R0
117 status &= 0x000010000 ;
\ 00000024 2000 MOVS R0,R4
\ 00000026 8024 MOVS R4,#+128
\ 00000028 6402 LSLS R4,R4,#+9 ;; #+65536
\ 0000002A 0440 ANDS R4,R4,R0
118 }
119 while(status!=0x10000) ; //AT91C_BASE_CKGR->CKGR_MCFR=0x1FFFF ;
\ 0000002C 8020 MOVS R0,#+128
\ 0000002E 4002 LSLS R0,R0,#+9 ;; #+65536
\ 00000030 8442 CMP R4,R0
\ 00000032 F4D1 BNE ??main_2
120 status=(AT91C_BASE_CKGR->CKGR_MCFR & 0x0FFFF) ; //***读出16个慢时钟周期中主时钟周期数 ,没有使用
\ 00000034 4F48 LDR R0,??main_0+0x8 ;; 0xfffffffffffffc24
\ 00000036 0068 LDR R0,[R0, #+0]
\ 00000038 0004 LSLS R0,R0,#+16 ;; ZeroExtS R0,R0,#+16,#+16
\ 0000003A 000C LSRS R0,R0,#+16
\ 0000003C 0400 MOVS R4,R0
121
122 AT91C_BASE_PMC->PMC_MCKR =AT91C_PMC_CSS_MAIN_CLK ; //处理器时钟为主机时钟。 8分频
\ 0000003E 4E48 LDR R0,??main_0+0xC ;; 0xfffffffffffffc30
\ 00000040 0121 MOVS R1,#+1
\ 00000042 0160 STR R1,[R0, #+0]
123 AT91C_BASE_PMC->PMC_MCKR |=AT91C_PMC_PRES_CLK_8 ; //此时 MCk=48/8 =6M
\ 00000044 4C48 LDR R0,??main_0+0xC ;; 0xfffffffffffffc30
\ 00000046 4C49 LDR R1,??main_0+0xC ;; 0xfffffffffffffc30
\ 00000048 0968 LDR R1,[R1, #+0]
\ 0000004A 0C22 MOVS R2,#+12
\ 0000004C 0A43 ORRS R2,R2,R1
\ 0000004E 0260 STR R2,[R0, #+0]
124 do{
125 status=AT91C_BASE_CKGR->CKGR_MCFR ;
\ ??main_3:
\ 00000050 4848 LDR R0,??main_0+0x8 ;; 0xfffffffffffffc24
\ 00000052 0068 LDR R0,[R0, #+0]
\ 00000054 0400 MOVS R4,R0
126 status &= 0x000010000 ;
\ 00000056 2000 MOVS R0,R4
\ 00000058 8024 MOVS R4,#+128
\ 0000005A 6402 LSLS R4,R4,#+9 ;; #+65536
\ 0000005C 0440 ANDS R4,R4,R0
127 }
128 while(status!=0x10000) ;
\ 0000005E 8020 MOVS R0,#+128
\ 00000060 4002 LSLS R0,R0,#+9 ;; #+65536
\ 00000062 8442 CMP R4,R0
\ 00000064 F4D1 BNE ??main_3
129
130 //AT91C_BASE_PMC->PMC_PCER=0xFFFFFFFF ; //使能外设时钟(1,4,5,6,7,8)0x000001F2
131
132 // AT91C_BASE_PMC->PMC_MCFR|=AT91C_CKGR_MAINF ;
133 // AT91C_BASE_PMC->PMC_MCFR|=AT91C_CKGR_MAINRDY ;
134
135 /*
136 AT91C_BASE_PMC->PMC_MCFR|=AT91C_CKGR_MAINF ;
137 AT91C_BASE_PMC->PMC_MCFR|=AT91C_CKGR_MAINRDY ;
138 AT91C_BASE_PMC->PMC_MOR |=AT91C_CKGR_MOSCEN ;
139 AT91C_BASE_PMC->PMC_MOR |=AT91C_CKGR_OSCOUNT ;
140 */
141 // AT91C_BASE_PMC->PMC_SCER |=AT91C_PMC_PCK ;
142
143
144 /////////////////////////////////////////////////////////////////////////////////////////////////////
145 // Enable DBGU Clock
146 AT91F_DBGU_CfgPMC(); // DBGU is always clocked
\ 00000066 ........ _BLF AT91F_DBGU_CfgPMC,??AT91F_DBGU_CfgPMC??rT
147 // Open PIO for DBGU
148 AT91F_DBGU_CfgPIO();
\ 0000006A ........ _BLF AT91F_DBGU_CfgPIO,??AT91F_DBGU_CfgPIO??rT
149 //在设置波特率的时候,当CD值为小于6.5的 ,系统的算法会进行调整,而得不到想要的值,请避开
150 AT91F_US_Configure ((AT91PS_USART) AT91C_BASE_DBGU,
151 AT91C_MASTER_CLOCK/4,
152 AT91C_US_ASYNC_MODE, // mode Register to be programmed
153 9600, // ******baudrate to be programmedAT91C_BAUDRATE_115200
154 0); // timeguard to be programmed
\ 0000006E 0020 MOVS R0,#+0
\ 00000070 01B4 PUSH {R0}
\ 00000072 9623 MOVS R3,#+150
\ 00000074 9B01 LSLS R3,R3,#+6 ;; #+9600
\ 00000076 8C22 MOVS R2,#+140
\ 00000078 1201 LSLS R2,R2,#+4 ;; #+2240
\ 0000007A 4049 LDR R1,??main_0+0x10 ;; 0xb71b00
\ 0000007C 4048 LDR R0,??main_0+0x14 ;; 0xfffffffffffff200
\ 0000007E ........ _BLF AT91F_US_Configure,??AT91F_US_Configure??rT
\ 00000082 01B0 ADD SP,SP,#+4
155 // Enable Transmitter
156 AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
\ 00000084 3E48 LDR R0,??main_0+0x14 ;; 0xfffffffffffff200
\ 00000086 ........ _BLF AT91F_US_EnableTx,??AT91F_US_EnableTx??rT
157
158 TRACE_INFO("\n\n\r======================================\n\r");
\ 0000008A .... LDR R0,??DataTable26 ;; _Stdout
\ 0000008C 0028 CMP R0,#+0
\ 0000008E 03D0 BEQ ??main_4
\ 00000090 3C49 LDR R1,??main_0+0x18 ;; `?<Constant "\\n\\n\\r==================...">`
\ 00000092 .... LDR R0,??DataTable26 ;; _Stdout
\ 00000094 ........ _BLF fprintf,??fprintf??rT
159 TRACE_INFO("*****AT91SAM7A3 Basic CAN in 12mHz 10K 16bit Carry / 1 bit***** \n\r");
\ ??main_4:
\ 00000098 .... LDR R0,??DataTable26 ;; _Stdout
\ 0000009A 0028 CMP R0,#+0
\ 0000009C 03D0 BEQ ??main_5
\ 0000009E 3A49 LDR R1,??main_0+0x1C ;; `?<Constant "*****AT91SAM7A3 Basic...">`
\ 000000A0 .... LDR R0,??DataTable26 ;; _Stdout
\ 000000A2 ........ _BLF fprintf,??fprintf??rT
160 TRACE_INFO("======================================\n\r");
\ ??main_5:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -