fixed some bugs in canUART for F103, add some features to usbcan_ringbuffer for F0

This commit is contained in:
2022-12-05 18:05:35 +03:00
parent cfff079dba
commit 59fb731725
24 changed files with 379 additions and 90 deletions

Binary file not shown.

View File

@@ -157,6 +157,6 @@ dfuboot: $(BIN)
openocd:
openocd -f openocd.cfg
dbg:
arm-none-eabi-gdb $(ELF) -ex 'target remote localhost:3333' -ex 'monitor reset halt'
arm-none-eabi-gdb $(ELF) -ex 'target extended-remote localhost:3333' -ex 'monitor reset halt'
.PHONY: size clean flash boot dfuboot openocd dbg

View File

@@ -1,2 +1,4 @@
CAN bus (PB8/PB9) <> UART1 (PA9/PA10)
The same thing as canusb for STM32F0x2
Baudrate - 921600

View File

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

View File

@@ -27,6 +27,7 @@
// incoming message buffer size
#define CAN_INMESSAGE_SIZE (8)
extern uint32_t floodT;
// CAN message
typedef struct{

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,2 +1,2 @@
#define BUILD_NUMBER "64"
#define BUILD_NUMBER "98"
#define BUILD_DATE "2022-12-05"