Mercurial > ~darius > hgwebdir.cgi > stm32temp
comparison libs/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/CAN/LoopBack/main.c @ 0:c59513fd84fb
Initial commit of STM32 test code.
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Mon, 03 Oct 2011 21:19:15 +1030 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c59513fd84fb |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @file CAN/LoopBack/main.c | |
4 * @author MCD Application Team | |
5 * @version V3.5.0 | |
6 * @date 08-April-2011 | |
7 * @brief Main program body | |
8 ****************************************************************************** | |
9 * @attention | |
10 * | |
11 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS | |
12 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE | |
13 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY | |
14 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING | |
15 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE | |
16 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. | |
17 * | |
18 * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2> | |
19 ****************************************************************************** | |
20 */ | |
21 | |
22 /* Includes ------------------------------------------------------------------*/ | |
23 #include "stm32f10x.h" | |
24 #include "stm32_eval.h" | |
25 | |
26 /** @addtogroup STM32F10x_StdPeriph_Examples | |
27 * @{ | |
28 */ | |
29 | |
30 /** @addtogroup CAN_LoopBack | |
31 * @{ | |
32 */ | |
33 | |
34 | |
35 | |
36 /* Private define ------------------------------------------------------------*/ | |
37 #define __CAN1_USED__ | |
38 /* #define __CAN2_USED__*/ /* Please check that you device is | |
39 Connectivity line when using CAN2 */ | |
40 | |
41 #ifdef __CAN1_USED__ | |
42 #define CANx CAN1 | |
43 #else /*__CAN2_USED__*/ | |
44 #define CANx CAN2 | |
45 #endif /* __CAN1_USED__ */ | |
46 | |
47 /* Private typedef -----------------------------------------------------------*/ | |
48 typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; | |
49 /* Private macro -------------------------------------------------------------*/ | |
50 /* Private variables ---------------------------------------------------------*/ | |
51 __IO uint32_t ret = 0; /* for return of the interrupt handling */ | |
52 volatile TestStatus TestRx; | |
53 | |
54 /* Private function prototypes -----------------------------------------------*/ | |
55 void NVIC_Configuration(void); | |
56 TestStatus CAN_Polling(void); | |
57 TestStatus CAN_Interrupt(void); | |
58 | |
59 /* Private functions ---------------------------------------------------------*/ | |
60 | |
61 /** | |
62 * @brief Main program. | |
63 * @param None | |
64 * @retval None | |
65 */ | |
66 int main(void) | |
67 { | |
68 /*!< At this stage the microcontroller clock setting is already configured, | |
69 this is done through SystemInit() function which is called from startup | |
70 file (startup_stm32f10x_xx.s) before to branch to application main. | |
71 To reconfigure the default setting of SystemInit() function, refer to | |
72 system_stm32f10x.c file | |
73 */ | |
74 | |
75 | |
76 | |
77 #ifdef __CAN1_USED__ | |
78 /* CANx Periph clock enable */ | |
79 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); | |
80 #else /*__CAN2_USED__*/ | |
81 /* CAN1 & 2 Periph clock enable */ | |
82 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); | |
83 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); | |
84 #endif /* __CAN1_USED__ */ | |
85 | |
86 /* NVIC Configuration */ | |
87 NVIC_Configuration(); | |
88 | |
89 /* Configures LED 1..4 */ | |
90 STM_EVAL_LEDInit(LED1); | |
91 STM_EVAL_LEDInit(LED2); | |
92 STM_EVAL_LEDInit(LED3); | |
93 STM_EVAL_LEDInit(LED4); | |
94 | |
95 /* Turns selected LED Off */ | |
96 STM_EVAL_LEDOff(LED1); | |
97 STM_EVAL_LEDOff(LED2); | |
98 STM_EVAL_LEDOff(LED3); | |
99 STM_EVAL_LEDOff(LED4); | |
100 | |
101 /* CAN transmit at 125Kb/s and receive by polling in loopback mode */ | |
102 TestRx = CAN_Polling(); | |
103 | |
104 if (TestRx == FAILED) | |
105 { | |
106 /* Turn on led LD3 */ | |
107 STM_EVAL_LEDOn(LED3); | |
108 } | |
109 else | |
110 { | |
111 /* Turn on led LD1 */ | |
112 STM_EVAL_LEDOn(LED1); | |
113 } | |
114 | |
115 /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode */ | |
116 TestRx = CAN_Interrupt(); | |
117 | |
118 if (TestRx == FAILED) | |
119 { | |
120 /* Turn on led LD4 */ | |
121 STM_EVAL_LEDOn(LED4); | |
122 } | |
123 else | |
124 { | |
125 /* Turn on led LD2 */ | |
126 STM_EVAL_LEDOn(LED2); | |
127 } | |
128 | |
129 /* Infinite loop */ | |
130 while (1) | |
131 { | |
132 } | |
133 } | |
134 | |
135 /** | |
136 * @brief Configures the CAN, transmit and receive by polling | |
137 * @param None | |
138 * @retval PASSED if the reception is well done, FAILED in other case | |
139 */ | |
140 TestStatus CAN_Polling(void) | |
141 { | |
142 CAN_InitTypeDef CAN_InitStructure; | |
143 CAN_FilterInitTypeDef CAN_FilterInitStructure; | |
144 CanTxMsg TxMessage; | |
145 CanRxMsg RxMessage; | |
146 uint32_t i = 0; | |
147 uint8_t TransmitMailbox = 0; | |
148 | |
149 /* CAN register init */ | |
150 CAN_DeInit(CANx); | |
151 | |
152 CAN_StructInit(&CAN_InitStructure); | |
153 | |
154 /* CAN cell init */ | |
155 CAN_InitStructure.CAN_TTCM=DISABLE; | |
156 CAN_InitStructure.CAN_ABOM=DISABLE; | |
157 CAN_InitStructure.CAN_AWUM=DISABLE; | |
158 CAN_InitStructure.CAN_NART=DISABLE; | |
159 CAN_InitStructure.CAN_RFLM=DISABLE; | |
160 CAN_InitStructure.CAN_TXFP=DISABLE; | |
161 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; | |
162 | |
163 /* Baudrate = 125kbps*/ | |
164 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; | |
165 CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; | |
166 CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; | |
167 CAN_InitStructure.CAN_Prescaler=48; | |
168 CAN_Init(CANx, &CAN_InitStructure); | |
169 | |
170 /* CAN filter init */ | |
171 #ifdef __CAN1_USED__ | |
172 CAN_FilterInitStructure.CAN_FilterNumber=0; | |
173 #else /*__CAN2_USED__*/ | |
174 CAN_FilterInitStructure.CAN_FilterNumber=14; | |
175 #endif /* __CAN1_USED__ */ | |
176 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; | |
177 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; | |
178 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; | |
179 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; | |
180 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; | |
181 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; | |
182 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; | |
183 | |
184 | |
185 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; | |
186 CAN_FilterInit(&CAN_FilterInitStructure); | |
187 | |
188 /* transmit */ | |
189 TxMessage.StdId=0x11; | |
190 TxMessage.RTR=CAN_RTR_DATA; | |
191 TxMessage.IDE=CAN_ID_STD; | |
192 TxMessage.DLC=2; | |
193 TxMessage.Data[0]=0xCA; | |
194 TxMessage.Data[1]=0xFE; | |
195 | |
196 TransmitMailbox=CAN_Transmit(CANx, &TxMessage); | |
197 i = 0; | |
198 while((CAN_TransmitStatus(CANx, TransmitMailbox) != CANTXOK) && (i != 0xFFFF)) | |
199 { | |
200 i++; | |
201 } | |
202 | |
203 i = 0; | |
204 while((CAN_MessagePending(CANx, CAN_FIFO0) < 1) && (i != 0xFFFF)) | |
205 { | |
206 i++; | |
207 } | |
208 | |
209 /* receive */ | |
210 RxMessage.StdId=0x00; | |
211 RxMessage.IDE=CAN_ID_STD; | |
212 RxMessage.DLC=0; | |
213 RxMessage.Data[0]=0x00; | |
214 RxMessage.Data[1]=0x00; | |
215 CAN_Receive(CANx, CAN_FIFO0, &RxMessage); | |
216 | |
217 if (RxMessage.StdId!=0x11) | |
218 { | |
219 return FAILED; | |
220 } | |
221 | |
222 if (RxMessage.IDE!=CAN_ID_STD) | |
223 { | |
224 return FAILED; | |
225 } | |
226 | |
227 if (RxMessage.DLC!=2) | |
228 { | |
229 return FAILED; | |
230 } | |
231 | |
232 if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) | |
233 { | |
234 return FAILED; | |
235 } | |
236 | |
237 return PASSED; /* Test Passed */ | |
238 } | |
239 | |
240 /** | |
241 * @brief Configures the CAN, transmit and receive using interrupt. | |
242 * @param None | |
243 * @retval PASSED if the reception is well done, FAILED in other case | |
244 */ | |
245 TestStatus CAN_Interrupt(void) | |
246 { | |
247 CAN_InitTypeDef CAN_InitStructure; | |
248 CAN_FilterInitTypeDef CAN_FilterInitStructure; | |
249 CanTxMsg TxMessage; | |
250 uint32_t i = 0; | |
251 | |
252 /* CAN register init */ | |
253 CAN_DeInit(CANx); | |
254 | |
255 | |
256 CAN_StructInit(&CAN_InitStructure); | |
257 | |
258 /* CAN cell init */ | |
259 CAN_InitStructure.CAN_TTCM=DISABLE; | |
260 CAN_InitStructure.CAN_ABOM=DISABLE; | |
261 CAN_InitStructure.CAN_AWUM=DISABLE; | |
262 CAN_InitStructure.CAN_NART=DISABLE; | |
263 CAN_InitStructure.CAN_RFLM=DISABLE; | |
264 CAN_InitStructure.CAN_TXFP=DISABLE; | |
265 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; | |
266 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; | |
267 | |
268 /* Baudrate = 500 Kbps */ | |
269 CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; | |
270 CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; | |
271 CAN_InitStructure.CAN_Prescaler=12; | |
272 CAN_Init(CANx, &CAN_InitStructure); | |
273 | |
274 /* CAN filter init */ | |
275 #ifdef __CAN1_USED__ | |
276 CAN_FilterInitStructure.CAN_FilterNumber=1; | |
277 #else /*__CAN2_USED__*/ | |
278 CAN_FilterInitStructure.CAN_FilterNumber=15; | |
279 #endif /* __CAN1_USED__ */ | |
280 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; | |
281 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; | |
282 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; | |
283 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; | |
284 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; | |
285 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; | |
286 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; | |
287 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; | |
288 CAN_FilterInit(&CAN_FilterInitStructure); | |
289 | |
290 /* CAN FIFO0 message pending interrupt enable */ | |
291 CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE); | |
292 | |
293 /* transmit 1 message */ | |
294 TxMessage.StdId=0; | |
295 TxMessage.ExtId=0x1234; | |
296 TxMessage.IDE=CAN_ID_EXT; | |
297 TxMessage.RTR=CAN_RTR_DATA; | |
298 TxMessage.DLC=2; | |
299 TxMessage.Data[0]=0xDE; | |
300 TxMessage.Data[1]=0xCA; | |
301 CAN_Transmit(CANx, &TxMessage); | |
302 | |
303 /* initialize the value that will be returned */ | |
304 ret = 0xFF; | |
305 | |
306 /* receive message with interrupt handling */ | |
307 i=0; | |
308 while((ret == 0xFF) && (i < 0xFFF)) | |
309 { | |
310 i++; | |
311 } | |
312 | |
313 if (i == 0xFFF) | |
314 { | |
315 ret=0; | |
316 } | |
317 | |
318 /* disable interrupt handling */ | |
319 CAN_ITConfig(CANx, CAN_IT_FMP0, DISABLE); | |
320 | |
321 return (TestStatus)ret; | |
322 } | |
323 | |
324 /** | |
325 * @brief Configures the NVIC and Vector Table base address. | |
326 * @param None | |
327 * @retval None | |
328 */ | |
329 void NVIC_Configuration(void) | |
330 { | |
331 NVIC_InitTypeDef NVIC_InitStructure; | |
332 | |
333 /* Enable CANx RX0 interrupt IRQ channel */ | |
334 #ifndef STM32F10X_CL | |
335 | |
336 #ifdef __CAN1_USED__ | |
337 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; | |
338 #else /*__CAN2_USED__*/ | |
339 /* CAN2 is not implemented in the device */ | |
340 #error "CAN2 is implemented only in Connectivity line devices" | |
341 | |
342 #endif /*__CAN1_USED__*/ | |
343 #else | |
344 #ifdef __CAN1_USED__ | |
345 NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; | |
346 #else /*__CAN2_USED__*/ | |
347 NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; | |
348 #endif /*__CAN1_USED__*/ | |
349 | |
350 #endif /* STM32F10X_CL*/ | |
351 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; | |
352 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; | |
353 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; | |
354 NVIC_Init(&NVIC_InitStructure); | |
355 } | |
356 | |
357 | |
358 #ifdef USE_FULL_ASSERT | |
359 | |
360 /** | |
361 * @brief Reports the name of the source file and the source line number | |
362 * where the assert_param error has occurred. | |
363 * @param file: pointer to the source file name | |
364 * @param line: assert_param error line source number | |
365 * @retval None | |
366 */ | |
367 void assert_failed(uint8_t* file, uint32_t line) | |
368 { | |
369 /* User can add his own implementation to report the file name and line number, | |
370 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
371 | |
372 /* Infinite loop */ | |
373 while (1) | |
374 { | |
375 } | |
376 } | |
377 | |
378 #endif | |
379 | |
380 /** | |
381 * @} | |
382 */ | |
383 | |
384 /** | |
385 * @} | |
386 */ | |
387 | |
388 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ |