Controller Area Network library for NUCLEO boards equipped with CAN peripheral.

Dependents:   Nucleo-Courtois CANBLE CANnucleo_Hello3 Nucleo_Serialprintf ... more

Controller Area Network library for the NUCLEO and DISCOVERY boards equipped with CAN peripheral


Information

Because CAN support has been finally implemented into the mbed library also for the ST boards there is no need to use the CANnucleo library anymore (however you may if you want). The CAN_Hello example is trying to demonstrate the mbed built-in CAN API with NUCLEO boards.


Provides CAN support for the following boards:

with the following features:

  • Easy to use. Delete the mbed library from your project and import the latest mbed-dev and CANnucleo libraries. In the mbed-dev library open the device.h file associated with the selected target board and add #undef DEVICE_CAN as follows:

device.h

#ifndef MBED_DEVICE_H
#define MBED_DEVICE_H

//=======================================
#define DEVICE_ID_LENGTH       24

#undef DEVICE_CAN

#include "objects.h"

#endif

See the CANnucleo_Hello demo for more details.

  • Automatic recovery from bus-off state can be enabled/disabled in the constructor (defaults to ENABLE).
  • Up to 14 filters (0 - 13) are available for the application to set up for message filtering performed by hardware.
    For more details see below or have a look at the comments in CANnucleo.cpp.
  • One CAN channel per NUCLEO board is supported. The CAN peripheral can be connected either to pins PA_11, PA_12 (Receiver, Transmitter) or to pins PB_8, PB_9 (Receiver, Transmitter). This is configured when creating a CAN instance.
  • Simplifies adding/getting data to/from a CAN message by using the << (append) and the >> (extract) operators.

Import programCANnucleo_Hello

Using CAN bus with NUCLEO boards (Demo for the CANnucleo library).



Filtering performed by the built-in CAN controller without disturbing the CPU

CANnucleo supports only mask mode and 32-bit filter scale. Identifier list mode filtering and 16-bit filter scale are not supported. There are 14 filters available (0 - 13) for the application to set up. Each filter is a 32-bit filter defined by a filter ID and a filter mask. If no filter is set up then no CAN message is accepted! That's why filter #0 is set up in the constructor to accept all CAN messages by default. On reception of a message it is compared with filter #0. If there is a match, the message is accepted and stored. If there is no match, the incoming identifier is then compared with the next filter. If the received identifier does not match any of the identifiers configured in the filters, the message is discarded by hardware without disturbing the software.

CAN filter function - designed to setup a CAN filter

int CAN::filter(unsigned int id, unsigned int mask, CANFormat format, int handle)

Parameters

id - 'Filter ID' defines the bit values to be compared with the corresponding received bits.

Mapping of 32-bits (4-bytes) :

STID[10:3]STID[2:0] EXID[17:13]EXID[12:5]EXID[4:0] IDE RTR 0
  • STID - Stardard Identifier bits
  • EXID - Extended Identifier bits
  • [x:y]- bit range
  • IDE - Identifier Extension bit (0 -> Standard Identifier, 1 -> Extended Identifier)
  • RTR - Remote Transmission Request bit (0 -> Remote Transmission Request, 1 -> Standard message)

mask - 'Filter mask' defines which bits of the 'Filter ID' are compared with the received bits and which are disregarded.
Mapping of 32-bits (4-bytes) :

STID[10:3]STID[2:0] EXID[17:13]EXID[12:5]EXID[4:0] IDE RTR 0
  • STID - Stardard Identifier bits
  • EXID - Extended Identifier bits
  • [x:y]- bit range
  • IDE - Identifier Extension bit
  • RTR - Remote Transmission Request bit
  • 1 -> bit is considered
  • 0 -> bit is disregarded

format - This parameter must be CANAny
handle - Selects the filter. This parameter must be a number between 0 and 13.
retval - 0 - successful, 1 - error, 2 - busy, 3 - time out

Example of filter set up and filtering

Let's assume we would like to accept only messages with standard identifier 0x207:

STID[15:0] = 0x207 = 00000010 00000111


We map the STID to filter ID by shifting the bits adequately:

Filter ID = STID << (16 + (15 - 10)) = STID << 21 = 01000000 11100000 00000000 00000000


To compare only the bits representing STID we set the filter mask appropriately:

Filter mask = 11111111 11100000 00000000 00000100 = 0xFFE00004
              |||||||| |||                    |
              -------- ---                    |
                  |     |                     |
           STID[10:3]  STID[2:0]             IDE


Recall that filter #0 has been set up in the constructor to accept all CAN messages by default. So we have to reconfigure it. If we were set up filter #1 here then filter #0 would accept all the messages and no message would reach filter #1!
To reconfigure (set up) filter #0 we call:

can.filter(0x207 << 21, 0xFFE00004, CANAny, 0);


            Only these bits of 'Filter id' (set to 1 here in 'Filter mask') are compared 
            with the corresponding bits of received message (the others are disregarded)
                                |
                 ---------------------------------
                 |||||||| |||                    |
   Filter mask = 11111111 11100000 00000000 00000100 (= 0xFFE00004)
   Filter id   = 01000000 11100000 00000000 00000000 (= 0x40E00000)
                 |||||||| |||                    |
                 ---------------------------------
                                |
            To accept the message the values of these bits must match.
            Otherwise the message is passed to the next filter or
            discarded if this was the last active filter.
                                |
                 ---------------------------------
                 |||||||| |||                    |
   Received id = 01000000 11100000 00000000 00000010 (= 0x40E00002)
                             ||||| |||||||| ||||| ||
                             -----------------------
                                         |
                          These bits (set to 0 in 'Filter mask') are disregarded (masked).
                          They can have arbitrary values.


NOTE: For the meaning of individual bits see the mapping of 32-bits explained above.

We can use the filter function to setup more (up to 14) CAN filters for example as follows:

can.filter(0x207 << 21, 0xFFE00004, CANAny, 0);    // filter #0
can.filter(0x251 << 21, 0xFFE00004, CANAny, 1);    // filter #1
can.filter(0x304 << 21, 0xFFE00004, CANAny, 2);    // filter #2
...
Committer:
hudakz
Date:
Tue Dec 22 18:19:16 2015 +0000
Revision:
11:439f3a34c42e
Parent:
10:227a455d0f9f
Child:
14:0344705e6fb8
Support for NUCLEO-F303RE added.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:e29bc8e0dddd 1 /* mbed Microcontroller Library
hudakz 0:e29bc8e0dddd 2 * Copyright (c) 2006-2013 ARM Limited
hudakz 0:e29bc8e0dddd 3 *
hudakz 0:e29bc8e0dddd 4 * Licensed under the Apache License, Version 2.0 (the "License");
hudakz 0:e29bc8e0dddd 5 * you may not use this file except in compliance with the License.
hudakz 0:e29bc8e0dddd 6 * You may obtain a copy of the License at
hudakz 0:e29bc8e0dddd 7 *
hudakz 0:e29bc8e0dddd 8 * http://www.apache.org/licenses/LICENSE-2.0
hudakz 0:e29bc8e0dddd 9 *
hudakz 0:e29bc8e0dddd 10 * Unless required by applicable law or agreed to in writing, software
hudakz 0:e29bc8e0dddd 11 * distributed under the License is distributed on an "AS IS" BASIS,
hudakz 0:e29bc8e0dddd 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hudakz 0:e29bc8e0dddd 13 * See the License for the specific language governing permissions and
hudakz 0:e29bc8e0dddd 14 * limitations under the License.
hudakz 0:e29bc8e0dddd 15 *
hudakz 0:e29bc8e0dddd 16 * Modified by Zoltan Hudak <hudakz@inbox.com>
hudakz 0:e29bc8e0dddd 17 *
hudakz 0:e29bc8e0dddd 18 */
hudakz 0:e29bc8e0dddd 19 #include "CAN.h"
hudakz 0:e29bc8e0dddd 20 #include "cmsis.h"
hudakz 0:e29bc8e0dddd 21
hudakz 0:e29bc8e0dddd 22 namespace mbed
hudakz 0:e29bc8e0dddd 23 {
hudakz 0:e29bc8e0dddd 24
hudakz 0:e29bc8e0dddd 25 /**
hudakz 6:c5a40d5fd9f1 26 * @brief Constructor
hudakz 6:c5a40d5fd9f1 27 * @note Constructs an instance of CAN class
hudakz 6:c5a40d5fd9f1 28 * @param rxPin: CAN Rx pin name
hudakz 6:c5a40d5fd9f1 29 * @param txPin: CAN Tx pin name
hudakz 6:c5a40d5fd9f1 30 * @param abom: Automatic recovery from bus-off state (defaults to enabled)
hudakz 0:e29bc8e0dddd 31 * @retval
hudakz 0:e29bc8e0dddd 32 */
hudakz 6:c5a40d5fd9f1 33 CAN::CAN(PinName rxPin, PinName txPin, FunctionalState abom /* = ENABLE */) :
hudakz 0:e29bc8e0dddd 34 _can(),
hudakz 0:e29bc8e0dddd 35 _irq() {
hudakz 6:c5a40d5fd9f1 36 can_init(&_can, rxPin, txPin, abom);
hudakz 0:e29bc8e0dddd 37 can_irq_init(&_can, (&CAN::_irq_handler), (uint32_t)this);
hudakz 0:e29bc8e0dddd 38 }
hudakz 0:e29bc8e0dddd 39
hudakz 0:e29bc8e0dddd 40 /**
hudakz 0:e29bc8e0dddd 41 * @brief
hudakz 0:e29bc8e0dddd 42 * @note
hudakz 0:e29bc8e0dddd 43 * @param
hudakz 0:e29bc8e0dddd 44 * @retval
hudakz 0:e29bc8e0dddd 45 */
hudakz 0:e29bc8e0dddd 46 CAN::~CAN(void) {
hudakz 0:e29bc8e0dddd 47 can_irq_free(&_can);
hudakz 0:e29bc8e0dddd 48 can_free(&_can);
hudakz 0:e29bc8e0dddd 49 }
hudakz 0:e29bc8e0dddd 50
hudakz 0:e29bc8e0dddd 51 /**
hudakz 0:e29bc8e0dddd 52 * @brief
hudakz 0:e29bc8e0dddd 53 * @note
hudakz 0:e29bc8e0dddd 54 * @param
hudakz 0:e29bc8e0dddd 55 * @retval
hudakz 0:e29bc8e0dddd 56 */
hudakz 0:e29bc8e0dddd 57 int CAN::frequency(int f) {
hudakz 0:e29bc8e0dddd 58 return can_frequency(&_can, f);
hudakz 0:e29bc8e0dddd 59 }
hudakz 0:e29bc8e0dddd 60
hudakz 0:e29bc8e0dddd 61 /**
hudakz 0:e29bc8e0dddd 62 * @brief
hudakz 0:e29bc8e0dddd 63 * @note
hudakz 0:e29bc8e0dddd 64 * @param
hudakz 0:e29bc8e0dddd 65 * @retval
hudakz 0:e29bc8e0dddd 66 */
hudakz 0:e29bc8e0dddd 67 int CAN::write(CANMessage msg) {
hudakz 0:e29bc8e0dddd 68 return can_write(&_can, msg, 0);
hudakz 0:e29bc8e0dddd 69 }
hudakz 0:e29bc8e0dddd 70
hudakz 0:e29bc8e0dddd 71 /**
hudakz 0:e29bc8e0dddd 72 * @brief
hudakz 0:e29bc8e0dddd 73 * @note
hudakz 0:e29bc8e0dddd 74 * @param
hudakz 0:e29bc8e0dddd 75 * @retval
hudakz 0:e29bc8e0dddd 76 */
hudakz 0:e29bc8e0dddd 77 int CAN::read(CANMessage& msg, int handle) {
hudakz 0:e29bc8e0dddd 78 return can_read(&_can, &msg, handle);
hudakz 0:e29bc8e0dddd 79 }
hudakz 0:e29bc8e0dddd 80
hudakz 0:e29bc8e0dddd 81 /**
hudakz 0:e29bc8e0dddd 82 * @brief
hudakz 0:e29bc8e0dddd 83 * @note
hudakz 0:e29bc8e0dddd 84 * @param
hudakz 0:e29bc8e0dddd 85 * @retval
hudakz 0:e29bc8e0dddd 86 */
hudakz 0:e29bc8e0dddd 87 void CAN::reset(void) {
hudakz 0:e29bc8e0dddd 88 can_reset(&_can);
hudakz 0:e29bc8e0dddd 89 }
hudakz 0:e29bc8e0dddd 90
hudakz 0:e29bc8e0dddd 91 /**
hudakz 0:e29bc8e0dddd 92 * @brief
hudakz 0:e29bc8e0dddd 93 * @note
hudakz 0:e29bc8e0dddd 94 * @param
hudakz 0:e29bc8e0dddd 95 * @retval
hudakz 0:e29bc8e0dddd 96 */
hudakz 0:e29bc8e0dddd 97 unsigned char CAN::rderror(void) {
hudakz 0:e29bc8e0dddd 98 return can_rderror(&_can);
hudakz 0:e29bc8e0dddd 99 }
hudakz 0:e29bc8e0dddd 100
hudakz 0:e29bc8e0dddd 101 /**
hudakz 0:e29bc8e0dddd 102 * @brief
hudakz 0:e29bc8e0dddd 103 * @note
hudakz 0:e29bc8e0dddd 104 * @param
hudakz 0:e29bc8e0dddd 105 * @retval
hudakz 0:e29bc8e0dddd 106 */
hudakz 0:e29bc8e0dddd 107 unsigned char CAN::tderror(void) {
hudakz 0:e29bc8e0dddd 108 return can_tderror(&_can);
hudakz 0:e29bc8e0dddd 109 }
hudakz 0:e29bc8e0dddd 110
hudakz 0:e29bc8e0dddd 111 /**
hudakz 0:e29bc8e0dddd 112 * @brief
hudakz 0:e29bc8e0dddd 113 * @note
hudakz 0:e29bc8e0dddd 114 * @param
hudakz 0:e29bc8e0dddd 115 * @retval
hudakz 0:e29bc8e0dddd 116 */
hudakz 0:e29bc8e0dddd 117 void CAN::monitor(bool silent) {
hudakz 0:e29bc8e0dddd 118 can_monitor(&_can, (silent) ? 1 : 0);
hudakz 0:e29bc8e0dddd 119 }
hudakz 0:e29bc8e0dddd 120
hudakz 0:e29bc8e0dddd 121 /**
hudakz 0:e29bc8e0dddd 122 * @brief
hudakz 0:e29bc8e0dddd 123 * @note
hudakz 0:e29bc8e0dddd 124 * @param
hudakz 0:e29bc8e0dddd 125 * @retval
hudakz 0:e29bc8e0dddd 126 */
hudakz 0:e29bc8e0dddd 127 int CAN::mode(Mode mode) {
hudakz 0:e29bc8e0dddd 128 return can_mode(&_can, (CanMode) mode);
hudakz 0:e29bc8e0dddd 129 }
hudakz 0:e29bc8e0dddd 130
hudakz 0:e29bc8e0dddd 131 /**
hudakz 9:e9224f2c6d37 132 * @brief Sets up a CAN filter
hudakz 8:5c90d6b9a382 133 * @note At the present, CANnucleo supports only mask mode and 32-bit filter scale.
hudakz 8:5c90d6b9a382 134 * Identifier list mode filtering and 16-bit filter scale are not supported.
hudakz 9:e9224f2c6d37 135 * There are 14 filters available (0 - 13) for the application to set up.
hudakz 8:5c90d6b9a382 136 * Each filter is a 32-bit filter defined by a filter ID and a filter mask.
hudakz 9:e9224f2c6d37 137 * If no filter is set up then no CAN message is accepted (received)!
hudakz 9:e9224f2c6d37 138 * That's why filter #0 is set up in the constructor to receive all CAN messages by default.
hudakz 8:5c90d6b9a382 139 * On reception of a message it is compared with filter #0. If there is a match, the message is stored.
hudakz 8:5c90d6b9a382 140 * If there is no match, the incoming identifier is then compared with the next filter.
hudakz 8:5c90d6b9a382 141 * If the received identifier does not match any of the identifiers configured in the filters,
hudakz 8:5c90d6b9a382 142 * the message is discarded by hardware without disturbing the software.
hudakz 8:5c90d6b9a382 143 *
hudakz 8:5c90d6b9a382 144 * @param id: 'Filter ID' defines the bit values to be compared with the corresponding received bits
hudakz 8:5c90d6b9a382 145 *
hudakz 8:5c90d6b9a382 146 * Mapping of 32-bits (4-bytes) : | STID[10:3] | STID[2:0] EXID[17:13] | EXID[12:5] | EXID[4:0] IDE RTR 0 |
hudakz 8:5c90d6b9a382 147 *
hudakz 8:5c90d6b9a382 148 * STID - Stardard Identifier bits
hudakz 8:5c90d6b9a382 149 * EXID - Extended Identifier bits
hudakz 8:5c90d6b9a382 150 * [x:y]- bit range
hudakz 8:5c90d6b9a382 151 * IDE - Identifier Extension bit (0 -> Standard Identifier, 1 -> Extended Identifier)
hudakz 9:e9224f2c6d37 152 * RTR - Remote Transmission Request bit (0 -> Remote Transmission Request, 1 -> Standard message)
hudakz 8:5c90d6b9a382 153 *
hudakz 8:5c90d6b9a382 154 * @param mask: 'Filter mask' defines which bits of the 'Filter ID' are compared with the received bits
hudakz 8:5c90d6b9a382 155 * and which bits are disregarded.
hudakz 8:5c90d6b9a382 156
hudakz 8:5c90d6b9a382 157 * Mapping of 32-bits (4-bytes) : | STID[10:3] | STID[2:0] EXID[17:13] | EXID[12:5] | EXID[4:0] IDE RTR 0 |
hudakz 8:5c90d6b9a382 158 *
hudakz 8:5c90d6b9a382 159 * STID - Stardard Identifier bits
hudakz 8:5c90d6b9a382 160 * EXID - Extended Identifier bits
hudakz 8:5c90d6b9a382 161 * [x:y]- bit range
hudakz 8:5c90d6b9a382 162 * IDE - Identifier Extension bit
hudakz 8:5c90d6b9a382 163 * RTR - Remote Transmission Request bit
hudakz 8:5c90d6b9a382 164 *
hudakz 10:227a455d0f9f 165 * 1 -> bit is considered
hudakz 10:227a455d0f9f 166 * 0 -> bit is disregarded
hudakz 8:5c90d6b9a382 167 *
hudakz 10:227a455d0f9f 168 * ----------------------------------------
hudakz 10:227a455d0f9f 169 * Example of filter set up and filtering:
hudakz 10:227a455d0f9f 170 * ----------------------------------------
hudakz 10:227a455d0f9f 171 *
hudakz 10:227a455d0f9f 172 * Let's assume we would like to receive only messages
hudakz 10:227a455d0f9f 173 * with standard identifier STID = 0x0207 (STID[15:0] = 00000010 00000111)
hudakz 8:5c90d6b9a382 174 *
hudakz 8:5c90d6b9a382 175 * We map the STID to filter ID by shifting the bits appropriately:
hudakz 8:5c90d6b9a382 176 * Filter id = STID << (16 + (15 - 10)) = STID << 21 = 01000000 11100000 00000000 00000000 = 0x40E00000
hudakz 8:5c90d6b9a382 177 *
hudakz 8:5c90d6b9a382 178 * To compare only the bits representing STID we set the filter mask adequately:
hudakz 9:e9224f2c6d37 179 * Filter mask = 11111111 11100000 00000000 00000100 = 0xFFE00004
hudakz 8:5c90d6b9a382 180 *
hudakz 9:e9224f2c6d37 181 * Keep in mind that filter #0 was already set up in the constructor to receive all CAN messages by default.
hudakz 9:e9224f2c6d37 182 * So we have to reconfigure it. If we were set up filter #1 here then filter #0 would receive all the messages
hudakz 8:5c90d6b9a382 183 * and no message would reach filter #1!
hudakz 9:e9224f2c6d37 184 *
hudakz 9:e9224f2c6d37 185 * To set up filter #0 we call:
hudakz 9:e9224f2c6d37 186 * can.filter(0x0207 << 21, 0xFFE00004, CANAny, 0);
hudakz 8:5c90d6b9a382 187 *
hudakz 11:439f3a34c42e 188 * Only these bits of filter id are compared with the corresponding
hudakz 9:e9224f2c6d37 189 * bits of received message (the others are disregarded)
hudakz 11:439f3a34c42e 190 * |
hudakz 11:439f3a34c42e 191 * ---------------------------------
hudakz 11:439f3a34c42e 192 * |||||||| ||| |
hudakz 9:e9224f2c6d37 193 * Filter mask = 11111111 11100000 00000000 00000100 (= 0xFFE00004)
hudakz 9:e9224f2c6d37 194 * Filter id = 01000000 11100000 00000000 00000000 (= 0x40E00000)
hudakz 11:439f3a34c42e 195 * |||||||| ||| |
hudakz 11:439f3a34c42e 196 * ---------------------------------
hudakz 11:439f3a34c42e 197 * |
hudakz 11:439f3a34c42e 198 * To receive the message the values of these bits must match.
hudakz 11:439f3a34c42e 199 * Otherwise the message is passed to the next filter or
hudakz 9:e9224f2c6d37 200 * discarded if this was the last active filter.
hudakz 11:439f3a34c42e 201 * |
hudakz 11:439f3a34c42e 202 * ---------------------------------
hudakz 11:439f3a34c42e 203 * |||||||| ||| |
hudakz 9:e9224f2c6d37 204 * Received id = 01000000 11100000 00000000 00000010 (= 0x40E00002)
hudakz 11:439f3a34c42e 205 * ||||| |||||||| ||||| ||
hudakz 11:439f3a34c42e 206 * -----------------------
hudakz 11:439f3a34c42e 207 * |
hudakz 9:e9224f2c6d37 208 * These bits are disregarded (masked).
hudakz 9:e9224f2c6d37 209 * They can have arbitrary values.
hudakz 8:5c90d6b9a382 210 *
hudakz 8:5c90d6b9a382 211 * NOTE: For the meaning of individual bits see the mapping of 32-bits explained above.
hudakz 8:5c90d6b9a382 212 *
hudakz 9:e9224f2c6d37 213 * @param format: This parameter must be CANAny
hudakz 9:e9224f2c6d37 214 * @param handle: Selects the filter. This parameter must be a number between 0 and 13.
hudakz 9:e9224f2c6d37 215 * @param retval: 0 - successful
hudakz 9:e9224f2c6d37 216 * 1 - error
hudakz 9:e9224f2c6d37 217 * 2 - busy
hudakz 9:e9224f2c6d37 218 * 3 - time out
hudakz 0:e29bc8e0dddd 219 */
hudakz 8:5c90d6b9a382 220 int CAN::filter(unsigned int id, unsigned int mask, CANFormat format /* = CANAny */, int handle /* = 0 */) {
hudakz 0:e29bc8e0dddd 221 return can_filter(&_can, id, mask, format, handle);
hudakz 0:e29bc8e0dddd 222 }
hudakz 0:e29bc8e0dddd 223
hudakz 0:e29bc8e0dddd 224 /**
hudakz 0:e29bc8e0dddd 225 * @brief Attaches handler funcion to CAN1 RX0 Interrupt
hudakz 0:e29bc8e0dddd 226 * @note Only CAN1 RX0 Interrupt supported
hudakz 0:e29bc8e0dddd 227 * @param fptr: pointer to a void (*)(void) function
hudakz 0:e29bc8e0dddd 228 * @param type: not used (only CAN1 RX0 Interrupt supported)
hudakz 0:e29bc8e0dddd 229 * @retval
hudakz 0:e29bc8e0dddd 230 */
hudakz 0:e29bc8e0dddd 231 void CAN::attach(void (*fptr) (void), IrqType type) {
hudakz 11:439f3a34c42e 232 #if defined(TARGET_NUCLEO_F103RB)
hudakz 0:e29bc8e0dddd 233 HAL_NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
hudakz 11:439f3a34c42e 234 #elif defined(TARGET_NUCLEO_F303RE)
hudakz 11:439f3a34c42e 235 HAL_NVIC_DisableIRQ(CAN_RX1_IRQn);
hudakz 11:439f3a34c42e 236 #endif
hudakz 0:e29bc8e0dddd 237 if(fptr) {
hudakz 0:e29bc8e0dddd 238 can_irq_set(fptr);
hudakz 0:e29bc8e0dddd 239 }
hudakz 0:e29bc8e0dddd 240 can_irq_init(&_can, &CAN::_irq_handler, (uint32_t) this);
hudakz 11:439f3a34c42e 241 #if defined(TARGET_NUCLEO_F103RB)
hudakz 11:439f3a34c42e 242 HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
hudakz 11:439f3a34c42e 243 #elif defined(TARGET_NUCLEO_F303RE)
hudakz 11:439f3a34c42e 244 HAL_NVIC_EnableIRQ(CAN_RX1_IRQn);
hudakz 11:439f3a34c42e 245 #endif
hudakz 0:e29bc8e0dddd 246 }
hudakz 0:e29bc8e0dddd 247
hudakz 0:e29bc8e0dddd 248 /**
hudakz 0:e29bc8e0dddd 249 * @brief
hudakz 0:e29bc8e0dddd 250 * @note
hudakz 0:e29bc8e0dddd 251 * @param
hudakz 0:e29bc8e0dddd 252 * @retval
hudakz 0:e29bc8e0dddd 253 */
hudakz 0:e29bc8e0dddd 254 void CAN::_irq_handler(uint32_t id, CanIrqType type) {
hudakz 0:e29bc8e0dddd 255 CAN* handler = (CAN*)id;
hudakz 0:e29bc8e0dddd 256 handler->_irq[type].call();
hudakz 0:e29bc8e0dddd 257 }
hudakz 0:e29bc8e0dddd 258
hudakz 0:e29bc8e0dddd 259 } // namespace mbed
hudakz 0:e29bc8e0dddd 260
hudakz 0:e29bc8e0dddd 261
hudakz 0:e29bc8e0dddd 262
hudakz 5:b53e5ee15315 263
hudakz 6:c5a40d5fd9f1 264
hudakz 11:439f3a34c42e 265