diff --git a/include/libopencm3/stm32/can.h b/include/libopencm3/stm32/can.h index 0a015402..0370a7ec 100644 --- a/include/libopencm3/stm32/can.h +++ b/include/libopencm3/stm32/can.h @@ -670,7 +670,7 @@ int can_transmit(uint32_t canport, uint32_t id, bool ext, bool rtr, uint8_t length, uint8_t *data); void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, bool *ext, bool *rtr, uint32_t *fmi, uint8_t *length, - uint8_t *data); + uint8_t *data, uint16_t *timestamp); void can_fifo_release(uint32_t canport, uint8_t fifo); bool can_available_mailbox(uint32_t canport); diff --git a/lib/stm32/can.c b/lib/stm32/can.c index 307eedfa..c4d7f0c9 100644 --- a/lib/stm32/can.c +++ b/lib/stm32/can.c @@ -469,10 +469,12 @@ void can_fifo_release(uint32_t canport, uint8_t fifo) @param[out] fmi Unsigned int32 pointer. ID of the matched filter. @param[out] length Unsigned int8 pointer. Length of message payload. @param[out] data Unsigned int8[]. Message payload data. +@param[out] timestamp. Pointer to store the message timestamp. + Only valid on time triggered CAN. Use NULL to ignore. */ void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, bool *ext, bool *rtr, uint32_t *fmi, uint8_t *length, - uint8_t *data) + uint8_t *data, uint16_t *timestamp) { uint32_t fifo_id = 0; union { @@ -513,6 +515,11 @@ void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, * memory to the fast internal RAM */ + if (timestamp) { + *timestamp = (CAN_RDTxR(canport, fifo_id) & + CAN_RDTxR_TIME_MASK) >> CAN_RDTxR_TIME_SHIFT; + } + rdlxr.data32 = CAN_RDLxR(canport, fifo_id); rdhxr.data32 = CAN_RDHxR(canport, fifo_id); /* */