1 | #include "main.h"
|
2 | #include "stm32f4xx_gpio.h"
|
3 | #include "stm32f4xx_rcc.h"
|
4 | #include "stm32f4xx_tim.h"
|
5 | #include "stm32f4xx_spi.h"
|
6 | #include "stm32f4xx_exti.h"
|
7 | #include "stm32f4xx_can.h"
|
8 | #include "misc.h"
|
9 |
|
10 | void Delay(volatile uint32_t nCount) {
|
11 | while(nCount--);
|
12 | }
|
13 |
|
14 | int main(void)
|
15 | {
|
16 | SystemInit(); // Activate Oscillator Settings (SysClk = 168MHz, AHB1 = APB2 = 84 MHz, APB1 = 42MHz)
|
17 |
|
18 | // Create InitStructures
|
19 | GPIO_InitTypeDef GPIO_InitStructure[3];
|
20 | CAN_InitTypeDef CAN_InitStructure;
|
21 | NVIC_InitTypeDef NVIC_InitStructure[2];
|
22 | EXTI_InitTypeDef EXTI_InitStructure;
|
23 |
|
24 | // Enable Peripheral Clocks
|
25 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG, ENABLE);
|
26 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE);
|
27 |
|
28 | // Configure GPIOs
|
29 | GPIO_InitStructure[0].GPIO_Pin = GPIO_Pin_0;
|
30 | GPIO_InitStructure[0].GPIO_Mode = GPIO_Mode_IN;
|
31 | GPIO_InitStructure[0].GPIO_Speed = GPIO_Speed_100MHz;
|
32 | GPIO_InitStructure[0].GPIO_OType = GPIO_OType_PP;
|
33 | GPIO_InitStructure[0].GPIO_PuPd = GPIO_PuPd_NOPULL;
|
34 |
|
35 | GPIO_InitStructure[1].GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9;
|
36 | GPIO_InitStructure[1].GPIO_Mode = GPIO_Mode_AF;
|
37 | GPIO_InitStructure[1].GPIO_Speed = GPIO_Speed_100MHz;
|
38 | GPIO_InitStructure[1].GPIO_OType = GPIO_OType_PP;
|
39 | GPIO_InitStructure[1].GPIO_PuPd = GPIO_PuPd_NOPULL;
|
40 |
|
41 | GPIO_InitStructure[2].GPIO_Pin = GPIO_Pin_13;
|
42 | GPIO_InitStructure[2].GPIO_Mode = GPIO_Mode_OUT;
|
43 | GPIO_InitStructure[2].GPIO_Speed = GPIO_Speed_100MHz;
|
44 | GPIO_InitStructure[2].GPIO_OType = GPIO_OType_PP;
|
45 | GPIO_InitStructure[2].GPIO_PuPd = GPIO_PuPd_NOPULL;
|
46 |
|
47 | GPIO_Init(GPIOA, &GPIO_InitStructure[0]);
|
48 | GPIO_Init(GPIOB, &GPIO_InitStructure[1]);
|
49 | GPIO_Init(GPIOG, &GPIO_InitStructure[2]);
|
50 |
|
51 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
|
52 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
|
53 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_CAN1);
|
54 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1);
|
55 |
|
56 | // Configure CAN1,CAN2
|
57 | CAN_InitStructure.CAN_Prescaler = 9;
|
58 | CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
|
59 | CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq;
|
60 | CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;
|
61 | CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
|
62 | CAN_InitStructure.CAN_TTCM = DISABLE;
|
63 | CAN_InitStructure.CAN_ABOM = DISABLE;
|
64 | CAN_InitStructure.CAN_AWUM = DISABLE;
|
65 | CAN_InitStructure.CAN_NART = ENABLE;
|
66 | CAN_InitStructure.CAN_RFLM = DISABLE;
|
67 | CAN_InitStructure.CAN_TXFP = DISABLE;
|
68 |
|
69 | CAN_Init(CAN1, &CAN_InitStructure);
|
70 | CAN_Init(CAN2, &CAN_InitStructure);
|
71 |
|
72 | CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE); // CAN2 Interrupt on Message Reception at FIFO0
|
73 |
|
74 | // Configure NVCI for Interrupt on EXTI0
|
75 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
|
76 |
|
77 | NVIC_InitStructure[0].NVIC_IRQChannel = EXTI0_IRQn;
|
78 | NVIC_InitStructure[0].NVIC_IRQChannelCmd = ENABLE;
|
79 | NVIC_InitStructure[0].NVIC_IRQChannelPreemptionPriority = 0;
|
80 | NVIC_InitStructure[0].NVIC_IRQChannelSubPriority = 1;
|
81 |
|
82 | NVIC_InitStructure[1].NVIC_IRQChannel = CAN2_RX0_IRQn;
|
83 | NVIC_InitStructure[1].NVIC_IRQChannelCmd = ENABLE;
|
84 | NVIC_InitStructure[1].NVIC_IRQChannelPreemptionPriority = 0;
|
85 | NVIC_InitStructure[1].NVIC_IRQChannelSubPriority = 0;
|
86 |
|
87 | NVIC_Init(&NVIC_InitStructure[0]);
|
88 | NVIC_Init(&NVIC_InitStructure[1]);
|
89 |
|
90 | // Configure ExternalInterrupt for EXTI_Line0
|
91 |
|
92 | EXTI_InitStructure.EXTI_Line = EXTI_Line0;
|
93 | EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
94 | EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
|
95 | EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
96 | EXTI_Init(&EXTI_InitStructure);
|
97 |
|
98 | NVIC_EnableIRQ(EXTI0_IRQn); // Enable EXTI0 global Interrupt
|
99 | NVIC_EnableIRQ(CAN2_RX0_IRQn); // Enable CAN2 global Interrupt
|
100 |
|
101 | while(1) // Zum Debuggen dauerhaft CAN-Nachrichten schicken
|
102 | {
|
103 | CanTxMsg canMessage;
|
104 |
|
105 | canMessage.StdId = 0x000;
|
106 | canMessage.ExtId = 0;
|
107 | canMessage.RTR = CAN_RTR_DATA;
|
108 | canMessage.IDE = CAN_ID_STD;
|
109 | canMessage.DLC = 1;
|
110 | canMessage.Data[0] = 0xAA;
|
111 |
|
112 | CAN_Transmit(CAN1, &canMessage);
|
113 | }
|
114 | } // end main
|
115 |
|
116 | void EXTI0_IRQHandler(void)
|
117 | {
|
118 | EXTI_ClearITPendingBit(EXTI_Line0);
|
119 |
|
120 | // Create CAN TxMessage Structure
|
121 | CanTxMsg canMessage;
|
122 |
|
123 | canMessage.StdId = 0x000;
|
124 | canMessage.ExtId = 0;
|
125 | canMessage.RTR = CAN_RTR_DATA;
|
126 | canMessage.IDE = CAN_ID_STD;
|
127 | canMessage.DLC = 1;
|
128 | canMessage.Data[0] = 0xAA;
|
129 |
|
130 | CAN_Transmit(CAN1, &canMessage);
|
131 | }
|
132 |
|
133 | void CAN2_RX0_IRQHandler(void)
|
134 | {
|
135 | NVIC_ClearPendingIRQ(CAN2_RX0_IRQn);
|
136 | CanRxMsg RxMessage;
|
137 | CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);
|
138 | if(RxMessage.Data[0] == 0xAA)
|
139 | {
|
140 | GPIO_ToggleBits(GPIOG, GPIO_Pin_13);
|
141 | }
|
142 | }
|