From 9b2c2312cb1f1bb21e71f38a359bda54bb468a01 Mon Sep 17 00:00:00 2001 From: Rakshitavecmocon Date: Thu, 17 Oct 2024 13:10:51 +0530 Subject: [PATCH] feat: Add runtime UART baud rate change based on received packet mode Implemented functionality to change UART baud rate at runtime if the received packet has mode set to zero. --- Core/Source/ivec_mcal_mcan.c | 50 +++++- Core/Source/ivec_mcal_uart.c | 178 +++++++++++++++++---- ivec_ECU/ivec_ecu_uart/inc/ivec_ecu_uart.h | 3 +- ivec_ECU/ivec_ecu_uart/src/ivec_ecu_uart.c | 26 ++- main.c | 22 ++- utils/utils.h | 3 + 6 files changed, 244 insertions(+), 38 deletions(-) diff --git a/Core/Source/ivec_mcal_mcan.c b/Core/Source/ivec_mcal_mcan.c index 1066225..c16d68d 100644 --- a/Core/Source/ivec_mcal_mcan.c +++ b/Core/Source/ivec_mcal_mcan.c @@ -24,6 +24,8 @@ uint8_t g_CanData[8]; volatile DL_MCAN_ProtocolStatus HeaderStat; #define MCAN_FILTER_SIZE 4u +extern uint16_t g_canSpeed; + /*REQUIRED MCAN CONFIGS*/ @@ -181,6 +183,44 @@ static const DL_MCAN_BitTimingParams gMCAN0BitTimes_250 = { .dataSynchJumpWidth = 0, }; +static const DL_MCAN_BitTimingParams gMCAN0BitTimes_125 = { + /* Arbitration Baud Rate Pre-scaler. */ + .nomRatePrescalar = 0, + /* Arbitration Time segment before sample point. */ + .nomTimeSeg1 = 138, + /* Arbitration Time segment after sample point. */ + .nomTimeSeg2 = 19, + /* Arbitration (Re)Synchronization Jump Width Range. */ + .nomSynchJumpWidth = 19, + /* Data Baud Rate Pre-scaler. */ + .dataRatePrescalar = 0, + /* Data Time segment before sample point. */ + .dataTimeSeg1 = 0, + /* Data Time segment after sample point. */ + .dataTimeSeg2 = 0, + /* Data (Re)Synchronization Jump Width. */ + .dataSynchJumpWidth = 0, +}; + +static const DL_MCAN_BitTimingParams gMCAN0BitTimes_1000 = { + /* Arbitration Baud Rate Pre-scaler. */ + .nomRatePrescalar = 0, + /* Arbitration Time segment before sample point. */ + .nomTimeSeg1 = 138, + /* Arbitration Time segment after sample point. */ + .nomTimeSeg2 = 19, + /* Arbitration (Re)Synchronization Jump Width Range. */ + .nomSynchJumpWidth = 19, + /* Data Baud Rate Pre-scaler. */ + .dataRatePrescalar = 0, + /* Data Time segment before sample point. */ + .dataTimeSeg1 = 0, + /* Data Time segment after sample point. */ + .dataTimeSeg2 = 0, + /* Data (Re)Synchronization Jump Width. */ + .dataSynchJumpWidth = 0, +}; + /*____________________________________________________________________________________________________________________________________________________________________________________________*/ @@ -303,7 +343,7 @@ void CANFD0_IRQHandler(void) if (HeaderStat.lastErrCode != 3){ int status = -1; printf("Attempting recovery...\n"); - status = xECU_CanReInit(CANFD0 ,BAUD_500); + status = xECU_CanReInit(CANFD0 , g_canSpeed); if(status == 0) { printf("done\n"); @@ -432,6 +472,14 @@ IVEC_McalStatus_e xMCAL_MCANInit(MCAN_Regs* MCAN, xCAN_baud_t BAUD) { DL_MCAN_setBitTime(MCAN, (DL_MCAN_BitTimingParams*) &gMCAN0BitTimes_250); } + else if(BAUD==BAUD_1000) + { + DL_MCAN_setBitTime(MCAN, (DL_MCAN_BitTimingParams*) &gMCAN0BitTimes_1000); + } + else if(BAUD==BAUD_150) + { + DL_MCAN_setBitTime(MCAN, (DL_MCAN_BitTimingParams*) &gMCAN0BitTimes_125); + } /* Configure Message RAM Sections */ DL_MCAN_msgRAMConfig(MCAN, (DL_MCAN_MsgRAMConfigParams*) &gMCAN0MsgRAMConfigParams); diff --git a/Core/Source/ivec_mcal_uart.c b/Core/Source/ivec_mcal_uart.c index 94fde19..8685d4d 100644 --- a/Core/Source/ivec_mcal_uart.c +++ b/Core/Source/ivec_mcal_uart.c @@ -193,11 +193,43 @@ static UART_Regs* GetUartInstance(McalUartPortNumber_e eUartPortNumber) } ////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////DEINIT///////////////////////////////////////////////////////// +//static xCoreStatus_t uart_deinit(McalUartHandle_s* pxUartHandle) +//{ +//// assert(b_UART1_init_flag == 1 || b_UART3_init_flag == 1); +//// assert(uart_inst == UART1 || uart_inst == UART3); +// +// UART_Regs* uart_inst = GetUartInstance(pxUartHandle->eUartPortNumber); +// +// // Check if the UART instance is valid +// if (uart_inst == NULL) +// { +// return STATUS_ERROR; +// } +// +// if(uart_inst==UART0) +// { +// NVIC_DisableIRQ(UART0_INT_IRQn); +// DL_UART_disablePower(uart_inst); +// //b_UART1_init_flag=0; +// } +// else if(uart_inst==UART1) +// { +// NVIC_DisableIRQ(UART1_INT_IRQn); +// DL_UART_disablePower(uart_inst); +// //b_UART1_init_flag=0; +// } +// else if(uart_inst==UART2) +// { +// NVIC_DisableIRQ(UART2_INT_IRQn); +// DL_UART_disablePower(uart_inst); +// //b_UART3_init_flag=0; +// } +// return STATUS_SUCCESS; +//} + static xCoreStatus_t uart_deinit(McalUartHandle_s* pxUartHandle) { -// assert(b_UART1_init_flag == 1 || b_UART3_init_flag == 1); -// assert(uart_inst == UART1 || uart_inst == UART3); - + // Get the UART instance based on the port number in the handle UART_Regs* uart_inst = GetUartInstance(pxUartHandle->eUartPortNumber); // Check if the UART instance is valid @@ -206,26 +238,45 @@ static xCoreStatus_t uart_deinit(McalUartHandle_s* pxUartHandle) return STATUS_ERROR; } - if(uart_inst==UART0) - { - NVIC_DisableIRQ(UART0_INT_IRQn); - DL_UART_disablePower(uart_inst); - //b_UART1_init_flag=0; - } - else if(uart_inst==UART1) - { - NVIC_DisableIRQ(UART1_INT_IRQn); - DL_UART_disablePower(uart_inst); - //b_UART1_init_flag=0; - } - else if(uart_inst==UART2) - { - NVIC_DisableIRQ(UART2_INT_IRQn); - DL_UART_disablePower(uart_inst); - //b_UART3_init_flag=0; - } + // Disable UART instance + DL_UART_Main_disable(uart_inst); + + // Disable interrupts for the UART instance + DL_UART_Main_disableInterrupt(uart_inst, + DL_UART_MAIN_INTERRUPT_BREAK_ERROR | + DL_UART_MAIN_INTERRUPT_FRAMING_ERROR | + DL_UART_MAIN_INTERRUPT_NOISE_ERROR | + DL_UART_MAIN_INTERRUPT_OVERRUN_ERROR | + DL_UART_MAIN_INTERRUPT_PARITY_ERROR | + DL_UART_MAIN_INTERRUPT_RX | + DL_UART_MAIN_INTERRUPT_RX_TIMEOUT_ERROR); + + // Clear and disable NVIC interrupt requests based on UART instance + if (uart_inst == UART0) + { + NVIC_DisableIRQ(UART0_INT_IRQn); + NVIC_ClearPendingIRQ(UART0_INT_IRQn); + // Reset the UART0 init flag if needed (b_UART0_init_flag = 0) + } + else if (uart_inst == UART1) + { + NVIC_DisableIRQ(UART1_INT_IRQn); + NVIC_ClearPendingIRQ(UART1_INT_IRQn); + // Reset the UART1 init flag if needed (b_UART1_init_flag = 0) + } + else if (uart_inst == UART2) + { + NVIC_DisableIRQ(UART2_INT_IRQn); + NVIC_ClearPendingIRQ(UART2_INT_IRQn); + // Reset the UART2 init flag if needed (b_UART2_init_flag = 0) + } + + // Optionally, reset the UART clock configuration if needed + DL_UART_Main_setClockConfig(uart_inst, NULL); + return STATUS_SUCCESS; } + /** * @brief Function to De-init UART Peripheral. * @warning Donot call if UART is not initilized earlier. @@ -511,6 +562,7 @@ static xCoreStatus_t uart_init(McalUartHandle_s* pxUartHandle, McalUartBaudRate_ DL_UART_Main_init(uart_inst, (DL_UART_Main_Config *) &xprvUartConfig); /* Configure baud rate by setting oversampling and baud rate divisors.*/ + DL_UART_Main_setOversampling(uart_inst, DL_UART_OVERSAMPLING_RATE_16X); if(xBaud==115200) { @@ -519,24 +571,86 @@ static xCoreStatus_t uart_init(McalUartHandle_s* pxUartHandle, McalUartBaudRate_ * Target baud rate: 115200 * Actual baud rate: 115211.52 */ - -// DL_UART_Main_setOversampling(uart_inst, DL_UART_OVERSAMPLING_RATE_16X); -// DL_UART_Main_setBaudRateDivisor(uart_inst, 17, 23); - - - DL_UART_Main_setOversampling(uart_inst, DL_UART_OVERSAMPLING_RATE_16X); DL_UART_Main_setBaudRateDivisor(uart_inst, 13, 1); - - } else if(xBaud==9600) { - DL_UART_Main_setOversampling(uart_inst, DL_UART_OVERSAMPLING_RATE_16X); - //DL_UART_Main_setBaudRateDivisor(uart_inst, 208, 21); DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); - } + else if(xBaud==2400) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 625, 0); + } + else if(xBaud==4800) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 312, 32); + } + else if(xBaud==14400) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 104, 11); + } + else if(xBaud==19200) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 78, 8); + } + else if(xBaud==28800) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 52, 5); + } + else if(xBaud==33600) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 44, 41); + } + else if(xBaud==38400) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 39, 4); + } + else if(xBaud==57600) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 26, 3); + } + else if(xBaud==230400) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 6, 33); + } + else if(xBaud==460800) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 3, 16); + } + else if(xBaud==921600) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 1, 40); + } + else if(xBaud==1000000) + { + DL_UART_Main_setBaudRateDivisor(uart_inst, 1, 32); + } + // else if(xBaud==1843200) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + // else if(xBaud==2000000) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + // else if(xBaud==2100000) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + // else if(xBaud==3686400) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + // else if(xBaud==4000000) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + // else if(xBaud==4468750) + // { + // DL_UART_Main_setBaudRateDivisor(uart_inst, 156, 16); + // } + /* Configure Interrupts */ if(uart_inst==UART0) diff --git a/ivec_ECU/ivec_ecu_uart/inc/ivec_ecu_uart.h b/ivec_ECU/ivec_ecu_uart/inc/ivec_ecu_uart.h index 31ea6e7..3cfcbd2 100644 --- a/ivec_ECU/ivec_ecu_uart/inc/ivec_ecu_uart.h +++ b/ivec_ECU/ivec_ecu_uart/inc/ivec_ecu_uart.h @@ -31,8 +31,9 @@ typedef int PacketRetCode_t;/*SERVICE_SUCESS or SERVICE_FAIL*/ /*=========================================================================== * Functions declaration ===========================================================================*/ -IVEC_EcuCommonErr_e xECU_UARTInit(McalUartHandle_s* prvUartHandle); +IVEC_EcuCommonErr_e xECU_UARTInit(McalUartHandle_s* prvUartHandle, uint32_t speed); IVEC_EcuCommonErr_e xECU_UARTDeInit(McalUartHandle_s *prvUartHandle); +IVEC_EcuCommonErr_e xECU_UARTReInit(McalUartHandle_s *prvUartHandle, uint32_t speed); IVEC_EcuCommonErr_e xECU_UARTTransmit(McalUartHandle_s *prvUartHandle, uint8_t* pucBuffer, uint16_t len); //Uart_Typedef_e xUartWrite(Uart_PortHandle_s *xportHandle, uint8_t* pucBuffer, uint16_t len, uint16_t timeout); IVEC_EcuCommonErr_e xECU_UARTGetData(McalUartHandle_s *prvUartHandle, uint8_t* pucBuffer, uint16_t len, uint16_t timeout); diff --git a/ivec_ECU/ivec_ecu_uart/src/ivec_ecu_uart.c b/ivec_ECU/ivec_ecu_uart/src/ivec_ecu_uart.c index fe018fa..8c8b8c9 100644 --- a/ivec_ECU/ivec_ecu_uart/src/ivec_ecu_uart.c +++ b/ivec_ECU/ivec_ecu_uart/src/ivec_ecu_uart.c @@ -68,7 +68,7 @@ static void prvChecksumCalculate(uint8_t* pkt, int len, uint8_t *ck) { } -IVEC_EcuCommonErr_e xECU_UARTInit(McalUartHandle_s* prvUartHandle) +IVEC_EcuCommonErr_e xECU_UARTInit(McalUartHandle_s* prvUartHandle, uint32_t speed) { IVEC_ECU_FUNC_ENTRY(LOG_STRING); IVEC_EcuCommonErr_e l_xFuncStatus = commonECU_SUCCESS; @@ -89,7 +89,7 @@ IVEC_EcuCommonErr_e xECU_UARTInit(McalUartHandle_s* prvUartHandle) IVEC_ECU_LOG(LOG_STRING, "Initilising UART"); prvUartHandle->eUartPortNumber = mcalUART_PORT3; prvUartHandle->pvUartRecvCallback = __prv_vEcu_CANOverUartMsgCallback; - prvUartHandle->xUartConfig.eUartBaudrate = mcalUART_BAUD_115200; + prvUartHandle->xUartConfig.eUartBaudrate = speed; prvUartHandle->xUartConfig.eUartFlowCtrl = mcalUART_FC_NONE; prvUartHandle->xUartConfig.eUartDataBit = mcalUART_DATABIT_8; prvUartHandle->xUartConfig.eUartStopBit = mcalUART_STOP_1; @@ -159,6 +159,28 @@ IVEC_EcuCommonErr_e xECU_UARTDeInit(McalUartHandle_s* prvUartHandle) return l_xFuncStatus; } + +IVEC_EcuCommonErr_e xECU_UARTReInit(McalUartHandle_s *prvUartHandle, uint32_t speed) +{ + IVEC_EcuCommonErr_e l_xFuncStatus = commonECU_SUCCESS; + uint8_t l_i32Ret; + l_i32Ret = xECU_UARTDeInit(prvUartHandle); + if(l_i32Ret != IVEC_MCAL_STATUS_SUCCESS) + { + l_xFuncStatus = commonECU_DEINIT_FAIL; + } + + l_i32Ret = xECU_UARTInit(prvUartHandle, speed); + + if(l_i32Ret != IVEC_MCAL_STATUS_SUCCESS) + { + l_xFuncStatus = commonECU_INIT_FAIL; + } + return l_xFuncStatus; +} + + + IVEC_EcuCommonErr_e xECU_UARTTransmit(McalUartHandle_s *prvUartHandle, uint8_t* pucBuffer, uint16_t len) { return commonECU_SUCCESS; diff --git a/main.c b/main.c index b2de0c7..eaf7b59 100644 --- a/main.c +++ b/main.c @@ -133,6 +133,8 @@ flashStatus_t ret_UID,ret_MID; McalUartHandle_s prvUartHandle; static volatile int count = 0; +uint32_t g_uartSpeed = 0; +uint16_t g_canSpeed = 0; void UARTDataProcess() { @@ -145,7 +147,22 @@ void UARTDataProcess() { if(ulId == 0x00) { + //vECU_InitiateUartToCanTransmit(&prvUartHandle, ulId, pucBuf, 0); + + uint32_t baudrate = 0; + uint8_t mode = pucBuf[PKT_HEADER]; + memcpy(&baudrate, &pucBuf[PKT_HEADER+1], (uint32_t)retCode); vECU_InitiateUartToCanTransmit(&prvUartHandle, ulId, pucBuf, 0); + if( mode == 0 ) + { + g_uartSpeed = baudrate; + xECU_UARTReInit(&prvUartHandle, g_uartSpeed); + } + else if( mode == 1 ) + { + g_canSpeed = (uint16_t)baudrate; + xECU_CanReInit(CANFD0, g_canSpeed); + } } else{ xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 0); @@ -173,8 +190,9 @@ int main(void) xMCAL_SYSCTL_INIT(HFXT,STANDBY0); xMCAL_SYSTICK_INIT(Period_1ms); - - xECU_UARTInit(&prvUartHandle); + g_uartSpeed = mcalUART_BAUD_115200; + g_canSpeed = BAUD_250; + xECU_UARTInit(&prvUartHandle, g_uartSpeed); xECU_CANInit(CANFD0,BAUD_500); while(1) diff --git a/utils/utils.h b/utils/utils.h index 7f71c5d..235073d 100644 --- a/utils/utils.h +++ b/utils/utils.h @@ -60,6 +60,9 @@ typedef enum /*CAN Baud Rate Options*/ BAUD_500 = 0, BAUD_250 = 1, + BAUD_150 = 2, + BAUD_1000 = 3, + }xCAN_baud_t; typedef enum