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.
stable
Rakshitavecmocon 2024-10-17 13:10:51 +05:30
parent 01b847661b
commit 9b2c2312cb
6 changed files with 244 additions and 38 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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;

22
main.c
View File

@ -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)

View File

@ -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