From 24a270a932c23df78819291ba2b6ca6410b29b7c Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 8 Jan 2024 00:18:44 +0300 Subject: [PATCH] fix some bugs --- F3:F303/CANbus4BTA/BTA_CAN.bin | Bin 10644 -> 19732 bytes F3:F303/CANbus4BTA/adc.c | 10 ++- F3:F303/CANbus4BTA/adc.h | 2 +- F3:F303/CANbus4BTA/can.c | 89 ++++++++++++++++-------- F3:F303/CANbus4BTA/can.h | 14 +++- F3:F303/CANbus4BTA/commonfunctions.c | 30 ++++---- F3:F303/CANbus4BTA/flash.c | 17 +++-- F3:F303/CANbus4BTA/flash.h | 2 +- F3:F303/CANbus4BTA/hardware.c | 37 +++++++++- F3:F303/CANbus4BTA/main.c | 34 +++++++-- F3:F303/CANbus4BTA/proto.h | 2 +- F3:F303/CANbus4BTA/textfunctions.c | 99 ++++++++++++++++++++++----- F3:F303/CANbus4BTA/usb.c | 8 +-- F3:F303/CANbus4BTA/usb.h | 6 +- F3:F303/CANbus4BTA/version.inc | 4 +- makefile.stm32 | 7 +- 16 files changed, 265 insertions(+), 96 deletions(-) diff --git a/F3:F303/CANbus4BTA/BTA_CAN.bin b/F3:F303/CANbus4BTA/BTA_CAN.bin index e0abd4918206eff9821231b1eb45e58cebfebb16..c030ba80fbb1659aa127b3a88467eed46c6285d6 100755 GIT binary patch literal 19732 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 literal 10644 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 QyW5?(gEak)P-@Zt0a5s@z5oCK diff --git a/F3:F303/CANbus4BTA/adc.c b/F3:F303/CANbus4BTA/adc.c index ae02ebe..779b139 100644 --- a/F3:F303/CANbus4BTA/adc.c +++ b/F3:F303/CANbus4BTA/adc.c @@ -19,6 +19,8 @@ #include "adc.h" #include "hardware.h" // ADCvals +#include "usb.h" + /** * @brief ADCx_array - arrays for ADC channels with median filtering: * ADC1: @@ -73,6 +75,7 @@ void adc_setup(){ ADC1->SQR2 = (16<<0); ADC2->SMPR1 = ADC_SMPR1_SMP1; // configure DMA for ADC + RCC->AHBENR |= RCC_AHBENR_DMA1EN; ADC1->CFGR = ADC_CFGR_CONT | ADC_CFGR_DMAEN | ADC_CFGR_DMACFG; DMA1_Channel1->CPAR = (uint32_t) (&(ADC1->DR)); DMA1_Channel1->CMAR = (uint32_t)(ADC_array); @@ -104,18 +107,19 @@ uint16_t getADCval(int nch){ PIX_SORT(p[4], p[2]) ; #undef PIX_SORT #undef PIX_SWAP + DBG("nch="); printu(nch); USB_sendstr("; data="); printu(p[4]); newline(); return p[4]; } // get voltage @input nch (V) -float getADCvoltage(uint16_t ADCval){ - float v = (float)ADCval * 3.3; +float getADCvoltage(int nch){ + float v = getADCval(nch) * 3.3f; return v/4096.f; // 12bit ADC } // return MCU temperature (degrees of celsius) float getMCUtemp(){ - float temperature = ADC_array[ADC_TSENS] - (float) *TEMP30_CAL_ADDR; + float temperature = getADCval(ADC_TSENS) - (float) *TEMP30_CAL_ADDR; temperature *= (110.f - 30.f); temperature /= (float)(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR); temperature += 30.f; diff --git a/F3:F303/CANbus4BTA/adc.h b/F3:F303/CANbus4BTA/adc.h index e2c4146..f1cd3a8 100644 --- a/F3:F303/CANbus4BTA/adc.h +++ b/F3:F303/CANbus4BTA/adc.h @@ -33,4 +33,4 @@ void adc_setup(); float getMCUtemp(); uint16_t getADCval(int nch); -float getADCvoltage(uint16_t ADCval); +float getADCvoltage(int nch); diff --git a/F3:F303/CANbus4BTA/can.c b/F3:F303/CANbus4BTA/can.c index f37f6ed..3be9089 100644 --- a/F3:F303/CANbus4BTA/can.c +++ b/F3:F303/CANbus4BTA/can.c @@ -24,10 +24,16 @@ #include "strfunc.h" #include "usb.h" +#ifdef EBUG +#undef EBUG +#endif + // PD1 - Tx, PD0 - Rx !!! #include // memcpy +uint8_t cansniffer = 0; // 0 - receive only 0 and myID, 1 - receive all + // circular buffer for received messages static CAN_message messages[CAN_INMESSAGE_SIZE]; static uint8_t first_free_idx = 0; // index of first empty cell @@ -45,8 +51,9 @@ static CAN_message loc_flood_msg; static CAN_message *flood_msg = NULL; // == loc_flood_msg - to flood CAN_status CAN_get_status(){ - int st = can_status; - can_status = CAN_OK; + CAN_status st = can_status; + //can_status = CAN_OK; + if(st == CAN_FIFO_OVERRUN) can_status = CAN_READY; return st; } @@ -95,7 +102,7 @@ CAN_message *CAN_messagebuf_pop(){ return msg; } -void CAN_reinit(uint16_t speed){ +void CAN_reinit(uint32_t speed){ CAN->TSR |= CAN_TSR_ABRQ0 | CAN_TSR_ABRQ1 | CAN_TSR_ABRQ2; RCC->APB1RSTR |= RCC_APB1RSTR_CANRST; RCC->APB1RSTR &= ~RCC_APB1RSTR_CANRST; @@ -127,8 +134,8 @@ so if TBS1=4 and TBS2=3, sum=8, bit sampling freq is 36/8 = 4.5MHz // GPIO configured in hw_setup void CAN_setup(uint32_t speed){ if(speed == 0) speed = oldspeed; - else if(speed < 50) speed = 50; - else if(speed > 3000) speed = 3000; + else if(speed < CAN_MIN_SPEED) speed = CAN_MIN_SPEED; + else if(speed > CAN_MAX_SPEED) speed = CAN_MAX_SPEED; uint32_t tmout = 10000; /* Enable the peripheral clock CAN */ RCC->APB1ENR |= RCC_APB1ENR_CANEN; @@ -141,7 +148,7 @@ void CAN_setup(uint32_t speed){ /* (6) Wait the init mode leaving */ /* (7) Enter filter init mode, (16-bit + mask, bank 0 for FIFO 0) */ /* (8) Acivate filter 0 for two IDs */ - /* (9) Identifier list mode */ + /* (9) Identifier mode for bank#0, mask mode for #1 */ /* (10) Set the Id list */ /* (12) Leave filter init */ /* (13) Set error interrupts enable (& bus off) */ @@ -151,21 +158,28 @@ void CAN_setup(uint32_t speed){ if(tmout==0){ DBG("timeout!\n");} CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */ CAN->MCR |= CAN_MCR_ABOM; /* allow automatically bus-off */ - - CAN->BTR = 2 << 20 | 3 << 16 | (4500000/speed - 1); //| CAN_BTR_SILM | CAN_BTR_LBKM; /* (4) */ - oldspeed = 4500000/((CAN->BTR & CAN_BTR_BRP) + 1); + CAN->BTR = 2 << 20 | 3 << 16 | (((uint32_t)4500000UL)/speed - 1); //| CAN_BTR_SILM | CAN_BTR_LBKM; /* (4) */ + oldspeed = ((uint32_t)4500000UL)/(uint32_t)((CAN->BTR & CAN_BTR_BRP) + 1); CAN->MCR &= ~CAN_MCR_INRQ; /* (5) */ tmout = 10000; while(CAN->MSR & CAN_MSR_INAK) /* (6) */ if(--tmout == 0) break; if(tmout==0){ DBG("timeout!\n");} - // accept ALL + // accept only 0 & ID or ALL depending on `cansniffer` value CAN->FMR = CAN_FMR_FINIT; /* (7) */ - CAN->FA1R = CAN_FA1R_FACT0 | CAN_FA1R_FACT1; /* (8) */ - // set to 1 all needed bits of CAN->FFA1R to switch given filters to FIFO1 - CAN->sFilterRegister[0].FR1 = (1<<21)|(1<<5); // all odd IDs - CAN->FFA1R = 2; // filter 1 for FIFO1, filter 0 - for FIFO0 - CAN->sFilterRegister[1].FR1 = (1<<21); // all even IDs + CAN->FA1R = CAN_FA1R_FACT0; /* (8) */ + CAN->FM1R = CAN_FM1R_FBM0; /* (9) */ + // CAN->FSCx = 0 -> dual 16-bit scale configuration + // filter 0 for FIFO0 + CAN->sFilterRegister[0].FR1 = the_conf.CANID << 5; // (10) CANID and 0 + if(cansniffer){ /* (11) */ + CAN->FA1R |= CAN_FA1R_FACT1; // activate filter1 + CAN->sFilterRegister[1].FR1 = 0; // all packets + // mask mode, all odd and even IDs + //CAN->sFilterRegister[1].FR1 = (1<<21)|(1<<5); // all odd IDs, mask mode + //CAN->sFilterRegister[1].FR2 = (1<<21)|(0<<5); // all even IDs, mask mode + CAN->FFA1R = 2; // filter 1 for FIFO1 + } CAN->FMR &= ~CAN_FMR_FINIT; /* (12) */ CAN->IER |= CAN_IER_ERRIE | CAN_IER_FOVIE0 | CAN_IER_FOVIE1 | CAN_IER_BOFIE; /* (13) */ @@ -180,6 +194,15 @@ void CAN_setup(uint32_t speed){ can_status = CAN_READY; } +/** + * @brief CAN_sniffer - reconfigure CAN in sniffer or normal mode + * @param issniffer - ==0 for normal mode + */ +void CAN_sniffer(uint8_t issniffer){ + cansniffer = issniffer; + CAN_reinit(0); +} + void CAN_printerr(){ if(!last_err_code) last_err_code = CAN->ESR; if(!last_err_code){ @@ -228,14 +251,9 @@ void CAN_proc(){ } IWDG->KR = IWDG_REFRESH; if(CAN->ESR & (CAN_ESR_BOFF | CAN_ESR_EPVF | CAN_ESR_EWGF)){ // much errors - restart CAN BUS - USB_sendstr("\nToo much errors, restarting CAN!\n"); + USB_sendstr("error=canbuserr\n"); CAN_printerr(); - // request abort for all mailboxes - CAN->TSR |= CAN_TSR_ABRQ0 | CAN_TSR_ABRQ1 | CAN_TSR_ABRQ2; - // reset CAN bus - RCC->APB1RSTR |= RCC_APB1RSTR_CANRST; - RCC->APB1RSTR &= ~RCC_APB1RSTR_CANRST; - CAN_setup(0); + CAN_reinit(0); } static uint32_t lastFloodTime = 0; static uint32_t incrmessagectr = 0; @@ -255,11 +273,17 @@ CAN_status CAN_send(CAN_message *message){ uint8_t *msg = message->data; uint8_t len = message->length; uint16_t target_id = message->ID; - uint8_t mailbox = 0; + uint8_t mailbox = 0xff; // check first free mailbox - if(CAN->TSR & (CAN_TSR_TME)){ - mailbox = (CAN->TSR & CAN_TSR_CODE) >> 24; - }else{ // no free mailboxes + uint32_t Tstart = Tms; + while(Tms - Tstart < SEND_TIMEOUT_MS/10){ + IWDG->KR = IWDG_REFRESH; + if(CAN->TSR & (CAN_TSR_TME)){ + mailbox = (CAN->TSR & CAN_TSR_CODE) >> 24; + break; + } + } + if(mailbox == 0xff){// no free mailboxes #ifdef EBUG USB_sendstr("No free mailboxes\n"); #endif @@ -336,9 +360,13 @@ TRUE_INLINE void parseCANcommand(CAN_message *msg){ msg->ID = the_conf.CANID; // set own ID for broadcast messages // check PING if(msg->length != 0) run_can_cmd(msg); - int N = 1000; - while(CAN_BUSY == CAN_send(msg)) - if(--N == 0) break; + uint32_t Tstart = Tms; + while(Tms - Tstart < SEND_TIMEOUT_MS){ + if(CAN_OK == CAN_send(msg)) return; + IWDG->KR = IWDG_REFRESH; + } + // TODO: buzzer error can't send + USB_sendstr("error=canbusy\n"); } static void can_process_fifo(uint8_t fifo_num){ @@ -354,6 +382,7 @@ static void can_process_fifo(uint8_t fifo_num){ // CAN_RDTxR: (16-31) - timestamp, (8-15) - filter match index, (0-3) - data length /* TODO: check filter match index if more than one ID can receive */ CAN_message msg; + bzero(&msg, sizeof(msg)); uint8_t *dat = msg.data; uint8_t len = box->RDTR & 0x0f; msg.length = len; @@ -389,7 +418,7 @@ static void can_process_fifo(uint8_t fifo_num){ } } if(msg.ID == the_conf.CANID || msg.ID == 0) parseCANcommand(&msg); - if(CAN_messagebuf_push(&msg)) return; // error: buffer is full, try later + if(cansniffer && CAN_messagebuf_push(&msg)) return; // error: buffer is full, try later *RFxR |= CAN_RF0R_RFOM0; // release fifo for access to next message } //if(*RFxR & CAN_RF0R_FULL0) *RFxR &= ~CAN_RF0R_FULL0; diff --git a/F3:F303/CANbus4BTA/can.h b/F3:F303/CANbus4BTA/can.h index 4414cda..e0159d4 100644 --- a/F3:F303/CANbus4BTA/can.h +++ b/F3:F303/CANbus4BTA/can.h @@ -20,14 +20,21 @@ #include +// min/max speeds in bps +#define CAN_MAX_SPEED ((uint32_t)3000000UL) +#define CAN_MIN_SPEED ((uint32_t)9600UL) + // amount of filter banks in STM32F0 -#define STM32F0FBANKNO 28 +#define STM32F0FBANKNO (28) // flood period in milliseconds -#define FLOOD_PERIOD_MS 5 +#define FLOOD_PERIOD_MS (5) +// wait to send not more tnah +#define SEND_TIMEOUT_MS (100) // incoming message buffer size #define CAN_INMESSAGE_SIZE (8) extern uint32_t floodT; +extern uint8_t cansniffer; // CAN message typedef struct{ @@ -47,8 +54,9 @@ typedef enum{ CAN_status CAN_get_status(); -void CAN_reinit(uint16_t speed); +void CAN_reinit(uint32_t speed); void CAN_setup(uint32_t speed); +void CAN_sniffer(uint8_t issniffer); CAN_status CAN_send(CAN_message *message); void CAN_proc(); diff --git a/F3:F303/CANbus4BTA/commonfunctions.c b/F3:F303/CANbus4BTA/commonfunctions.c index 6dac9ed..46dd599 100644 --- a/F3:F303/CANbus4BTA/commonfunctions.c +++ b/F3:F303/CANbus4BTA/commonfunctions.c @@ -49,7 +49,7 @@ static errcodes mcut(CAN_message *msg){ // get ADC raw values static errcodes adcraw(CAN_message *msg){ FIXDL(msg); - register uint8_t no = msg->data[2] & ~SETTER_FLAG; + uint8_t no = msg->data[2] & ~SETTER_FLAG; if(no >= NUMBER_OF_ADC_CHANNELS) return ERR_BADPAR; *(uint32_t*)&msg->data[4] = getADCval(no); return ERR_OK; @@ -57,7 +57,7 @@ static errcodes adcraw(CAN_message *msg){ // get ADC voltage static errcodes adcv(CAN_message *msg){ FIXDL(msg); - register uint8_t no = msg->data[2] & ~SETTER_FLAG; + uint8_t no = msg->data[2] & ~SETTER_FLAG; if(no >= ADC_TSENS) return ERR_BADPAR; float v = getADCvoltage(no) * the_conf.adcmul[no] * 100.f; *(uint32_t*)&msg->data[4] = (uint32_t) v; // or float?? @@ -67,7 +67,7 @@ static errcodes adcv(CAN_message *msg){ static errcodes canspeed(CAN_message *msg){ if(ISSETTER(msg->data)){ uint32_t spd = *(uint32_t*)&msg->data[4]; - CAN_setup(spd); + CAN_reinit(spd); the_conf.CANspeed = CAN_speed(); }else FIXDL(msg); *(uint32_t*)&msg->data[4] = CAN_speed(); @@ -77,7 +77,7 @@ static errcodes canspeed(CAN_message *msg){ static errcodes canid(CAN_message *msg){ if(ISSETTER(msg->data)){ the_conf.CANID = *(uint32_t*)&msg->data[4]; - // CAN_setup(0); // setup with new ID + CAN_reinit(0); // setup with new ID }else FIXDL(msg); *(uint32_t*)&msg->data[4] = the_conf.CANID; return ERR_OK; @@ -121,7 +121,7 @@ static const commonfunction funclist[CMD_AMOUNT] = { [CMD_MCUTEMP] = {mcut, 0, 0, 0}, [CMD_ADCRAW] = {adcraw, 0, 0, 3}, // need parno: 0..4 [CMD_ADCV] = {adcv, 0, 0, 3}, // need parno: 0..3 - [CMD_CANSPEED] = {canspeed, 50, 3000, 0}, + [CMD_CANSPEED] = {canspeed, CAN_MIN_SPEED, CAN_MAX_SPEED, 0}, [CMD_CANID] = {canid, 1, 0x7ff, 0}, [CMD_ADCMUL] = {adcmul, 0, 0, 3}, // at least parno [CMD_SAVECONF] = {saveconf, 0, 0, 0}, @@ -148,33 +148,39 @@ void run_can_cmd(CAN_message *msg){ for(int i = 0; i < msg->length; ++i){ USB_sendstr(uhex2str(msg->data[i])); USB_putbyte(' '); } - for(int i = msg->length-1; i < 8; ++i) msg->data[i] = 0; + //for(int i = msg->length-1; i < 8; ++i) msg->data[i] = 0; newline(); #endif if(datalen < 2){ - FORMERR(data, ERR_WRONGLEN); + FORMERR(msg, ERR_WRONGLEN); return; } uint16_t idx = *(uint16_t*)data; if(idx >= CMD_AMOUNT || funclist[idx].fn == NULL){ // bad command index - FORMERR(data, ERR_BADCMD); - return; + FORMERR(msg, ERR_BADCMD); return; } // check minimal length (2 or 3) if(funclist[idx].datalen > datalen){ - FORMERR(data, ERR_WRONGLEN); return; + FORMERR(msg, ERR_WRONGLEN); return; } if(datalen > 3 && (data[2] & SETTER_FLAG)){ // check setter's length - if(datalen != 8){ FORMERR(data, ERR_WRONGLEN); return; } + if(datalen != 8){ FORMERR(msg, ERR_WRONGLEN); return; } // check setter's values if(funclist[idx].maxval != funclist[idx].minval){ int32_t newval = *(int32_t*)&data[4]; if(newval < funclist[idx].minval || newval > funclist[idx].maxval){ - FORMERR(data, ERR_BADVAL); return; + FORMERR(msg, ERR_BADVAL); return; } } } data[3] = funclist[idx].fn(msg); // set error field as result of function data[2] &= ~SETTER_FLAG; // and clear setter flag +#ifdef EBUG + DBG("Return data: "); + for(int i = 0; i < msg->length; ++i){ + USB_sendstr(uhex2str(msg->data[i])); USB_putbyte(' '); + } + newline(); +#endif } diff --git a/F3:F303/CANbus4BTA/flash.c b/F3:F303/CANbus4BTA/flash.c index 94d8c52..d4366f8 100644 --- a/F3:F303/CANbus4BTA/flash.c +++ b/F3:F303/CANbus4BTA/flash.c @@ -35,8 +35,8 @@ static uint32_t maxCnum = 1024 / sizeof(user_conf); // can't use blocksize here .userconf_sz = sizeof(user_conf) \ ,.CANspeed = 100000 \ ,.CANID = 0xaa \ - ,.adcmul[0] = 1.f \ - ,.adcmul[1] = 1.f \ + ,.adcmul[0] = 10.930f \ + ,.adcmul[1] = 2.028f \ ,.adcmul[2] = 1.f \ ,.adcmul[3] = 1.f \ } @@ -145,12 +145,11 @@ static int write2flash(const void *start, const void *wrdata, uint32_t stor_size // erase Nth page of flash storage (flash should be prepared!) static int erase_pageN(int N){ int ret = 0; -#ifdef EBUG - USB_sendstr("Erase block #"); printu(N); newline(); -#endif FLASH->AR = (uint32_t)Flash_Data + N*FLASH_blocksize; FLASH->CR |= FLASH_CR_STRT; - while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; + uint32_t xx = 100000; + while((FLASH->SR & FLASH_SR_BSY) && --xx) IWDG->KR = IWDG_REFRESH; + if(xx == 0) return 1; FLASH->SR = FLASH_SR_EOP; if(FLASH->SR & FLASH_SR_WRPERR){ /* Check Write protection error */ ret = 1; @@ -167,8 +166,9 @@ int erase_storage(int npage){ flsz = FLASH_SIZE * 1024; // size in bytes flsz -= (uint32_t)Flash_Data - FLASH_BASE; } + DBG("total free blocks: "); printu(flsz / FLASH_blocksize); end = flsz / FLASH_blocksize; - if(end == 0 || end >= FLASH_SIZE) return 1; + if(end == 0) return 1; if(npage > -1){ // erase only one page if((uint32_t)npage >= end) return 1; start = npage; @@ -184,12 +184,15 @@ int erase_storage(int npage){ while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; FLASH->CR |= FLASH_CR_PER; + __disable_irq(); for(uint32_t i = start; i < end; ++i){ + IWDG->KR = IWDG_REFRESH; if(erase_pageN(i)){ ret = 1; break; } } + __enable_irq(); FLASH->CR &= ~FLASH_CR_PER; return ret; } diff --git a/F3:F303/CANbus4BTA/flash.h b/F3:F303/CANbus4BTA/flash.h index 4ce7036..5e1b871 100644 --- a/F3:F303/CANbus4BTA/flash.h +++ b/F3:F303/CANbus4BTA/flash.h @@ -33,8 +33,8 @@ */ typedef struct __attribute__((packed, aligned(4))){ uint16_t userconf_sz; // "magick number" - uint32_t CANspeed; // default CAN speed uint16_t CANID; // identifier + uint32_t CANspeed; // default CAN speed float adcmul[ADC_TSENS]; // ADC voltage multipliers } user_conf; diff --git a/F3:F303/CANbus4BTA/hardware.c b/F3:F303/CANbus4BTA/hardware.c index 71b0cb4..fa04be3 100644 --- a/F3:F303/CANbus4BTA/hardware.c +++ b/F3:F303/CANbus4BTA/hardware.c @@ -19,13 +19,41 @@ #include "adc.h" #include "hardware.h" #include "usart.h" +#include "usbhw.h" + +#ifndef EBUG +TRUE_INLINE void iwdg_setup(){ + uint32_t tmout = 16000000; + /* Enable the peripheral clock RTC */ + /* (1) Enable the LSI (40kHz) */ + /* (2) Wait while it is not ready */ + RCC->CSR |= RCC_CSR_LSION; /* (1) */ + while((RCC->CSR & RCC_CSR_LSIRDY) != RCC_CSR_LSIRDY){if(--tmout == 0) break;} /* (2) */ + /* Configure IWDG */ + /* (1) Activate IWDG (not needed if done in option bytes) */ + /* (2) Enable write access to IWDG registers */ + /* (3) Set prescaler by 64 (1.6ms for each tick) */ + /* (4) Set reload value to have a rollover each 2s */ + /* (5) Check if flags are reset */ + /* (6) Refresh counter */ + IWDG->KR = IWDG_START; /* (1) */ + IWDG->KR = IWDG_WRITE_ACCESS; /* (2) */ + IWDG->PR = IWDG_PR_PR_1; /* (3) */ + IWDG->RLR = 1250; /* (4) */ + tmout = 16000000; + while(IWDG->SR){if(--tmout == 0) break;} /* (5) */ + IWDG->KR = IWDG_REFRESH; /* (6) */ +} +#endif static inline void gpio_setup(){ RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; // PWM - AF1 @PA7; USB - alternate function 14 @ pins PA11/PA12; USART1 = AF7 @PA9/10; SWD - AF0 @PA13/14 GPIOA->AFR[0] = AFRf(1, 7); GPIOA->AFR[1] = AFRf(7, 9) | AFRf(7, 10) | AFRf(14, 11) | AFRf(14, 12); - // USART1: PA10(Rx), PA9(Tx); USB - PA11, PA12; SWDIO - PA13, PA14; + // PA4 - din (PU in), USART1: PA10(Rx, pullup), PA9(Tx); USB - PA11, PA12; SWDIO - PA13, PA14; PA8 & PA15 - PU in + GPIOA->PUPDR = (GPIOA->PUPDR & PUPD_CLR(4) & PUPD_CLR(8) & PUPD_CLR(10) & PUPD_CLR(15)) | + PUPD_PU(4) | PUPD_PU(8) | PUPD_PU(10) | PUPD_PU(15); GPIOA->MODER = MODER_AI(0) | MODER_AI(1) | MODER_AI(2) | MODER_AI(3) | MODER_I(4) | MODER_O(5) | MODER_O(6) | MODER_AF(7) | MODER_I(8) | MODER_AF(9) | MODER_AF(10) | MODER_AF(11) | MODER_AF(12) | MODER_AF(13) | MODER_AF(14) | MODER_I(15); @@ -33,6 +61,8 @@ static inline void gpio_setup(){ // SPI for SSI: AF5 @PB3, PB4; I2C1: AF4 @PB6, PB7; CAN: AF9 @PB8, PB9; SPI2: AF5 @PB12..PB15 GPIOB->AFR[0] = AFRf(5, 3) | AFRf(5, 4) | AFRf(4, 6) | AFRf(4, 7); GPIOB->AFR[1] = AFRf(9, 8) | AFRf(9, 9) | AFRf(5, 12) | AFRf(5, 13) | AFRf(5, 14) | AFRf(5, 15); + // PB10,11 - PU in + GPIOB->PUPDR = PUPD_PU(10) | PUPD_PU(11); GPIOB->MODER = MODER_O(0) | MODER_O(1) | MODER_O(2) | MODER_AF(3) | MODER_AF(4) | MODER_AF(6) | MODER_AF(7) | MODER_AF(8) | MODER_AF(9) | MODER_I(10) | MODER_I(11) | MODER_AF(12) | MODER_AF(13) | MODER_AF(14) | MODER_AF(15); @@ -44,5 +74,10 @@ static inline void gpio_setup(){ void hw_setup(){ gpio_setup(); adc_setup(); + //usart_setup(); - power it on only for encoders on RS-422 + USB_setup(); +#ifndef EBUG + iwdg_setup(); +#endif } diff --git a/F3:F303/CANbus4BTA/main.c b/F3:F303/CANbus4BTA/main.c index b4cce98..4263c36 100644 --- a/F3:F303/CANbus4BTA/main.c +++ b/F3:F303/CANbus4BTA/main.c @@ -31,6 +31,21 @@ void sys_tick_handler(void){ ++Tms; } +TRUE_INLINE void showCANmessages(){ + CAN_message *can_mesg = NULL; + while((can_mesg = CAN_messagebuf_pop())){ + IWDG->KR = IWDG_REFRESH; + printu(Tms); + USB_sendstr(" #"); + printuhex(can_mesg->ID); + for(int ctr = 0; ctr < can_mesg->length; ++ctr){ + USB_putbyte(' '); + printuhex(can_mesg->data[ctr]); + } + newline(); + } +} + int main(void){ char inbuff[MAXSTRLEN+1]; USBPU_OFF(); @@ -42,26 +57,31 @@ int main(void){ } flashstorage_init(); hw_setup(); - usart_setup(); - USB_setup(); CAN_setup(the_conf.CANspeed); USBPU_ON(); while(1){ + IWDG->KR = IWDG_REFRESH; CAN_proc(); - if(CAN_get_status() == CAN_FIFO_OVERRUN){ + CAN_status stat = CAN_get_status(); + if(stat == CAN_FIFO_OVERRUN){ USB_sendstr("CAN bus fifo overrun occured!\n"); + // TODO: buzzer short + }else if(stat == CAN_ERR){ + // TODO: buzzer errors + CAN_reinit(0); } - if(bufovr){ + if(cansniffer) showCANmessages(); + /*if(bufovr){ bufovr = 0; - usart_send("bufovr\n"); - } + USB_sendstr("error=uartoverflow\n"); + }*/ char *txt = NULL; if(usart_getline(&txt)){ const char *ans = run_text_cmd(txt); if(ans) usart_send(ans); } int l = USB_receivestr(inbuff, MAXSTRLEN); - if(l < 0) USB_sendstr("error=overflow\n"); + if(l < 0) USB_sendstr("error=usboverflow\n"); else if(l){ const char *ans = run_text_cmd(inbuff); if(ans) USB_sendstr(ans); diff --git a/F3:F303/CANbus4BTA/proto.h b/F3:F303/CANbus4BTA/proto.h index e76a122..5981ff8 100644 --- a/F3:F303/CANbus4BTA/proto.h +++ b/F3:F303/CANbus4BTA/proto.h @@ -35,7 +35,7 @@ #define NO_PARNO (0x1f) // make error for CAN answer -#define FORMERR(data, err) do{data[3] = err;}while(0) +#define FORMERR(m, err) do{m->data[3] = err; if(m->length < 4) m->length = 4;}while(0) // error codes for answer message typedef enum{ diff --git a/F3:F303/CANbus4BTA/textfunctions.c b/F3:F303/CANbus4BTA/textfunctions.c index 7985a7d..aff6ac3 100644 --- a/F3:F303/CANbus4BTA/textfunctions.c +++ b/F3:F303/CANbus4BTA/textfunctions.c @@ -19,6 +19,7 @@ #include #include +#include "can.h" #include "commonfunctions.h" #include "flash.h" #include "proto.h" @@ -32,10 +33,12 @@ // text-only commans indexes (0 is prohibited) typedef enum{ - TCMD_PROHIBITED - ,TCMD_WDTEST - ,TCMD_DUMPCONF - ,TCMD_AMOUNT + TCMD_PROHIBITED, // prohibited + TCMD_WDTEST, // test watchdog + TCMD_DUMPCONF, // dump configuration + TCMD_CANSNIF, // CAN sniffer/normal + TCMD_CANSEND, // send CAN message + TCMD_AMOUNT } text_cmd; @@ -47,15 +50,17 @@ typedef struct{ // list of all text functions; should be sorted and can be grouped static const funcdescr funclist[] = { - {"adcmul", CMD_ADCMUL, "get/set ADC multipliers 0..4 (*1000)"}, + {"adcmul", CMD_ADCMUL, "get/set ADC multipliers 0..3 (*1000)"}, {"adcraw", CMD_ADCRAW, "get raw ADC values of channel 0..4"}, {"adcv", CMD_ADCV, "get ADC voltage of channel 0..3 (*100V)"}, {"canid", CMD_CANID, "get/set CAN ID"}, + {"cansnif", -TCMD_CANSNIF, "get/change sniffer state (0 - normal, 1 - sniffer)"}, {"canspeed", CMD_CANSPEED, "get/set CAN speed (bps)"}, {"dumpconf", -TCMD_DUMPCONF, "dump current configuration"}, {"eraseflash", CMD_ERASESTOR, "erase all flash storage"}, {"mcutemp", CMD_MCUTEMP, "get MCU temperature (*10degrC)"}, {"reset", CMD_RESET, "reset MCU"}, + {"s", -TCMD_CANSEND, "send CAN message: ID 0..8 data bytes"}, {"saveconf", CMD_SAVECONF, "save configuration"}, {"time", CMD_TIME, "get/set time (ms)"}, {"wdtest", -TCMD_WDTEST, "test watchdog"}, @@ -72,9 +77,10 @@ static errcodes wdtest(const char _U_ *str){ static errcodes dumpconf(const char _U_ *str){ #ifdef EBUG - USB_sendstr("flashsize="); printu(FLASH_SIZE); USB_putbyte('*'); - printu(FLASH_blocksize); USB_putbyte('='); printu(FLASH_SIZE*FLASH_blocksize); - newline(); + uint32_t sz = FLASH_SIZE*1024; + USB_sendstr("flashsize="); printu(sz); USB_putbyte('/'); + printu(FLASH_blocksize); USB_putbyte('='); printu(sz/FLASH_blocksize); + USB_sendstr(" blocks\n"); #endif USB_sendstr("userconf_addr="); printuhex((uint32_t)Flash_Data); USB_sendstr("\nuserconf_idx="); printi(currentconfidx); @@ -91,19 +97,75 @@ static errcodes dumpconf(const char _U_ *str){ return ERR_OK; } +static errcodes cansnif(const char *str){ + uint32_t U; + if(str){ + if(*str == '=') str = omit_spaces(str + 1); + const char *nxt = getnum(str, &U); + if(nxt != str){ // setter + CAN_sniffer((uint8_t)U); + } + } + USB_sendstr("cansnif="); USB_putbyte('0' + cansniffer); newline(); + return ERR_OK; +} + +static errcodes cansend(const char *txt){ + CAN_message canmsg; + bzero(&canmsg, sizeof(canmsg)); + int ctr = -1; + canmsg.ID = 0xffff; + do{ + txt = omit_spaces(txt); + uint32_t N; + const char *n = getnum(txt, &N); + if(txt == n) break; + txt = n; + if(ctr == -1){ + if(N > 0x7ff){ + return ERR_BADPAR; + } + canmsg.ID = (uint16_t)(N&0x7ff); + ctr = 0; + continue; + } + if(ctr > 7){ + return ERR_WRONGLEN; + } + if(N > 0xff){ + return ERR_BADVAL; + } + canmsg.data[ctr++] = (uint8_t) N; + }while(1); + if(canmsg.ID == 0xffff){ + return ERR_BADPAR; + } + canmsg.length = (uint8_t) ctr; + uint32_t Tstart = Tms; + while(Tms - Tstart < SEND_TIMEOUT_MS){ + if(CAN_OK == CAN_send(&canmsg)){ + USB_sendstr("OK\n"); + return ERR_OK; + } + } + return ERR_CANTRUN; +} + /************ END of all common functions list (for `textfunctions`) ************/ // in `textfn` arg `str` is rest of input string (spaces-omitted) after command typedef errcodes (*textfn)(const char *str); // array of text-only functions static textfn textfunctions[TCMD_AMOUNT] = { - [TCMD_PROHIBITED] = NULL - ,[TCMD_WDTEST] = wdtest - ,[TCMD_DUMPCONF] = dumpconf + [TCMD_PROHIBITED] = NULL, + [TCMD_WDTEST] = wdtest, + [TCMD_DUMPCONF] = dumpconf, + [TCMD_CANSNIF] = cansnif, + [TCMD_CANSEND] = cansend, }; -static char stbuf[256], *bptr = NULL; -static int blen = 0; +static char stbuf[256], *bptr = stbuf; +static int blen = 255; static void initbuf(){bptr = stbuf; blen = 255; *bptr = 0;} static void bufputchar(char c){ if(blen == 0) return; @@ -111,6 +173,7 @@ static void bufputchar(char c){ *bptr = 0; } static void add2buf(const char *s){ + if(!s) return; while(blen && *s){ *bptr++ = *s++; --blen; @@ -121,7 +184,7 @@ static void add2buf(const char *s){ static void printhelp(){ const funcdescr *c = funclist; USB_sendstr("https://github.com/eddyem/stm32samples/tree/master/F3:F303/CANbus4BTA build#" BUILD_NUMBER " @ " BUILD_DATE "\n"); - USB_sendstr("commands format: parameter[number][=setter]"); + USB_sendstr("commands format: parameter[number][=setter]\n"); USB_sendstr("parameter [CAN idx] - help\n"); USB_sendstr("--------------------------\n"); while(c->help){ @@ -168,9 +231,10 @@ static void errtext(errcodes e){ * WARNING! Sending help works only for USB! */ char *run_text_cmd(const char *str){ + if(!str || !*str) goto ret; char cmd[MAXCMDLEN + 1]; errcodes ecode = ERR_BADCMD; - if(!str || !*str) goto ret; + initbuf(); int idx = CMD_AMOUNT; const funcdescr *c = funclist; int l = 0; @@ -185,13 +249,13 @@ char *run_text_cmd(const char *str){ idx = c->idx; break; } + ++c; } if(idx == CMD_AMOUNT){ // didn't found // send help over USB printhelp(); goto ret; } - initbuf(); str = omit_spaces(ptr); if(idx < 0){ // text-only function ecode = textfunctions[-idx](str); @@ -216,6 +280,7 @@ char *run_text_cmd(const char *str){ } str = omit_spaces(str); if(*str == '='){ // setter + ++str; ptr = getint(str, ((int32_t*)&data[4])); if(str == ptr){ ecode = ERR_BADVAL; @@ -234,7 +299,7 @@ ret: if(msg.length != 8){ return "OK\n"; // non setters/getters will just print "OK" if all OK }else{ - add2buf(funclist[idx].cmd); + add2buf(cmd); data[2] &= ~SETTER_FLAG; if(data[2] != NO_PARNO) add2buf(u2str(data[2])); bufputchar('='); diff --git a/F3:F303/CANbus4BTA/usb.c b/F3:F303/CANbus4BTA/usb.c index 0af5566..f2b4512 100644 --- a/F3:F303/CANbus4BTA/usb.c +++ b/F3:F303/CANbus4BTA/usb.c @@ -25,11 +25,11 @@ static volatile uint8_t usbbuff[USB_TXBUFSZ]; // temporary buffer for sending data // ring buffers for incoming and outgoing data static uint8_t obuf[RBOUTSZ], ibuf[RBINSZ]; -volatile ringbuffer rbout = {.data = obuf, .length = RBOUTSZ, .head = 0, .tail = 0}; -volatile ringbuffer rbin = {.data = ibuf, .length = RBINSZ, .head = 0, .tail = 0}; +static volatile ringbuffer rbout = {.data = obuf, .length = RBOUTSZ, .head = 0, .tail = 0}; +volatile ringbuffer rbin = {.data = ibuf, .length = RBINSZ, .head = 0, .tail = 0}; // used in usblib.c // transmission is succesfull -volatile uint8_t bufisempty = 1; -volatile uint8_t bufovrfl = 0; +static volatile uint8_t bufisempty = 1; +volatile uint8_t bufovrfl = 0; // used in usblib.c void send_next(){ if(bufisempty) return; diff --git a/F3:F303/CANbus4BTA/usb.h b/F3:F303/CANbus4BTA/usb.h index 18fc024..c20cc1d 100644 --- a/F3:F303/CANbus4BTA/usb.h +++ b/F3:F303/CANbus4BTA/usb.h @@ -37,8 +37,8 @@ #define DBG(str) #endif -extern volatile ringbuffer rbout, rbin; -extern volatile uint8_t bufisempty, bufovrfl; +extern volatile ringbuffer /* rbout, */ rbin; +extern volatile uint8_t /* bufisempty, */ bufovrfl; void send_next(); int USB_sendall(); @@ -48,10 +48,8 @@ int USB_sendstr(const char *string); int USB_receive(uint8_t *buf, int len); int USB_receivestr(char *buf, int len); -#ifdef EBUG #include "strfunc.h" #define printu(x) do{USB_sendstr(u2str(x));}while(0) #define printi(x) do{USB_sendstr(i2str(x));}while(0) #define printuhex(x) do{USB_sendstr(uhex2str(x));}while(0) #define printf(x) do{USB_sendstr(float2str(x, 2));}while(0) -#endif diff --git a/F3:F303/CANbus4BTA/version.inc b/F3:F303/CANbus4BTA/version.inc index f01306f..c14b316 100644 --- a/F3:F303/CANbus4BTA/version.inc +++ b/F3:F303/CANbus4BTA/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "22" -#define BUILD_DATE "2024-01-07" +#define BUILD_NUMBER "56" +#define BUILD_DATE "2024-01-08" diff --git a/makefile.stm32 b/makefile.stm32 index 6fb8ab5..207b3c7 100644 --- a/makefile.stm32 +++ b/makefile.stm32 @@ -47,7 +47,7 @@ LIB_DIR := $(INC_DIR)/ld ############################################################################### # C flags -CFLAGS += -O2 -D__thumb2__=1 -MD +CFLAGS += -D__thumb2__=1 -MD CFLAGS += -Wall -Wextra -Wshadow -Wdouble-promotion CFLAGS += -fshort-enums -ffunction-sections -fdata-sections #CFLAGS += -fno-common -fno-stack-protector @@ -91,12 +91,12 @@ endif BUILDDATE := $(shell date +%Y-%m-%d) # release: add LTO -release: CFLAGS += -flto +release: CFLAGS += -O2 -flto release: LDFLAGS += -flto release: $(TARGFILE) bin list size #debug: add debug flags -debug: CFLAGS += -DEBUG -Werror -g3 -gdwarf-2 +debug: CFLAGS += -O0 -DEBUG -Werror -g3 -gdwarf-2 debug: TARGET := DEBUG debug: $(TARGFILE) bin list size @@ -123,6 +123,7 @@ $(VERSION_FILE): *.[ch] @[ -f $(VERSION_FILE) ] || echo -e "#define BUILD_NUMBER \"0\"\n#define BUILD_DATE \"none\"" > $(VERSION_FILE) @echo " Generate version: $(NEXTVER) for date $(BUILDDATE)" @sed -i "s/#define BUILD_NUMBER.*/#define BUILD_NUMBER \"$(NEXTVER)\"/" $(VERSION_FILE) + @sed -i "s/#define BUILDNO.*/#define BUILDNO $(NEXTVER)/" $(VERSION_FILE) @sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$(BUILDDATE)\"/" $(VERSION_FILE) $(OBJDIR)/proto.o: proto.c $(VERSION_FILE)