mirror of
https://github.com/eddyem/stm32samples.git
synced 2026-02-28 03:44:30 +03:00
fixed some bugs in canUART for F103, add some features to usbcan_ringbuffer for F0
This commit is contained in:
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
CAN bus (PB8/PB9) <> UART1 (PA9/PA10)
|
||||
The same thing as canusb for STM32F0x2
|
||||
|
||||
Baudrate - 921600
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
// incoming message buffer size
|
||||
#define CAN_INMESSAGE_SIZE (8)
|
||||
extern uint32_t floodT;
|
||||
|
||||
// CAN message
|
||||
typedef struct{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
#define BUILD_NUMBER "64"
|
||||
#define BUILD_NUMBER "98"
|
||||
#define BUILD_DATE "2022-12-05"
|
||||
|
||||
Reference in New Issue
Block a user