From 59fb7317253505a7da02aa962fbb9a1ce3daabfb Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 5 Dec 2022 18:05:35 +0300 Subject: [PATCH] fixed some bugs in canUART for F103, add some features to usbcan_ringbuffer for F0 --- F0:F030,F042,F072/usbcan_ringbuffer/Makefile | 1 + F0:F030,F042,F072/usbcan_ringbuffer/can.c | 80 +++++---- F0:F030,F042,F072/usbcan_ringbuffer/can.h | 5 +- F0:F030,F042,F072/usbcan_ringbuffer/main.c | 2 +- F0:F030,F042,F072/usbcan_ringbuffer/proto.c | 61 +++++-- .../usbcan_ringbuffer/usbcan.bin | Bin 11168 -> 11256 bytes .../usbcan_ringbuffer/usbcanrb.cflags | 1 + .../usbcan_ringbuffer/usbcanrb.config | 5 + .../usbcan_ringbuffer/usbcanrb.creator | 1 + .../usbcan_ringbuffer/usbcanrb.creator.user | 160 ++++++++++++++++++ .../usbcan_ringbuffer/usbcanrb.cxxflags | 1 + .../usbcan_ringbuffer/usbcanrb.files | 16 ++ .../usbcan_ringbuffer/usbcanrb.includes | 6 + .../usbcan_ringbuffer/version.inc | 4 +- F1:F103/canUART/CANUART.bin | Bin 7648 -> 7900 bytes F1:F103/canUART/Makefile | 2 +- F1:F103/canUART/Readme.md | 2 + F1:F103/canUART/can.c | 3 +- F1:F103/canUART/can.h | 1 + F1:F103/canUART/main.c | 23 +-- F1:F103/canUART/proto.c | 35 ++-- F1:F103/canUART/usart.c | 48 ++++-- F1:F103/canUART/usart.h | 10 +- F1:F103/canUART/version.inc | 2 +- 24 files changed, 379 insertions(+), 90 deletions(-) create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.cflags create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.config create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.creator create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.creator.user create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.cxxflags create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.files create mode 100644 F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.includes diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/Makefile b/F0:F030,F042,F072/usbcan_ringbuffer/Makefile index f585984..a997924 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/Makefile +++ b/F0:F030,F042,F072/usbcan_ringbuffer/Makefile @@ -8,6 +8,7 @@ FAMILY ?= F0 MCU ?= F042x6 # change this linking script depending on particular MCU model, LDSCRIPT ?= stm32f042x6.ld +#DEFS = -DEBUG # autoincremental version & build date VERSION_FILE = version.inc diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/can.c b/F0:F030,F042,F072/usbcan_ringbuffer/can.c index 2727695..7076f51 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/can.c +++ b/F0:F030,F042,F072/usbcan_ringbuffer/can.c @@ -21,17 +21,14 @@ #include "proto.h" #include "usb.h" -#include // memcpy - // circular buffer for received messages static CAN_message messages[CAN_INMESSAGE_SIZE]; static uint8_t first_free_idx = 0; // index of first empty cell static int8_t first_nonfree_idx = -1; // index of first data cell static uint16_t oldspeed = 100; // speed of last init +uint32_t floodT = FLOOD_PERIOD_MS-1; // flood period in ms -#ifdef EBUG static uint32_t last_err_code = 0; -#endif static CAN_status can_status = CAN_STOP; static void can_process_fifo(uint8_t fifo_num); @@ -65,7 +62,7 @@ static int CAN_messagebuf_push(CAN_message *msg){ return 1; // no free space } if(first_nonfree_idx < 0) first_nonfree_idx = 0; // first message in empty buffer - memcpy(&messages[first_free_idx++], msg, sizeof(CAN_message)); + messages[first_free_idx++] = *msg; // need to roll? if(first_free_idx == CAN_INMESSAGE_SIZE) first_free_idx = 0; return 0; @@ -146,9 +143,7 @@ void CAN_setup(uint16_t speed){ /* (13) Set error interrupts enable */ CAN->MCR |= CAN_MCR_INRQ; /* (1) */ while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) /* (2) */ - { if(--tmout == 0) break; - } CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */ CAN->MCR |= CAN_MCR_ABOM; /* allow automatically bus-off */ @@ -174,6 +169,36 @@ void CAN_setup(uint16_t speed){ can_status = CAN_READY; } +void printCANerr(){ + if(!last_err_code) last_err_code = CAN->ESR; + if(!last_err_code){ + USB_sendstr("No errors\n"); + return; + } + USB_sendstr("Receive error counter: "); + printu((last_err_code & CAN_ESR_REC)>>24); + USB_sendstr("\nTransmit error counter: "); + printu((last_err_code & CAN_ESR_TEC)>>16); + USB_sendstr("\nLast error code: "); + int lec = (last_err_code & CAN_ESR_LEC) >> 4; + const char *errmsg = "No"; + switch(lec){ + case 1: errmsg = "Stuff"; break; + case 2: errmsg = "Form"; break; + case 3: errmsg = "Ack"; break; + case 4: errmsg = "Bit recessive"; break; + case 5: errmsg = "Bit dominant"; break; + case 6: errmsg = "CRC"; break; + case 7: errmsg = "(set by software)"; break; + } + USB_sendstr(errmsg); USB_sendstr(" error\n"); + if(last_err_code & CAN_ESR_BOFF) USB_sendstr("Bus off "); + if(last_err_code & CAN_ESR_EPVF) USB_sendstr("Passive error limit "); + if(last_err_code & CAN_ESR_EWGF) USB_sendstr("Error counter limit"); + last_err_code = 0; + USB_putbyte('\n'); +} + void can_proc(){ #ifdef EBUG if(last_err_code){ @@ -193,27 +218,7 @@ 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("Receive error counter: "); - printu((CAN->ESR & CAN_ESR_REC)>>24); - USB_sendstr("\nTransmit error counter: "); - printu((CAN->ESR & CAN_ESR_TEC)>>16); - USB_sendstr("\nLast error code: "); - int lec = (CAN->ESR & CAN_ESR_LEC) >> 4; - const char *errmsg = "No"; - switch(lec){ - case 1: errmsg = "Stuff"; break; - case 2: errmsg = "Form"; break; - case 3: errmsg = "Ack"; break; - case 4: errmsg = "Bit recessive"; break; - case 5: errmsg = "Bit dominant"; break; - case 6: errmsg = "CRC"; break; - case 7: errmsg = "(set by software)"; break; - } - USB_sendstr(errmsg); USB_sendstr(" error\n"); - if(CAN->ESR & CAN_ESR_BOFF) USB_sendstr("Bus off "); - if(CAN->ESR & CAN_ESR_EPVF) USB_sendstr("Passive error limit "); - if(CAN->ESR & CAN_ESR_EWGF) USB_sendstr("Error counter limit"); - USB_putbyte('\n'); + printCANerr(); // request abort for all mailboxes CAN->TSR |= CAN_TSR_ABRQ0 | CAN_TSR_ABRQ1 | CAN_TSR_ABRQ2; // reset CAN bus @@ -222,7 +227,7 @@ void can_proc(){ CAN_setup(0); } static uint32_t lastFloodTime = 0; - if(flood_msg && (Tms - lastFloodTime) > (FLOOD_PERIOD_MS-1)){ // flood every ~5ms + if(flood_msg && (Tms - lastFloodTime) > (floodT)){ // flood every ~5ms lastFloodTime = Tms; can_send(flood_msg->data, flood_msg->length, flood_msg->ID); } @@ -285,7 +290,21 @@ CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){ void set_flood(CAN_message *msg){ if(!msg) flood_msg = NULL; else{ - memcpy(&loc_flood_msg, msg, sizeof(CAN_message)); +#ifdef EBUG + USB_sendstr("flood msg: #"); + printuhex(msg->ID); + for(uint8_t ctr = 0; ctr < msg->length; ++ctr){ + USB_putbyte(' '); + printuhex(msg->data[ctr]); + } + USB_putbyte('\n'); +#endif + // I meet strange problems with `loc_flood_msg = *msg` and system memcpy, so.. + loc_flood_msg.ID = msg->ID; + loc_flood_msg.length = msg->length; + *((uint32_t*)loc_flood_msg.data) = *((uint32_t*)msg->data); + if(loc_flood_msg.length > 4) + *((uint32_t*)&loc_flood_msg.data[4]) = *((uint32_t*)&msg->data[4]); flood_msg = &loc_flood_msg; } } @@ -364,3 +383,4 @@ void cec_can_isr(){ #endif } } + diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/can.h b/F0:F030,F042,F072/usbcan_ringbuffer/can.h index 2ba2b03..50492be 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/can.h +++ b/F0:F030,F042,F072/usbcan_ringbuffer/can.h @@ -18,7 +18,7 @@ #pragma once -#include "hardware.h" +#include // amount of filter banks in STM32F0 #define STM32F0FBANKNO 28 @@ -28,6 +28,8 @@ // incoming message buffer size #define CAN_INMESSAGE_SIZE (8) +extern uint32_t floodT; + // CAN message typedef struct{ uint8_t data[8]; // up to 8 bytes of data @@ -50,6 +52,7 @@ void CAN_setup(uint16_t speed); CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id); void can_proc(); +void printCANerr(); CAN_message *CAN_messagebuf_pop(); diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/main.c b/F0:F030,F042,F072/usbcan_ringbuffer/main.c index 4506239..0b20083 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/main.c +++ b/F0:F030,F042,F072/usbcan_ringbuffer/main.c @@ -68,7 +68,7 @@ int main(void){ USB_sendstr(" #"); printuhex(can_mesg->ID); for(uint8_t ctr = 0; ctr < len; ++ctr){ - USB_putbyte('\n'); + USB_putbyte(' '); printuhex(can_mesg->data[ctr]); } USB_putbyte('\n'); diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/proto.c b/F0:F030,F042,F072/usbcan_ringbuffer/proto.c index 92b9a88..4624132 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/proto.c +++ b/F0:F030,F042,F072/usbcan_ringbuffer/proto.c @@ -137,6 +137,7 @@ static char *getbin(const char *buf, uint32_t *N){ char *getnum(const char *txt, uint32_t *N){ char *nxt = NULL; char *s = omit_spaces(txt); + if(!*s) return (char*)txt; if(*s == '0'){ // hex, oct or 0 if(s[1] == 'x' || s[1] == 'X'){ // hex nxt = gethex(s+2, N); @@ -166,7 +167,6 @@ static CAN_message *parseCANmsg(char *txt){ int ctr = -1; canmsg.ID = 0xffff; do{ - txt = omit_spaces(txt); n = getnum(txt, &N); if(txt == n) break; txt = n; @@ -200,16 +200,19 @@ static CAN_message *parseCANmsg(char *txt){ // USB_sendstr command, format: ID (hex/bin/dec) data bytes (up to 8 bytes, space-delimeted) TRUE_INLINE void USB_sendstrCANcommand(char *txt){ + if(CAN->MSR & CAN_MSR_INAK){ + USB_sendstr("CAN bus is off, try to restart it\n"); + return; + } CAN_message *msg = parseCANmsg(txt); if(!msg) return; - uint32_t N = 1000000; + uint32_t N = 5; while(CAN_BUSY == can_send(msg->data, msg->length, msg->ID)){ if(--N == 0) break; } } TRUE_INLINE void CANini(char *txt){ - txt = omit_spaces(txt); uint32_t N; char *n = getnum(txt, &N); if(txt == n){ @@ -318,6 +321,17 @@ TRUE_INLINE void list_filters(){ } } +TRUE_INLINE void setfloodt(char *s){ + uint32_t N; + s = omit_spaces(s); + char *n = getnum(s, &N); + if(s == n || N == 0){ + USB_sendstr("t="); printu(floodT); USB_putbyte('\n'); + return; + } + floodT = N - 1; +} + /** * @brief add_filter - add/modify filter * @param str - string in format "bank# FIFO# mode num0 .. num3" @@ -414,10 +428,12 @@ const char *helpmsg = "https://github.com/eddyem/stm32samples/tree/master/F0-nolib/usbcan_ringbuffer build#" BUILD_NUMBER " @ " BUILD_DATE "\n" "'a' - add ID to ignore list (max 10 IDs)\n" "'b' - reinit CAN with given baudrate\n" + "'c' - get CAN status\n" "'d' - delete ignore list\n" "'D' - activate DFU mode\n" + "'e' - get CAN errcodes\n" "'f' - add/delete filter, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]]\n" - "'F' - USB_sendstr/clear flood message: F ID byte0 ... byteN\n" + "'F' - send/clear flood message: F ID byte0 ... byteN\n" "'I' - reinit CAN\n" "'l' - list all active filters\n" "'o' - turn LEDs OFF\n" @@ -425,10 +441,22 @@ const char *helpmsg = "'p' - print ignore buffer\n" "'P' - pause/resume in packets displaying\n" "'R' - software reset\n" - "'s/S' - USB_sendstr data over CAN: s ID byte0 .. byteN\n" + "'s/S' - send data over CAN: s ID byte0 .. byteN\n" + "'t' - change flood period (>=1ms)\n" "'T' - get time from start (ms)\n" ; +TRUE_INLINE void getcanstat(){ + USB_sendstr("CAN_MSR="); + printuhex(CAN->MSR); + USB_sendstr("\nCAN_TSR="); + printuhex(CAN->TSR); + USB_sendstr("\nCAN_RF0R="); + printuhex(CAN->RF0R); + USB_sendstr("\nCAN_RF1R="); + printuhex(CAN->RF1R); +} + /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data @@ -436,37 +464,48 @@ const char *helpmsg = */ void cmd_parser(char *txt){ char _1st = txt[0]; + ++txt; /* * parse long commands here */ switch(_1st){ case 'a': - addIGN(txt + 1); + addIGN(txt); goto eof; break; case 'b': - CANini(txt + 1); + CANini(txt); goto eof; break; case 'f': - add_filter(txt + 1); + add_filter(txt); goto eof; break; case 'F': - set_flood(parseCANmsg(txt + 1)); + set_flood(parseCANmsg(txt)); goto eof; break; case 's': case 'S': - USB_sendstrCANcommand(txt + 1); + USB_sendstrCANcommand(txt); + goto eof; + break; + case 't': + setfloodt(txt); goto eof; break; } - if(txt[1] != '\n') *txt = '?'; // help for wrong message length + if(*txt != '\n') _1st = '?'; // help for wrong message length switch(_1st){ + case 'c': + getcanstat(); + break; case 'd': IgnSz = 0; break; + case 'e': + printCANerr(); + break; case 'D': USB_sendstr("Go into DFU mode\n"); USB_sendall(); diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/usbcan.bin b/F0:F030,F042,F072/usbcan_ringbuffer/usbcan.bin index bbaa173d16d8e178771ceb9423305979d5503f20..570f512203b90ead8c37a967d1ba6b41a741401b 100755 GIT binary patch delta 4245 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 delta 4195 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 mhqNVpKwHSmbv=bmkceN1UITK1v + + + + + EnvironmentId + {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + KOI8-R + false + 4 + false + 80 + true + true + 1 + false + false + false + 1 + true + true + 0 + 8 + true + false + 2 + true + true + true + *.md, *.MD, Makefile + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Desktop + {91347f2c-5221-46a7-80b1-0a054ca02f79} + 0 + 0 + 0 + + /home/eddy/Docs/SAO/ELECTRONICS/STM32/F0-srcs/usbcan_ringbuffer + + + + all + + true + GenericProjectManager.GenericMakeStep + + 1 + Сборка + Сборка + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + GenericProjectManager.GenericMakeStep + + 1 + Очистка + Очистка + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + По умолчанию + GenericProjectManager.GenericBuildConfiguration + + 1 + + + 0 + Развёртывание + Развёртывание + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + 2 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.cxxflags b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.cxxflags new file mode 100644 index 0000000..6435dfc --- /dev/null +++ b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.cxxflags @@ -0,0 +1 @@ +-std=c++17 \ No newline at end of file diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.files b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.files new file mode 100644 index 0000000..f1d9ab8 --- /dev/null +++ b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.files @@ -0,0 +1,16 @@ +can.c +can.h +hardware.c +hardware.h +main.c +proto.c +proto.h +ringbuffer.c +ringbuffer.h +usb.c +usb.h +usb_defs.h +usb_lib.c +usb_lib.h +usbhw.c +usbhw.h diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.includes b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.includes new file mode 100644 index 0000000..06d1130 --- /dev/null +++ b/F0:F030,F042,F072/usbcan_ringbuffer/usbcanrb.includes @@ -0,0 +1,6 @@ +. +../inc +../inc/Fx +../inc/cm +../inc/ld +../inc/startup diff --git a/F0:F030,F042,F072/usbcan_ringbuffer/version.inc b/F0:F030,F042,F072/usbcan_ringbuffer/version.inc index 57ec54d..154ebc2 100644 --- a/F0:F030,F042,F072/usbcan_ringbuffer/version.inc +++ b/F0:F030,F042,F072/usbcan_ringbuffer/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "1" -#define BUILD_DATE "2022-10-28" +#define BUILD_NUMBER "23" +#define BUILD_DATE "2022-12-05" diff --git a/F1:F103/canUART/CANUART.bin b/F1:F103/canUART/CANUART.bin index 67ae6200fc59092df05961f44b4ee6077170f873..1ea38a85be80c7530efde819d3679335718861b4 100755 GIT binary patch delta 4379 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 WPH7=R0xSY<9q2_FGD6Q_;QtrISS{`V delta 4153 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 XlS UART1 (PA9/PA10) The same thing as canusb for STM32F0x2 + +Baudrate - 921600 diff --git a/F1:F103/canUART/can.c b/F1:F103/canUART/can.c index 9d31b6f..937d5d8 100644 --- a/F1:F103/canUART/can.c +++ b/F1:F103/canUART/can.c @@ -30,6 +30,7 @@ static CAN_message messages[CAN_INMESSAGE_SIZE]; static uint8_t first_free_idx = 0; // index of first empty cell static int8_t first_nonfree_idx = -1; // index of first data cell static uint16_t oldspeed = 100; // speed of last init +uint32_t floodT = FLOOD_PERIOD_MS-1; // flood period in ms static uint32_t last_err_code = 0; static CAN_status can_status = CAN_STOP; @@ -229,7 +230,7 @@ void can_proc(){ CAN_setup(0); } static uint32_t lastFloodTime = 0; - if(flood_msg && (Tms - lastFloodTime) > (FLOOD_PERIOD_MS-1)){ // flood every ~5ms + if(flood_msg && (Tms - lastFloodTime) > (floodT)){ // flood every ~5ms lastFloodTime = Tms; can_send(flood_msg->data, flood_msg->length, flood_msg->ID); } diff --git a/F1:F103/canUART/can.h b/F1:F103/canUART/can.h index fa09374..4ba1eb6 100644 --- a/F1:F103/canUART/can.h +++ b/F1:F103/canUART/can.h @@ -27,6 +27,7 @@ // incoming message buffer size #define CAN_INMESSAGE_SIZE (8) +extern uint32_t floodT; // CAN message typedef struct{ diff --git a/F1:F103/canUART/main.c b/F1:F103/canUART/main.c index 833e4be..0fb0694 100644 --- a/F1:F103/canUART/main.c +++ b/F1:F103/canUART/main.c @@ -30,9 +30,7 @@ void sys_tick_handler(void){ int main(void){ uint32_t lastT = 0; -#ifdef BLUEPILL uint32_t bplastT = 0; -#endif CAN_message *can_mesg; StartHSE(); SysTick_Config(72000); @@ -50,12 +48,13 @@ int main(void){ LED_off(LED0); lastT = 0; } -#ifdef BLUEPILL if(Tms - bplastT > 499){ + usart_transmit(); +#ifdef BLUEPILL pin_toggle(LEDB_port, LEDB_pin); +#endif bplastT = Tms; } -#endif can_proc(); CAN_status st = CAN_get_status(); if(st == CAN_FIFO_OVERRUN){ @@ -63,30 +62,34 @@ int main(void){ }else if(st == CAN_ERR){ usart_send("Some CAN error occured\n"); } + int errflag = 0; while((can_mesg = CAN_messagebuf_pop())){ + IWDG->KR = IWDG_REFRESH; if(can_mesg && isgood(can_mesg->ID)){ LED_on(LED0); lastT = Tms; if(!lastT) lastT = 1; if(ShowMsgs){ // new data in buff - IWDG->KR = IWDG_REFRESH; uint8_t len = can_mesg->length; printu(Tms); - usart_send(" #"); + if(!usart_send(" #")) errflag = 1; printuhex(can_mesg->ID); for(uint8_t ctr = 0; ctr < len; ++ctr){ - usart_putchar(' '); + if(!usart_putchar(' ')) errflag = 1; printuhex(can_mesg->data[ctr]); } - usart_putchar('\n'); + if(!usart_putchar('\n')) errflag = 1; } } } char *str; int g = usart_getline(&str); - if(g < 0) usart_send("USART buffer overflow!\n"); + if(g < 0) usart_send("USART IN buffer overflow!\n"); else if(g > 0) cmd_parser(str); - usart_transmit(); + if(errflag){ + while(!usart_txrdy) IWDG->KR = IWDG_REFRESH; + usart_send("USART OUT buffer overflow!\n"); + } } return 0; } diff --git a/F1:F103/canUART/proto.c b/F1:F103/canUART/proto.c index aae7b3c..997e7da 100644 --- a/F1:F103/canUART/proto.c +++ b/F1:F103/canUART/proto.c @@ -137,6 +137,7 @@ static char *getbin(const char *buf, uint32_t *N){ char *getnum(const char *txt, uint32_t *N){ char *nxt = NULL; char *s = omit_spaces(txt); + if(!*s) return (char*)txt; if(*s == '0'){ // hex, oct or 0 if(s[1] == 'x' || s[1] == 'X'){ // hex nxt = gethex(s+2, N); @@ -166,7 +167,6 @@ static CAN_message *parseCANmsg(char *txt){ int ctr = -1; canmsg.ID = 0xffff; do{ - txt = omit_spaces(txt); n = getnum(txt, &N); if(txt == n) break; txt = n; @@ -206,14 +206,13 @@ TRUE_INLINE void usart_sendCANcommand(char *txt){ } CAN_message *msg = parseCANmsg(txt); if(!msg) return; - uint32_t N = 3; + uint32_t N = 5; while(CAN_BUSY == can_send(msg->data, msg->length, msg->ID)){ if(--N == 0) break; } } TRUE_INLINE void CANini(char *txt){ - txt = omit_spaces(txt); uint32_t N; char *n = getnum(txt, &N); if(txt == n){ @@ -237,7 +236,6 @@ TRUE_INLINE void addIGN(char *txt){ usart_send("Ignore buffer is full"); return; } - txt = omit_spaces(txt); uint32_t N; char *n = getnum(txt, &N); if(txt == n){ @@ -333,7 +331,6 @@ TRUE_INLINE void list_filters(){ */ static void add_filter(char *str){ uint32_t N; - str = omit_spaces(str); char *n = getnum(str, &N); if(n == str){ usart_send("No bank# given"); @@ -431,6 +428,7 @@ const char *helpmsg = "'P' - pause/resume in packets displaying\n" "'R' - software reset\n" "'s/S' - usart_send data over CAN: s ID byte0 .. byteN\n" + "'t' - change flood period (>=1ms)\n" "'T' - get time from start (ms)\n" ; @@ -445,39 +443,54 @@ TRUE_INLINE void getcanstat(){ printuhex(CAN1->RF1R); } +TRUE_INLINE void setfloodt(char *s){ + uint32_t N; + char *n = getnum(s, &N); + if(s == n || N == 0){ + usart_send("t="); printu(floodT); usart_putchar('\n'); + return; + } + floodT = N - 1; +} + /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data */ void cmd_parser(char *txt){ char _1st = txt[0]; + ++txt; /* * parse long commands here */ switch(_1st){ case 'a': - addIGN(txt + 1); + addIGN(txt); goto eof; break; case 'b': - CANini(txt + 1); + CANini(txt); goto eof; break; case 'f': - add_filter(txt + 1); + add_filter(txt); goto eof; break; case 'F': - set_flood(parseCANmsg(txt + 1)); + set_flood(parseCANmsg(txt)); goto eof; break; case 's': case 'S': - usart_sendCANcommand(txt + 1); + usart_sendCANcommand(txt); + goto eof; + break; + case 't': + setfloodt(txt); goto eof; break; } - if(txt[1] != '\n') *txt = '?'; // help for wrong message length + if(txt[1] != 0) _1st = '?'; // help for wrong message length switch(_1st){ case 'c': getcanstat(); diff --git a/F1:F103/canUART/usart.c b/F1:F103/canUART/usart.c index 7927473..9c0035b 100644 --- a/F1:F103/canUART/usart.c +++ b/F1:F103/canUART/usart.c @@ -53,11 +53,18 @@ int usart_getline(char **line){ } // transmit current tbuf and swap buffers -void usart_transmit(){ +int usart_transmit(){ register int l = odatalen[tbufno]; - if(!l) return; - uint32_t tmout = 16000000; - while(!usart_txrdy){if(--tmout == 0) return;}; // wait for previos buffer transmission + if(!l) return 0; + uint32_t tmout = 1600000; +/*tbuf[tbufno][0] = '*'; +tbuf[tbufno][1] = '0' + tbufno; +tbuf[tbufno][l-1] = '*'; +tbuf[tbufno][l-2] = '0' + tbufno;*/ + while(!usart_txrdy){ + IWDG->KR = IWDG_REFRESH; + if(--tmout == 0) return 0; + }; // wait for previos buffer transmission usart_txrdy = 0; odatalen[tbufno] = 0; DMA1_Channel4->CCR &= ~DMA_CCR_EN; @@ -65,18 +72,27 @@ void usart_transmit(){ DMA1_Channel4->CNDTR = l; DMA1_Channel4->CCR |= DMA_CCR_EN; tbufno = !tbufno; + return l; } -void usart_putchar(const char ch){ - if(odatalen[tbufno] == UARTBUFSZO) usart_transmit(); - tbuf[tbufno][odatalen[tbufno]++] = ch; -} - -void usart_send(const char *str){ - while(*str){ - if(odatalen[tbufno] == UARTBUFSZO) usart_transmit(); - tbuf[tbufno][odatalen[tbufno]++] = *str++; +int usart_putchar(const char ch){ + if(odatalen[tbufno] == UARTBUFSZO){ + if(!usart_transmit()) return 0; } + tbuf[tbufno][odatalen[tbufno]++] = ch; + return 1; +} + +int usart_send(const char *str){ + int l = 0; + while(*str){ + if(odatalen[tbufno] == UARTBUFSZO){ + if(!usart_transmit()) return 0; + } + tbuf[tbufno][odatalen[tbufno]++] = *str++; + ++l; + } + return l; } /* @@ -102,7 +118,7 @@ void usart_setup(){ NVIC_EnableIRQ(DMA1_Channel4_IRQn); NVIC_SetPriority(USART1_IRQn, 0); // setup usart1 - USART1->BRR = 72000000 / 115200; + USART1->BRR = 72000000 / 921600; USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART while(!(USART1->SR & USART_SR_TC)){if(--tmout == 0) break;} // polling idle frame Transmission USART1->SR = 0; // clear flags @@ -116,15 +132,15 @@ void usart1_isr(){ if(USART1->SR & USART_SR_RXNE){ // RX not emty - receive next char uint8_t rb = USART1->DR; if(idatalen[rbufno] < UARTBUFSZI){ // put next char into buf - rbuf[rbufno][idatalen[rbufno]++] = rb; if(rb == '\n'){ // got newline - line ready + rbuf[rbufno][idatalen[rbufno]] = 0; usart_linerdy = 1; dlen = idatalen[rbufno]; recvdata = rbuf[rbufno]; // prepare other buffer rbufno = !rbufno; idatalen[rbufno] = 0; - } + }else rbuf[rbufno][idatalen[rbufno]++] = rb; }else{ // buffer overrun usart_bufovr = 1; idatalen[rbufno] = 0; diff --git a/F1:F103/canUART/usart.h b/F1:F103/canUART/usart.h index 3d20150..78af94b 100644 --- a/F1:F103/canUART/usart.h +++ b/F1:F103/canUART/usart.h @@ -19,16 +19,16 @@ #pragma once // input and output buffers size -#define UARTBUFSZI (128) -#define UARTBUFSZO (128) +#define UARTBUFSZI (256) +#define UARTBUFSZO (1024) #define usartrx() (usart_linerdy) #define usartovr() (usart_bufovr) extern volatile int usart_txrdy; -void usart_transmit(); +int usart_transmit(); void usart_setup(); int usart_getline(char **line); -void usart_send(const char *str); -void usart_putchar(const char ch); +int usart_send(const char *str); +int usart_putchar(const char ch); diff --git a/F1:F103/canUART/version.inc b/F1:F103/canUART/version.inc index fc513df..a292e52 100644 --- a/F1:F103/canUART/version.inc +++ b/F1:F103/canUART/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "64" +#define BUILD_NUMBER "98" #define BUILD_DATE "2022-12-05"