Nuvoton
/
NuMaker-mbed-can
NUMAKER CAN sample
main.cpp@5:499978915868, 2018-04-19 (annotated)
- Committer:
- ccli8
- Date:
- Thu Apr 19 11:22:45 2018 +0800
- Revision:
- 5:499978915868
- Parent:
- 0:df0aeb0c8f2c
- Child:
- 6:b9714e564dee
Update to NuMaker-PFM-M487 V3.0 and Mbed OS 5.8.2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cyliang | 0:df0aeb0c8f2c | 1 | #include "cmsis_os.h" |
cyliang | 0:df0aeb0c8f2c | 2 | #include "mbed.h" |
cyliang | 0:df0aeb0c8f2c | 3 | #include "CAN.h" |
cyliang | 0:df0aeb0c8f2c | 4 | |
cyliang | 0:df0aeb0c8f2c | 5 | |
cyliang | 0:df0aeb0c8f2c | 6 | DigitalOut led1(LED1, 1); //LED R OFF |
cyliang | 0:df0aeb0c8f2c | 7 | DigitalOut led2(LED2, 1); //LED G OFF |
cyliang | 0:df0aeb0c8f2c | 8 | DigitalOut led3(LED3, 1); //LED B OFF |
cyliang | 0:df0aeb0c8f2c | 9 | |
cyliang | 0:df0aeb0c8f2c | 10 | #define CAN_TX_MODE_TEST 0 |
cyliang | 0:df0aeb0c8f2c | 11 | #define CAN_RX_MODE_TEST 1 |
cyliang | 0:df0aeb0c8f2c | 12 | #define CAN_RX_IRQ_EN 1 |
cyliang | 0:df0aeb0c8f2c | 13 | #define LED_ALL_OFF led1=led2=led3=1 |
cyliang | 0:df0aeb0c8f2c | 14 | |
cyliang | 0:df0aeb0c8f2c | 15 | #define MSG_NUM_INDEX 5 // 0 ~ 31 |
cyliang | 0:df0aeb0c8f2c | 16 | #define CAN_DEV_ID 0x1AC |
cyliang | 0:df0aeb0c8f2c | 17 | |
cyliang | 0:df0aeb0c8f2c | 18 | #if defined(TARGET_NUMAKER_PFM_NUC472) |
ccli8 |
5:499978915868 | 19 | CAN canObj(PA_0, PA_1); // Internal in the board |
cyliang | 0:df0aeb0c8f2c | 20 | #elif defined(TARGET_NUMAKER_PFM_M453) |
ccli8 |
5:499978915868 | 21 | CAN canObj(PA_13, PA_12); // Internal in the board |
ccli8 |
5:499978915868 | 22 | #elif defined(TARGET_NUMAKER_PFM_M487) |
ccli8 |
5:499978915868 | 23 | CAN canObj(D9, D8); // Change to match external attachment |
cyliang | 0:df0aeb0c8f2c | 24 | #endif |
cyliang | 0:df0aeb0c8f2c | 25 | |
cyliang | 0:df0aeb0c8f2c | 26 | CANMessage canMsg; |
cyliang | 0:df0aeb0c8f2c | 27 | |
cyliang | 0:df0aeb0c8f2c | 28 | osThreadId mainThreadID; |
cyliang | 0:df0aeb0c8f2c | 29 | |
cyliang | 0:df0aeb0c8f2c | 30 | static int read_MsgObj() |
cyliang | 0:df0aeb0c8f2c | 31 | { |
cyliang | 0:df0aeb0c8f2c | 32 | int i=0; |
cyliang | 0:df0aeb0c8f2c | 33 | |
cyliang | 0:df0aeb0c8f2c | 34 | i = canObj.read(canMsg, MSG_NUM_INDEX); |
cyliang | 0:df0aeb0c8f2c | 35 | |
cyliang | 0:df0aeb0c8f2c | 36 | switch (canMsg.data[0]) |
cyliang | 0:df0aeb0c8f2c | 37 | { |
cyliang | 0:df0aeb0c8f2c | 38 | case 0: |
cyliang | 0:df0aeb0c8f2c | 39 | LED_ALL_OFF; |
cyliang | 0:df0aeb0c8f2c | 40 | led1=0; |
cyliang | 0:df0aeb0c8f2c | 41 | break; |
cyliang | 0:df0aeb0c8f2c | 42 | |
cyliang | 0:df0aeb0c8f2c | 43 | case 1: |
cyliang | 0:df0aeb0c8f2c | 44 | LED_ALL_OFF; |
cyliang | 0:df0aeb0c8f2c | 45 | led2=0; |
cyliang | 0:df0aeb0c8f2c | 46 | break; |
cyliang | 0:df0aeb0c8f2c | 47 | |
cyliang | 0:df0aeb0c8f2c | 48 | case 2: |
cyliang | 0:df0aeb0c8f2c | 49 | LED_ALL_OFF; |
cyliang | 0:df0aeb0c8f2c | 50 | led3=0; |
cyliang | 0:df0aeb0c8f2c | 51 | break; |
cyliang | 0:df0aeb0c8f2c | 52 | |
cyliang | 0:df0aeb0c8f2c | 53 | default: |
cyliang | 0:df0aeb0c8f2c | 54 | LED_ALL_OFF; |
cyliang | 0:df0aeb0c8f2c | 55 | break; |
cyliang | 0:df0aeb0c8f2c | 56 | } |
cyliang | 0:df0aeb0c8f2c | 57 | |
cyliang | 0:df0aeb0c8f2c | 58 | return i; |
cyliang | 0:df0aeb0c8f2c | 59 | } |
cyliang | 0:df0aeb0c8f2c | 60 | |
cyliang | 0:df0aeb0c8f2c | 61 | void irq_callback(void) |
cyliang | 0:df0aeb0c8f2c | 62 | { |
cyliang | 0:df0aeb0c8f2c | 63 | if(read_MsgObj() ) |
cyliang | 0:df0aeb0c8f2c | 64 | osSignalSet(mainThreadID, 0x06); |
cyliang | 0:df0aeb0c8f2c | 65 | } |
cyliang | 0:df0aeb0c8f2c | 66 | |
cyliang | 0:df0aeb0c8f2c | 67 | int main() { |
cyliang | 0:df0aeb0c8f2c | 68 | int i=0; |
cyliang | 0:df0aeb0c8f2c | 69 | char data[8]={0}; |
cyliang | 0:df0aeb0c8f2c | 70 | |
cyliang | 0:df0aeb0c8f2c | 71 | mainThreadID = osThreadGetId(); |
cyliang | 0:df0aeb0c8f2c | 72 | |
cyliang | 0:df0aeb0c8f2c | 73 | /* Set Frequency 1khz~1000khz */ |
cyliang | 0:df0aeb0c8f2c | 74 | canObj.frequency(1000000); |
cyliang | 0:df0aeb0c8f2c | 75 | |
cyliang | 0:df0aeb0c8f2c | 76 | #if CAN_RX_MODE_TEST |
cyliang | 0:df0aeb0c8f2c | 77 | |
cyliang | 0:df0aeb0c8f2c | 78 | #if CAN_RX_IRQ_EN |
cyliang | 0:df0aeb0c8f2c | 79 | /* Attach irq function */ |
cyliang | 0:df0aeb0c8f2c | 80 | canObj.attach(irq_callback, CAN::RxIrq); |
cyliang | 0:df0aeb0c8f2c | 81 | #endif |
cyliang | 0:df0aeb0c8f2c | 82 | |
cyliang | 0:df0aeb0c8f2c | 83 | canObj.filter(CAN_DEV_ID, 0, CANStandard, MSG_NUM_INDEX); |
cyliang | 0:df0aeb0c8f2c | 84 | |
cyliang | 0:df0aeb0c8f2c | 85 | #endif |
cyliang | 0:df0aeb0c8f2c | 86 | |
cyliang | 0:df0aeb0c8f2c | 87 | while (true) |
cyliang | 0:df0aeb0c8f2c | 88 | { |
cyliang | 0:df0aeb0c8f2c | 89 | |
cyliang | 0:df0aeb0c8f2c | 90 | |
cyliang | 0:df0aeb0c8f2c | 91 | #if CAN_TX_MODE_TEST |
cyliang | 0:df0aeb0c8f2c | 92 | |
cyliang | 0:df0aeb0c8f2c | 93 | canObj.write(CANMessage(CAN_DEV_ID, data)); |
cyliang | 0:df0aeb0c8f2c | 94 | |
cyliang | 0:df0aeb0c8f2c | 95 | if(data[0] == 2) |
cyliang | 0:df0aeb0c8f2c | 96 | data[0]=0; |
cyliang | 0:df0aeb0c8f2c | 97 | else |
cyliang | 0:df0aeb0c8f2c | 98 | data[0]++; |
cyliang | 0:df0aeb0c8f2c | 99 | |
cyliang | 0:df0aeb0c8f2c | 100 | memset(&data[1], data[0], 7); |
cyliang | 0:df0aeb0c8f2c | 101 | wait(1); |
cyliang | 0:df0aeb0c8f2c | 102 | |
cyliang | 0:df0aeb0c8f2c | 103 | #endif |
cyliang | 0:df0aeb0c8f2c | 104 | |
cyliang | 0:df0aeb0c8f2c | 105 | #if CAN_RX_MODE_TEST |
cyliang | 0:df0aeb0c8f2c | 106 | |
cyliang | 0:df0aeb0c8f2c | 107 | #if (CAN_RX_IRQ_EN) // interrupt mode |
cyliang | 0:df0aeb0c8f2c | 108 | /* Wait for receive task to wakeup */ |
cyliang | 0:df0aeb0c8f2c | 109 | osSignalWait(0x06, osWaitForever); |
cyliang | 0:df0aeb0c8f2c | 110 | #else // pooling mode |
cyliang | 0:df0aeb0c8f2c | 111 | if( !read_MsgObj() ) continue; |
cyliang | 0:df0aeb0c8f2c | 112 | #endif |
cyliang | 0:df0aeb0c8f2c | 113 | |
cyliang | 0:df0aeb0c8f2c | 114 | printf("Read ID=%8X, Type=%s, DLC=%d,Data=",canMsg.id,canMsg.format?"EXT":"STD",canMsg.len); |
cyliang | 0:df0aeb0c8f2c | 115 | for(i=0; i<canMsg.len; i++) |
cyliang | 0:df0aeb0c8f2c | 116 | printf("%02X,",canMsg.data[i]); |
cyliang | 0:df0aeb0c8f2c | 117 | printf("\r\n"); |
cyliang | 0:df0aeb0c8f2c | 118 | #endif |
cyliang | 0:df0aeb0c8f2c | 119 | } |
cyliang | 0:df0aeb0c8f2c | 120 | |
cyliang | 0:df0aeb0c8f2c | 121 | } |