overrun error in meterbus uart handled

This commit is contained in:
Wolfgang Hottgenroth 2020-11-22 21:23:52 +01:00
parent 3fd30aaa36
commit bd435dd5d6
No known key found for this signature in database
GPG Key ID: 656C88C7C1734267
8 changed files with 63 additions and 29 deletions

View File

@ -2014,6 +2014,10 @@ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
return HAL_OK; return HAL_OK;
} }
inline void dts(uint8_t v) {
for (uint8_t xx = 0; xx < v; xx++) HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10);
}
/** /**
* @brief This function handles UART interrupt request. * @brief This function handles UART interrupt request.
* @param huart Pointer to a UART_HandleTypeDef structure that contains * @param huart Pointer to a UART_HandleTypeDef structure that contains
@ -2022,6 +2026,8 @@ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
*/ */
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{ {
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_12);
uint32_t isrflags = READ_REG(huart->Instance->SR); uint32_t isrflags = READ_REG(huart->Instance->SR);
uint32_t cr1its = READ_REG(huart->Instance->CR1); uint32_t cr1its = READ_REG(huart->Instance->CR1);
uint32_t cr3its = READ_REG(huart->Instance->CR3); uint32_t cr3its = READ_REG(huart->Instance->CR3);
@ -2032,9 +2038,10 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
if (errorflags == RESET) if (errorflags == RESET)
{ {
/* UART in mode Receiver -------------------------------------------------*/ /* UART in mode Receiver -------------------------------------------------*/
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{ {
dts(1);
UART_Receive_IT(huart); UART_Receive_IT(huart);
return; return;
} }
@ -2043,6 +2050,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
/* If some errors occur */ /* If some errors occur */
if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))) if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
{ {
dts(2);
/* UART parity error interrupt occurred ----------------------------------*/ /* UART parity error interrupt occurred ----------------------------------*/
if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET)) if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
{ {
@ -2070,6 +2078,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
/* Call UART Error Call back function if need be --------------------------*/ /* Call UART Error Call back function if need be --------------------------*/
if (huart->ErrorCode != HAL_UART_ERROR_NONE) if (huart->ErrorCode != HAL_UART_ERROR_NONE)
{ {
dts(3);
/* UART in mode Receiver -----------------------------------------------*/ /* UART in mode Receiver -----------------------------------------------*/
if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{ {
@ -2089,11 +2098,13 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
/* Disable the UART DMA Rx request if enabled */ /* Disable the UART DMA Rx request if enabled */
if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
{ {
dts(4);
CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
/* Abort the UART DMA Rx channel */ /* Abort the UART DMA Rx channel */
if (huart->hdmarx != NULL) if (huart->hdmarx != NULL)
{ {
dts(5);
/* Set the UART DMA Abort callback : /* Set the UART DMA Abort callback :
will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */ will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError; huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;

View File

@ -10,6 +10,7 @@ typedef struct __attribute__((__packed__)) s_deviceStats {
uint32_t totalPowercycles; uint32_t totalPowercycles;
uint32_t totalRequests; uint32_t totalRequests;
uint32_t totalFailures; uint32_t totalFailures;
uint32_t totalOverruns;
} t_deviceStats; } t_deviceStats;
void eepromInit(); void eepromInit();
@ -18,5 +19,4 @@ void eepromRead(uint16_t addr, uint8_t *buf, uint8_t len);
void eepromSpiTxCpltCallback(SPI_HandleTypeDef *hspi); void eepromSpiTxCpltCallback(SPI_HandleTypeDef *hspi);
t_deviceStats* getGlobalDeviceStats(); t_deviceStats* getGlobalDeviceStats();
#endif /* EEPROM_H_ */ #endif /* EEPROM_H_ */

View File

@ -28,6 +28,7 @@ typedef enum {
typedef struct { typedef struct {
uint32_t requestCnt; uint32_t requestCnt;
uint32_t errorCnt; uint32_t errorCnt;
uint32_t overrunCnt;
} t_mbusCommStats; } t_mbusCommStats;
// e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice); // e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice);
@ -35,6 +36,7 @@ void mbusCommInit();
void mbusCommEnable(bool enable); void mbusCommEnable(bool enable);
void mbusCommTxCpltCallback(UART_HandleTypeDef *huart); void mbusCommTxCpltCallback(UART_HandleTypeDef *huart);
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart); void mbusCommRxCpltCallback(UART_HandleTypeDef *huart);
void mbusCommErrorCallback(UART_HandleTypeDef *huart);
void mbusCommSetStats(t_mbusCommStats stats); void mbusCommSetStats(t_mbusCommStats stats);
t_mbusCommStats *mbusCommGetStats(); t_mbusCommStats *mbusCommGetStats();

View File

@ -20,7 +20,7 @@ static const uint8_t EEPROM_WREN = 0x06;
// static const uint8_t EEPROM_WRSR = 0x01; // static const uint8_t EEPROM_WRSR = 0x01;
static const uint32_t EEPROM_MAGIC = 0xaffe0006; static const uint32_t EEPROM_MAGIC = 0xaffe0007;
typedef union { typedef union {
@ -116,12 +116,14 @@ static void eepromHourlyUpdateDeviceStats(void *handle) {
deviceStats.s.totalRequests = stats->requestCnt; deviceStats.s.totalRequests = stats->requestCnt;
deviceStats.s.totalFailures = stats->errorCnt; deviceStats.s.totalFailures = stats->errorCnt;
deviceStats.s.totalOverruns = stats->overrunCnt;
logMsg("eeHUDS, about to write updated device stats"); logMsg("eeHUDS, about to write updated device stats");
logMsg("eeHUDS, total powercycles so far: %d", deviceStats.s.totalPowercycles); logMsg("eeHUDS, total powercycles so far: %d", deviceStats.s.totalPowercycles);
logMsg("eeHUDS, total running hours so far: %d", deviceStats.s.totalRunningHours); logMsg("eeHUDS, total running hours so far: %d", deviceStats.s.totalRunningHours);
logMsg("eeHUDS, total requests so far: %d", deviceStats.s.totalRequests); logMsg("eeHUDS, total requests so far: %d", deviceStats.s.totalRequests);
logMsg("eeHUDS, total failures so far: %d", deviceStats.s.totalFailures); logMsg("eeHUDS, total failures so far: %d", deviceStats.s.totalFailures);
logMsg("eeHUDS, total overruns so far: %d", deviceStats.s.totalOverruns);
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats)); eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
} }
@ -145,6 +147,7 @@ void eepromInit() {
deviceStats.s.totalRunningHours = 0; deviceStats.s.totalRunningHours = 0;
deviceStats.s.totalRequests = 0; deviceStats.s.totalRequests = 0;
deviceStats.s.totalFailures = 0; deviceStats.s.totalFailures = 0;
deviceStats.s.totalOverruns = 0;
logMsg("eeI, about to write device stats for the first time"); logMsg("eeI, about to write device stats for the first time");
eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats)); eepromWrite(DEVICE_STATS_ADDR, deviceStats.b, sizeof(deviceStats));
eepromActiveDelay(7); eepromActiveDelay(7);
@ -178,8 +181,9 @@ void eepromInit() {
logMsg("eeI, total running hours so far: %d", deviceStats.s.totalRunningHours); logMsg("eeI, total running hours so far: %d", deviceStats.s.totalRunningHours);
logMsg("eeI, total requests so far: %d", deviceStats.s.totalRequests); logMsg("eeI, total requests so far: %d", deviceStats.s.totalRequests);
logMsg("eeI, total failures so far: %d", deviceStats.s.totalFailures); logMsg("eeI, total failures so far: %d", deviceStats.s.totalFailures);
logMsg("eeI, total overruns so far: %d", deviceStats.s.totalOverruns);
t_mbusCommStats stats = { .requestCnt = deviceStats.s.totalRequests, .errorCnt = deviceStats.s.totalFailures}; t_mbusCommStats stats = { .requestCnt = deviceStats.s.totalRequests, .errorCnt = deviceStats.s.totalFailures, .overrunCnt = deviceStats.s.totalOverruns };
mbusCommSetStats(stats); mbusCommSetStats(stats);
deviceStats.s.totalPowercycles += 1; deviceStats.s.totalPowercycles += 1;

View File

@ -37,7 +37,7 @@ void frontendDisable() {
void frontendAdcCallback(ADC_HandleTypeDef* hadc) { void frontendAdcCallback(ADC_HandleTypeDef* hadc) {
static int32_t holdValue = 0; static int32_t holdValue = 0;
show(DEBUG_2, TOGGLE); // show(DEBUG_2, TOGGLE);
if (frontendEnabled) { if (frontendEnabled) {
int32_t currentValue = (int32_t) HAL_ADC_GetValue(hadc); int32_t currentValue = (int32_t) HAL_ADC_GetValue(hadc);

View File

@ -64,7 +64,7 @@ void my_setup_2() {
} }
void my_loop() { void my_loop() {
show(DEBUG_1, TOGGLE); // show(DEBUG_1, TOGGLE);
schExec(); schExec();
@ -111,3 +111,9 @@ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {
eepromSpiTxCpltCallback(hspi); eepromSpiTxCpltCallback(hspi);
} }
} }
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
if (huart == &mbusUart) {
mbusCommErrorCallback(huart);
}
}

View File

@ -95,7 +95,7 @@ typedef struct {
static t_mbusCommHandle mbusCommHandle = { .requestId = 0, .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .receiveCnt = 0, .receivedOctet = 0, .receiving = false }; static t_mbusCommHandle mbusCommHandle = { .requestId = 0, .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .receiveCnt = 0, .receivedOctet = 0, .receiving = false };
static t_mbusCommStats mbusCommStats = { .requestCnt = 0, .errorCnt = 0 }; static t_mbusCommStats mbusCommStats = { .requestCnt = 0, .errorCnt = 0, .overrunCnt = 0 };
static bool mbusCommEnabled = true; static bool mbusCommEnabled = true;
@ -255,9 +255,26 @@ static void timeoutHandler(void *handle) {
static void receiveNext(t_mbusCommHandle *localMbusCommHandle) { static void receiveNext(t_mbusCommHandle *localMbusCommHandle) {
localMbusCommHandle->receiving = true; localMbusCommHandle->receiving = true;
coloredMsg(LOG_RED, false, "RN1: %d", localMbusCommHandle->state); // coloredMsg(LOG_RED, false, "RN1: %d", localMbusCommHandle->state);
HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(localMbusCommHandle->receivedOctet), 1); __attribute__((unused)) HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(localMbusCommHandle->receivedOctet), 1);
coloredMsg(LOG_RED, false, "RN2: 0x%02x", res); // coloredMsg(LOG_RED, false, "RN2: 0x%02x", res);
}
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart) {
if (mbusCommHandle.receiving) {
// coloredMsg(LOG_RED, false, "RO: 0x%02x", mbusCommHandle.receivedOctet);
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
mbusCommHandle.receiving = false;
}
}
void mbusCommErrorCallback(UART_HandleTypeDef *huart) {
if (huart->ErrorCode == HAL_UART_ERROR_ORE) {
coloredMsg(LOG_RED, false, "mbc errcb overrun error, restart receiving");
mbusCommStats.overrunCnt += 1;
HAL_StatusTypeDef res = HAL_UART_Receive_IT(&mbusUart, &(mbusCommHandle.receivedOctet), 1);
coloredMsg(LOG_RED, false, "mbc errcb, recv: 0x%02x", res);
}
} }
static void handleRequestEngine(void *handle) { static void handleRequestEngine(void *handle) {
@ -492,13 +509,6 @@ void mbusCommTxCpltCallback(UART_HandleTypeDef *huart) {
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0); schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
} }
void mbusCommRxCpltCallback(UART_HandleTypeDef *huart) {
if (mbusCommHandle.receiving) {
coloredMsg(LOG_RED, false, "RO: 0x%02x", mbusCommHandle.receivedOctet);
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
mbusCommHandle.receiving = false;
}
}
void mbusCommEnable(bool enable) { void mbusCommEnable(bool enable) {
mbusCommEnabled = enable; mbusCommEnabled = enable;
@ -539,6 +549,8 @@ static e_mbusCommRequestResult mbusCommRequest(t_mbusDevice *mbusDevice) {
} }
#define PERIOD 60
static uint8_t numOfDevices = 8; static uint8_t numOfDevices = 8;
static t_mbusDevice devices[] = { static t_mbusDevice devices[] = {
{ {
@ -547,7 +559,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 17, -1, -1 }, .consideredField = { 0, 17, -1, -1 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -557,7 +569,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -567,7 +579,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -577,7 +589,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -587,7 +599,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -597,7 +609,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 15, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -607,7 +619,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
}, },
@ -617,7 +629,7 @@ static t_mbusDevice devices[] = {
.consideredField = { 0, 4, 2, 3 }, .consideredField = { 0, 4, 2, 3 },
.requests = 0, .requests = 0,
.failures = 0, .failures = 0,
.period = 60, .period = PERIOD,
.delay = 0, .delay = 0,
.waiting = false .waiting = false
} }

View File

@ -58,8 +58,8 @@ static void mqttStatusPublisher(void *handle) {
char buf[128]; char buf[128];
uint32_t uptime = HAL_GetTick() / 1000; uint32_t uptime = HAL_GetTick() / 1000;
snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\"}", snprintf(buf, sizeof(buf), "{\"uptime\":\"%ld\", \"runningHours\":\"%ld\", \"powerCycles\":\"%ld\", \"tasks\":\"%d\", \"requests\":\"%ld\", \"errors\":\"%ld\", \"overruns\":\"%ld\"}",
uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->requestCnt, mbusCommStats->errorCnt); uptime, globalDeviceStats->totalRunningHours, globalDeviceStats->totalPowercycles, schTaskCnt(), mbusCommStats->requestCnt, mbusCommStats->errorCnt, mbusCommStats->overrunCnt);
bool res = publish(&mqttClient, StatusTopic, (const uint8_t*)buf, strlen(buf), false); bool res = publish(&mqttClient, StatusTopic, (const uint8_t*)buf, strlen(buf), false);
coloredMsg(LOG_GREEN, false, "mqch, publish returned %d", res); coloredMsg(LOG_GREEN, false, "mqch, publish returned %d", res);
@ -69,11 +69,10 @@ static void mqttStatusPublisher(void *handle) {
oledPrintf(OLED_SCREEN1, "Addr:%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); oledPrintf(OLED_SCREEN1, "Addr:%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
oledPrintf(OLED_SCREEN1, "Network available:%d", isNetworkAvailable()); oledPrintf(OLED_SCREEN1, "Network available:%d", isNetworkAvailable());
oledPrintf(OLED_SCREEN1, "Uptime:%ld", uptime); oledPrintf(OLED_SCREEN1, "Uptime:%ld", uptime);
oledPrintf(OLED_SCREEN1, "RunHours:%d", globalDeviceStats->totalRunningHours);
oledPrintf(OLED_SCREEN1, "PowerCycl:%d", globalDeviceStats->totalPowercycles); oledPrintf(OLED_SCREEN1, "PowerCycl:%d", globalDeviceStats->totalPowercycles);
oledPrintf(OLED_SCREEN1, "Req:%ld", mbusCommStats->requestCnt); oledPrintf(OLED_SCREEN1, "Req:%ld", mbusCommStats->requestCnt);
oledPrintf(OLED_SCREEN1, "Err:%ld", mbusCommStats->errorCnt); oledPrintf(OLED_SCREEN1, "Err:%ld", mbusCommStats->errorCnt);
oledPrintf(OLED_SCREEN1, "Ovrrn:%d", mbusCommStats->overrunCnt);
} }
void mqttCommHandler(void *handle) { void mqttCommHandler(void *handle) {