#include "Cpu.h" #ifdef PEX_RTOS_INIT #define INIT_RTOS() PEX_RTOS_INIT() #else #define INIT_RTOS() #endif #include #include #include "pin_mux.h" #include "pins_driver.h" #include "flexcan_driver.h" #include "osif.h" #include "clock_manager.h" #include "isotp.h" #include "sha256.h" #define CAN_INSTANCE 0U #define RX_MB_IDX 4U #define TX_MB_IDX 0U #define CAN_ID_RX 0x7D0U #define CAN_ID_TX 0x7D8U #define CAN_TIMEOUT_MS 1000U #define LED_OK_PORT PTA #define LED_OK_PIN 10U #define LED_ERR_PORT PTH #define LED_ERR_PIN 13U #define FLASH_START ((const uint8_t*)0x01000000) #define FLASH_SIZE (1856 * 1024) int main(void) { /* Write your local variable definition here */ /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/ #ifdef PEX_RTOS_INIT PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of Processor Expert internal initialization. ***/ INIT_RTOS(); CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT); CLOCK_SYS_UpdateConfiguration(0, CLOCK_MANAGER_POLICY_AGREEMENT); PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); flexcan_user_config_t cfg; flexcan_state_t state; FLEXCAN_DRV_GetDefaultConfig(&cfg); cfg.flexcanMode = FLEXCAN_NORMAL_MODE; FLEXCAN_DRV_Init(CAN_INSTANCE, &state, &cfg); flexcan_time_segment_t ts = { .propSeg = 6u, .phaseSeg1 = 7u, .phaseSeg2 = 2u, .preDivider = 4u, .rJumpwidth = 2u }; FLEXCAN_DRV_SetBitrate(CAN_INSTANCE, &ts); flexcan_data_info_t rxInfo = { .msg_id_type = FLEXCAN_MSG_ID_STD, .data_length = 8U, .fd_enable = false, .is_remote = false }; FLEXCAN_DRV_ConfigRxMb(CAN_INSTANCE, RX_MB_IDX, &rxInfo, CAN_ID_RX); flexcan_data_info_t txInfo = { .msg_id_type = FLEXCAN_MSG_ID_STD, .data_length = 8U, .fd_enable = false, .is_remote = false }; FLEXCAN_DRV_ConfigTxMb(CAN_INSTANCE, TX_MB_IDX, &txInfo, CAN_ID_TX); uint8_t rxBuf[128]; uint8_t response[34]; uint8_t hash[32]; uint16_t rxLen; for (;;) { rxLen = sizeof(rxBuf); if (isotp_recv(CAN_INSTANCE, rxBuf, &rxLen, CAN_TIMEOUT_MS) == 0) { if (rxLen >= 2 && rxBuf[0] == 0x22 && rxBuf[1] == 0x64) { sha256(FLASH_START, FLASH_SIZE, hash); response[0] = 0x62; response[1] = 0x64; memcpy(&response[2], hash, 32); int sendResult = isotp_send(CAN_INSTANCE, CAN_ID_TX, response, sizeof(response), CAN_TIMEOUT_MS); if (sendResult == 0) { PINS_DRV_TogglePins(LED_OK_PORT, (1U << LED_OK_PIN)); PINS_DRV_ClearPins(LED_ERR_PORT, (1U << LED_ERR_PIN)); } else { PINS_DRV_SetPins(LED_ERR_PORT, (1U << LED_ERR_PIN)); } } } OSIF_TimeDelay(100); } return 0; }