📄 can_ex1.lst
字号:
ARM COMPILER V2.32a, CAN_Ex1 15/03/07 08:58:24 PAGE 1
ARM COMPILER V2.32a, COMPILATION OF MODULE CAN_Ex1
OBJECT MODULE PLACED IN .\obj\CAN_Ex1.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe CAN_Ex1.c THUMB OPTIMIZE(7,SPEED) DEBUG CODE PRINT(.\LST\CAN_EX1.LST) TABS(3
-) OBJECT(.\obj\CAN_Ex1.obj)
stmt level source
1 /*----------------------------------------------------------------------------
2 * A R T X C A N D r i v e r E x a m p l e 1
3 *----------------------------------------------------------------------------
4 * Name: CAN_Ex1.c
5 * Purpose: ARTX CAN Driver usage example
6 * Rev.: V0.20 / october-14-2005
7 *----------------------------------------------------------------------------
8 * This code is part of the ARTX-ARM kernel package of Keil Software.
9 * Copyright (c) 2004-2005 Keil Software. All rights reserved.
10 *---------------------------------------------------------------------------*/
11
12 #include <ARTX.h> /* ARTX kernel functions & defines */
13 #include <LPC21xx.h> /* LPC21xx definitions */
14 #include "ARTX_CAN.h" /* CAN Generic functions & defines */
15
16
17 #define ONLY_CAN_PROG 1
18
19
20 #define NOP() __asm{NOP}
21 #define RESET_WATCH_DOG { IODIR0 |= (1<<11); NOP(); NOP();\
22 IOCLR0 |= (1<<11); NOP(); NOP();\
23 IOSET0 |= (1<<11); NOP(); NOP();\
24 IOCLR0 |= (1<<11); NOP(); NOP();\
25 IOSET0 |= (1<<11); NOP(); NOP();\
26 } ;
27
28
29
30
31 OS_TID tsk1; /* Assigned identification for task 1 */
32 OS_TID tsk2; /* Assigned identification for task 1 */
33
34 void task_send_CAN (void) __task; /* Task that sends CAN message */
35 void task_rece_CAN (void) __task; /* Task that receives CAN message */
36
37
38
39
40 unsigned char get_AD (void); /* A/D potentiometer value readout */
41
42 /*----------------------------------------------------------------------------
43 * LED Functions
44 *---------------------------------------------------------------------------*/
45
46 void LED_Init (void) {
47 1 IODIR1 = 0x00FF0000; /* P1.16..22 defined as Outputs */
48 1 }
49
50 void LED_Byte (unsigned char LED_state) {
51 1 IOCLR1 = 0x00FF0000;
52 1 IOSET1 = ((unsigned int) LED_state) << 16 & 0x00FF0000;
53 1 }
54
55
56
57
58 /*----------------------------------------------------------------------------
ARM COMPILER V2.32a, CAN_Ex1 15/03/07 08:58:24 PAGE 2
59 * Task 1: Sends message with AD value in data[0] over CAN periodically
60 *---------------------------------------------------------------------------*/
61
62 void task_send_CAN (void) __task {
63 1 /* Initialize message = { ID, {data[0] .. data[7]}, LEN, CHANNEL, FORMAT, TYPE } */
64 1 CAN_msg msg_send = { 33, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
65 1 1, 2, STANDARD_FORMAT, DATA_FRAME };
66 1
67 1 CAN_init (1, 500000); /* CAN controller 1 init, 500 kbit/s */
68 1 CAN_init (2, 500000); /* CAN controller 2 init, 500 kbit/s */
69 1
70 1 /* Transmit object does not have to be enabled but channel has to be
71 1 reserved for tansmitting, in this example channel 1 is reserved for
72 1 transmission */
73 1
74 1 CAN_rx_object (1, 2, 33, STANDARD_FORMAT); /* Enable reception of */
75 1 /* message on controller 1, channel is */
76 1 /* not used for LPC (can be set to */
77 1 /* whatever value), with standard id 33*/
78 1 CAN_start (1); /* Start controller 1 */
79 1 CAN_start (2); /* Start controller 2 */
80 1
81 1 tsk1 = os_tsk_self (); /* Get own task identification number */
82 1 tsk2 = os_tsk_create (task_rece_CAN, 0); /* Start receive task */
83 1
84 1 for (;;) {
85 2 msg_send.data[0] = get_AD (); /* Data[0] field = analog value from */
86 2
87 2 RESET_WATCH_DOG; /* potentiometer */
88 2
89 2 CAN_send (2, &msg_send, 0x0f00); /* Send msg_send on controller 2 */
90 2 os_dly_wait (100); /* Wait 1 second */
91 2 }
92 1 }
93
94
95 /*----------------------------------------------------------------------------
96 * Task 2: Turns on the LEDs according to data[0] of received CAN message
97 *---------------------------------------------------------------------------*/
98
99 void task_rece_CAN (void) __task {
100 1 CAN_msg msg_rece;
101 1
102 1 for (;;) {
103 2 /* When message arrives activate LED for value in data[0] of
104 2 arrived message */
105 2 if (CAN_receive (1, &msg_rece, 0x00FF) == CAN_OK) {
106 3 LED_Byte (msg_rece.data[0]);
107 3 }
108 2 }
109 1 }
110
111
112
113
114 /*----------------------------------------------------------------------------
115 * Function for getting the AD conversion
116 *---------------------------------------------------------------------------*/
117
118 unsigned char get_AD (void) {
119 1 unsigned int val;
120 1
121 1 ADCR |= 0x01000000; /* Start A/D Conversion */
122 1
123 1 do {
124 2 val = ADDR; /* Read A/D Data Register */
ARM COMPILER V2.32a, CAN_Ex1 15/03/07 08:58:24 PAGE 3
125 2 }
126 1 while ((val & 0x80000000) == 0); /* Wait for end of A/D Conversion */
127 1
128 1 ADCR &= ~0x01000000; /* Stop A/D Conversion */
129 1 val = (val >> 8) & 0xFF; /* Extract AIN0 Value */
130 1
131 1 return val;
132 1 }
133
134 #if(ONLY_CAN_PROG)
135 /*----------------------------------------------------------------------------
136 * Main: Initialize and start ARTX Kernel
137 *---------------------------------------------------------------------------*/
138
139 void main (void) { /* Program execution starts here */
140 1 ADCR = 0x00270401; /* Setup A/D: 10-bit AIN0 @ 3MHz */
141 1
142 1 LED_Init (); /* Initialize LED */
143 1 LED_Byte (0); /* Turn the LED off */
144 1
145 1 os_sys_init (task_send_CAN); /* Initialize and start task 1 */
146 1 }
147
148 #else
#endif
155
156
157 /*----------------------------------------------------------------------------
158 * end of file
159 *---------------------------------------------------------------------------*/
ARM COMPILER V2.32a, CAN_Ex1 15/03/07 08:58:24 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (os_tsk_create_user?T)
EXTERN CODE16 (os_tsk_self?T)
EXTERN CODE16 (os_sys_init_user?T)
EXTERN CODE16 (os_dly_wait?T)
EXTERN CODE16 (CAN_init?T)
EXTERN CODE16 (CAN_start?T)
EXTERN CODE16 (CAN_send?T)
EXTERN CODE16 (CAN_receive?T)
EXTERN CODE16 (CAN_rx_object?T)
EXTERN NUMBER (__startup)
*** PUBLICS:
PUBLIC task_send_CAN?T
PUBLIC task_rece_CAN?T
PUBLIC get_AD?T
PUBLIC LED_Init?T
PUBLIC LED_Byte?T
PUBLIC main
PUBLIC tsk1
PUBLIC tsk2
*** DATA SEGMENT '?DT0?CAN_Ex1':
00000000 tsk1:
00000000 DS 4
00000004 tsk2:
00000004 DS 4
*** DATA SEGMENT '?CON?CAN_Ex1':
00000000 ?tpl?0001:
00000000 BEGIN_INIT
00000000 00000021 DD 0x21
00000004 00 DB 0x0
00000005 00 DB 0x0
00000006 00 DB 0x0
00000007 00 DB 0x0
00000008 00 DB 0x0
00000009 00 DB 0x0
0000000A 00 DB 0x0
0000000B 00 DB 0x0
0000000C 01 DB 0x1
0000000D 02 DB 0x2
0000000E 00 DB 0x0
0000000F 00 DB 0x0
00000010 END_INIT
*** CODE SEGMENT '?PR?LED_Init?T?CAN_Ex1':
47: IODIR1 = 0x00FF0000; /* P1.16..22 defined as Outputs */
00000000 4800 LDR R1,=0xFF0000
00000002 4800 LDR R0,=0xE0028018
00000004 6001 STR R1,[R0,#0x0]
48: }
00000006 4770 BX R14
00000008 ENDP ; 'LED_Init?T'
*** CODE SEGMENT '?PR?LED_Byte?T?CAN_Ex1':
50: void LED_Byte (unsigned char LED_state) {
00000000 1C01 MOV R1,R0 ; LED_state
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -