📄 davinci_evm.lst
字号:
88 void getIRVal(void);
89 void getInputState(void);
90 void getEvent(void);
91 void setOutputState(void);
92
93
94
95
96 //
97 // Interrupt Service Routines (ISRs)
98 //
99 __interrupt void timerA0_ISR(void);
100 __interrupt void timerA_ISR(void);
101 __interrupt void wdt_ISR(void);
102 __interrupt void usart0_Rx_ISR(void);
103
104
105 //
106 // Global Variables
107 //
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
108 unsigned char Event = 0;
\ Event:
\ 000000 DS8 1
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
109 unsigned char EventFlag = 0;
\ EventFlag:
\ 000000 DS8 1
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
110 unsigned int Error = 0;
\ Error:
\ 000000 DS8 2
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
111 unsigned char IRBit = 0;
\ IRBit:
\ 000000 DS8 1
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
112 unsigned int IRData = 0;
\ IRData:
\ 000000 DS8 2
113
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
114 unsigned int MaxCnt = 0;
\ MaxCnt:
\ 000000 DS8 2
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
115 unsigned char prevP2State;
\ prevP2State:
\ 000000 DS8 1
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
116 unsigned char prevP3State;
\ prevP3State:
\ 000000 DS8 1
117
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
118 unsigned char irReadIndex = 0;
\ irReadIndex:
\ 000000 DS8 1
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
119 unsigned char irWriteIndex = 0;
\ irWriteIndex:
\ 000000 DS8 1
\ In segment DATA16_Z, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
120 unsigned int IRBuff[IRBUFFLEN];
\ IRBuff:
\ 000000 DS8 64
121
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
122 unsigned char i2cIndex = 0;
\ i2cIndex:
\ 000000 DS8 1
123
124 typedef void (*I2CMSG)(void);
125
126
127 //
128 // I2C Message Function Table
129 //
\ In segment DATA16_I, align 2, align-sorted
\ 000000 REQUIRE ?cstart_init_copy
130 I2CMSG i2cMsgTbl[] =
\ i2cMsgTbl:
\ 000000 DS8 14
\ 00000E REQUIRE `?<Initializer for i2cMsgTbl>`
131 {
132 setRTC, // I2C msg ID is SET_RTC_PARAMS
133 getRTC, // I2C msg ID is GET_RTC_PARAMS
134 getIRData, // I2C msg ID is SEND_IR_DATA
135 getIRVal, // I2C msg ID is GET_LAST_IR_VALUE
136 getInputState, // I2C msg ID is GET_INPUT_STATE
137 getEvent, // I2C msg ID is GET_EVENT
138 setOutputState // I2C msg ID is SET_OUTPUT_STATE
139 };
140
141
142 //
143 // Low-level system initialization - called prior to main()
144 //
\ In segment CODE, align 2, root
145 int __low_level_init(void)
\ __low_level_init:
\ 000000 REQUIRE ?cstart_call_low_level_init
146 {
147 WDTCTL = WDTPW + WDTHOLD; // Stop WDT
\ 000000 B240805A2001 MOV.W #0x5a80, &0x120
148 return (1); // Force initialization of RAM
\ 000006 1C43 MOV.W #0x1, R12
\ 000008 3041 RET
149 // return (0); // Skip initialization of RAM
150 }
151
152
153 //
154 // Set DCO frequency (calibrated from external 32kHz watch crystal)
155 //
\ In segment CODE, align 2
156 void setDCO(void)
\ setDCO:
157 {
158 unsigned char orig;
159 unsigned int clkCnt;
160 unsigned int prevCnt = 0;
\ 000000 0D43 MOV.W #0x0, R13
161
162 // DCO_STATUS_LED; // Set status LED pin as output
163
164 BCSCTL2 |= DCO_ROSC; // Set DCOR bit if using Rosc
\ 000002 D2D35800 BIS.B #0x1, &0x58
165
166 orig = BCSCTL1 & ~DCO_RSEL_MASK; // Save, clear RSEL bits
\ 000006 5C425700 MOV.B &0x57, R12
\ 00000A 7CF0F800 AND.B #0xf8, R12
\ 00000E 4E4C MOV.B R12, R14
167
168 BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8 = 4096 Hz
\ 000010 F2D030005700 BIS.B #0x30, &0x57
169
170 // Timer A Control Register
171 TACTL = TASSEL_2 + MC_2 + TACLR; // Clk src is SMCLK
\ 000016 B24024026001 MOV.W #0x224, &0x160
172 // Input clock divider is 1
173 // Continuous mode
174 // Reset
175 // Interrupt is disabled
176 // Clear interrupt flag (TAIFG)
177
178 // Timer_A Capture/Compare Control Register
179 TACCTL2 = CM_1 + CCIS_1 + CAP; // Capture on rising Edge
\ 00001C B24000516601 MOV.W #0x5100, &0x166
180 // Capture input is CCI2B = ACLK
181 // Async capture
182 // Capture mode
183 // Output mode is OUT bit
184 // Interrupt disabled
185 // OUT bit is 0
186 // Clear capture overflow bit (COV)
187 // Clear interrupt flag (CCIFG)
188
189
190 while(1)
191 {
192 while( !(TACCTL2 & CCIFG) ); // Wait for capture event
\ ??setDCO_0:
\ 000022 92B36601 BIT.W #0x1, &0x166
\ 000026 FD2B JNC ??setDCO_0
193
194 TACCTL2 &= ~CCIFG; // Capture occured, clear flag
\ 000028 92C36601 BIC.W #0x1, &0x166
195
196 clkCnt = TACCR2 - prevCnt; // Num of clks since last capture
\ 00002C 1C427601 MOV.W &0x176, R12
\ 000030 0C8D SUB.W R13, R12
\ 000032 0F4C MOV.W R12, R15
197
198 prevCnt = TACCR2; // Save current clock count
\ 000034 1D427601 MOV.W &0x176, R13
199
200 // Check to see if number of DCO clocks is within range
201 if( (clkCnt <= (DCO_CLKS + DCO_TOL)) && (clkCnt >= (DCO_CLKS - DCO_TOL)) )
\ 000038 3F900607 CMP.W #0x706, R15
\ 00003C 032C JC ??setDCO_1
\ 00003E 3F900307 CMP.W #0x703, R15
\ 000042 292C JC ??setDCO_2
202 {
203 DCO_LOCKED; // Illuminate DCO status LED
204 break;
205 }
206 else if( clkCnt > DCO_CLKS ) // DCO is too fast, slow it down
\ ??setDCO_1:
\ 000044 3F900507 CMP.W #0x705, R15
\ 000048 0F28 JNC ??setDCO_3
207 {
208 DCOCTL--;
\ 00004A F2535600 ADD.B #0xff, &0x56
209
210 if( DCOCTL == 0xFF )
\ 00004E F2935600 CMP.B #0xff, &0x56
\ 000052 1C20 JNE ??setDCO_4
211 {
212 if( BCSCTL1 & DCO_RSEL_MASK )
\ 000054 F2B007005700 BIT.B #0x7, &0x57
\ 00005A 0324 JEQ ??setDCO_5
213 {
214 BCSCTL1--; // DCO role under?, dec RSEL
\ 00005C F2535700 ADD.B #0xff, &0x57
\ 000060 153C JMP ??setDCO_4
215 }
216 else
217 {
218 Error |= ERROR_DCO_MIN;
\ ??setDCO_5:
\ 000062 92D3.... BIS.W #0x1, &Error
219 break; // Error condition, break loop
\ 000066 173C JMP ??setDCO_2
220 }
221 }
222 }
223 else // DCO is too slow, speed it up
224 {
225 DCOCTL++;
\ ??setDCO_3:
\ 000068 D2535600 ADD.B #0x1, &0x56
226
227 if( DCOCTL == 0x00 )
\ 00006C C2935600 CMP.B #0x0, &0x56
\ 000070 0D20 JNE ??setDCO_4
228 {
229 if( (BCSCTL1 & DCO_RSEL_MASK) != DCO_RSEL_MASK )
\ 000072 5C425700 MOV.B &0x57, R12
\ 000076 7CF00700 AND.B #0x7, R12
\ 00007A 7C900700 CMP.B #0x7, R12
\ 00007E 0324 JEQ ??setDCO_6
230 {
231 BCSCTL1++; // DCO role over? Inc RSEL
\ 000080 D2535700 ADD.B #0x1, &0x57
\ 000084 033C JMP ??setDCO_4
232 }
233 else
234 {
235 Error |= ERROR_DCO_MAX;
\ ??setDCO_6:
\ 000086 A2D3.... BIS.W #0x2, &Error
236 break; // Error condition, break loop
\ 00008A 053C JMP ??setDCO_2
237 }
238 }
239 }
240
241 if( TACCTL2 & COV ) // Check for timer overflow
\ ??setDCO_4:
\ 00008C A2B36601 BIT.W #0x2, &0x166
\ 000090 C82B JNC ??setDCO_0
242 {
243 Error |= ERROR_DCO_OV;
\ 000092 A2D2.... BIS.W #0x4, &Error
244 break;
245 }
246 }
247
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -