From 7f44a6096552693c10dad6ea0bcdeb962075adfc Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 2 Jun 2025 17:03:42 +0300 Subject: [PATCH] fix code for new PCB --- F1:F103/BISS_C_encoders/Makefile | 4 +- F1:F103/BISS_C_encoders/encoders.bin | Bin 13336 -> 13972 bytes F1:F103/BISS_C_encoders/encoders.creator.user | 4 +- .../encoders.creator.user.7bd84e3 | 183 ++++++++++++++++++ F1:F103/BISS_C_encoders/encoders.files | 2 + F1:F103/BISS_C_encoders/flash.h | 1 + F1:F103/BISS_C_encoders/hardware.c | 6 +- F1:F103/BISS_C_encoders/hardware.h | 6 +- F1:F103/BISS_C_encoders/main.c | 25 ++- F1:F103/BISS_C_encoders/proto.c | 28 ++- F1:F103/BISS_C_encoders/usart.c | 107 ++++++++++ F1:F103/BISS_C_encoders/usart.h | 10 +- F1:F103/BISS_C_encoders/version.inc | 4 +- 13 files changed, 357 insertions(+), 23 deletions(-) create mode 100644 F1:F103/BISS_C_encoders/encoders.creator.user.7bd84e3 create mode 100644 F1:F103/BISS_C_encoders/usart.c diff --git a/F1:F103/BISS_C_encoders/Makefile b/F1:F103/BISS_C_encoders/Makefile index 46fa24e..3aa2506 100644 --- a/F1:F103/BISS_C_encoders/Makefile +++ b/F1:F103/BISS_C_encoders/Makefile @@ -1,8 +1,8 @@ BINARY := encoders # MCU code -MCU ?= F103x8 +MCU ?= F103xB # change this linking script depending on particular MCU model, -LDSCRIPT ?= stm32f103x8.ld +LDSCRIPT ?= stm32f103xB.ld DEFINES := -DSTM32F10X_MD include ../makefile.f1 diff --git a/F1:F103/BISS_C_encoders/encoders.bin b/F1:F103/BISS_C_encoders/encoders.bin index 41a4e130bd4bf7b6bf212566d1d6e9cffe7ef8e2..ad542cee7060b305be888d43cfc9f6be6dfa03af 100755 GIT binary patch delta 5751 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 delta 5130 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 F{ufcws!{*| diff --git a/F1:F103/BISS_C_encoders/encoders.creator.user b/F1:F103/BISS_C_encoders/encoders.creator.user index f99097b..48b5440 100644 --- a/F1:F103/BISS_C_encoders/encoders.creator.user +++ b/F1:F103/BISS_C_encoders/encoders.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -13,8 +13,8 @@ ProjectExplorer.Project.EditorSettings + true true - false true Cpp diff --git a/F1:F103/BISS_C_encoders/encoders.creator.user.7bd84e3 b/F1:F103/BISS_C_encoders/encoders.creator.user.7bd84e3 new file mode 100644 index 0000000..6d3b983 --- /dev/null +++ b/F1:F103/BISS_C_encoders/encoders.creator.user.7bd84e3 @@ -0,0 +1,183 @@ + + + + + + EnvironmentId + {7bd84e39-ca37-46d3-be9d-99ebea85bc0d} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + KOI8-R + false + 4 + false + 0 + 80 + true + true + 1 + 0 + false + true + false + 0 + true + true + 0 + 8 + true + false + 1 + true + false + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + false + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 8 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Desktop + {65a14f9e-e008-4c1b-89df-4eaa4774b6e3} + 0 + 0 + 0 + + + + + all + + true + GenericProjectManager.GenericMakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + GenericProjectManager.GenericMakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Default + GenericProjectManager.GenericBuildConfiguration + + 1 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/F1:F103/BISS_C_encoders/encoders.files b/F1:F103/BISS_C_encoders/encoders.files index ee57130..f2d5915 100644 --- a/F1:F103/BISS_C_encoders/encoders.files +++ b/F1:F103/BISS_C_encoders/encoders.files @@ -13,6 +13,8 @@ spi.c spi.h strfunc.c strfunc.h +usart.c +usart.h usb_descr.c usb_descr.h usb_lib.c diff --git a/F1:F103/BISS_C_encoders/flash.h b/F1:F103/BISS_C_encoders/flash.h index cf4b5ff..99a164f 100644 --- a/F1:F103/BISS_C_encoders/flash.h +++ b/F1:F103/BISS_C_encoders/flash.h @@ -45,6 +45,7 @@ typedef struct{ */ typedef struct __attribute__((packed, aligned(4))){ uint16_t userconf_sz; // "magick number" + uint16_t send232_interval; // interval (ms) of sending data to SSII over RS-232 (or 0 - not to send) uint16_t iInterface[bTotNumEndpoints][MAX_IINTERFACE_SZ]; // hryunikod! uint8_t iIlengths[bTotNumEndpoints]; uint8_t encbits; // encoder bits: 26 or 32 diff --git a/F1:F103/BISS_C_encoders/hardware.c b/F1:F103/BISS_C_encoders/hardware.c index 82725f8..dd803e2 100644 --- a/F1:F103/BISS_C_encoders/hardware.c +++ b/F1:F103/BISS_C_encoders/hardware.c @@ -26,11 +26,11 @@ static inline void gpio_setup(){ // AFIO->MAPR = AFIO_MAPR_SWJ_CFG_DISABLE; AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // for PA15 // Set led as opendrain output - GPIOC->CRH |= CRH(13, CNF_ODOUTPUT|MODE_SLOW); + //GPIOC->CRH |= CRH(13, CNF_ODOUTPUT|MODE_SLOW); // SPI1 pins //GPIOA->CRL = CRL(5, CNF_AFPP|MODE_FAST) | CRL(6, CNF_FLINPUT); - // USB pullup (PA15) - pushpull output - GPIOA->CRH = CRH(15, CNF_PPOUTPUT|MODE_SLOW); + // USB pullup (PA10) - pushpull output + GPIOA->CRH = CRH(10, CNF_PPOUTPUT|MODE_SLOW); // SPI2 pins //GPIOB->CRH = CRH(13, CNF_AFPP|MODE_FAST) | CRH(14, CNF_FLINPUT); } diff --git a/F1:F103/BISS_C_encoders/hardware.h b/F1:F103/BISS_C_encoders/hardware.h index e7bfb32..584e438 100644 --- a/F1:F103/BISS_C_encoders/hardware.h +++ b/F1:F103/BISS_C_encoders/hardware.h @@ -25,9 +25,9 @@ // USB pullup (not present in bluepill, should be soldered) - PA15 #define USBPU_port GPIOA -#define USBPU_pin (1<<15) -#define USBPU_ON() pin_set(USBPU_port, USBPU_pin) -#define USBPU_OFF() pin_clear(USBPU_port, USBPU_pin) +#define USBPU_pin (1<<10) +#define USBPU_ON() pin_clear(USBPU_port, USBPU_pin) +#define USBPU_OFF() pin_set(USBPU_port, USBPU_pin) #define LED_blink(x) pin_toggle(x ## _port, x ## _pin) #define LED_on(x) pin_clear(x ## _port, x ## _pin) diff --git a/F1:F103/BISS_C_encoders/main.c b/F1:F103/BISS_C_encoders/main.c index d3f43bc..c75c52d 100644 --- a/F1:F103/BISS_C_encoders/main.c +++ b/F1:F103/BISS_C_encoders/main.c @@ -22,7 +22,7 @@ #include "proto.h" #include "spi.h" #include "strfunc.h" -//#include "usart.h" +#include "usart.h" #include "usb_dev.h" volatile uint32_t Tms = 0; @@ -49,6 +49,7 @@ static void printResult(BiSS_Frame *result){ static void proc_enc(uint8_t idx){ static uint32_t lastMSG[2], gotgood[2], gotwrong[2]; + static uint32_t lastXval = 0, usartT = 0; int iface = idx ? I_Y : I_X; char ifacechr = idx ? 'Y' : 'X'; if(CDCready[iface]){ @@ -71,6 +72,13 @@ static void proc_enc(uint8_t idx){ if(!encbuf) return; BiSS_Frame result = parse_biss_frame(encbuf, the_conf.encbufsz); char *str = result.crc_valid ? u2str(result.data) : NULL; + if(result.crc_valid){ + if(idx == 0) lastXval = result.data; + else if(the_conf.send232_interval && Tms - usartT >= the_conf.send232_interval){ + usart_send_enc(lastXval, result.data); + usartT = Tms; + } + } uint8_t testflag = (idx) ? user_pars.testy : user_pars.testx; if(CDCready[I_CMD]){ if(testflag){ @@ -109,7 +117,7 @@ static void proc_enc(uint8_t idx){ } int main(){ - uint32_t lastT = 0; + uint32_t lastT = 0, usartT = 0; StartHSE(); flashstorage_init(); hw_setup(); @@ -119,11 +127,12 @@ int main(){ #ifndef EBUG iwdg_setup(); #endif + usart_setup(); USBPU_ON(); while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog if(Tms - lastT > 499){ - LED_blink(LED0); + //LED_blink(LED0); lastT = Tms; } if(CDCready[I_CMD]){ @@ -133,11 +142,19 @@ int main(){ } proc_enc(0); proc_enc(1); + int started[2] = {0, 0}; if(the_conf.flags.monit){ for(int i = 0; i < 2; ++i){ - if(Tms - monitT[i] >= the_conf.monittime) spi_start_enc(i); + if(Tms - monitT[i] >= the_conf.monittime){ + spi_start_enc(i); + started[i] = 1; + } } } + if(the_conf.send232_interval && Tms - usartT >= the_conf.send232_interval){ + for(int i = 0; i < 2; ++i) if(!started[i]) spi_start_enc(i); + usartT = Tms; + } } return 0; } diff --git a/F1:F103/BISS_C_encoders/proto.c b/F1:F103/BISS_C_encoders/proto.c index b99ac90..2a7b315 100644 --- a/F1:F103/BISS_C_encoders/proto.c +++ b/F1:F103/BISS_C_encoders/proto.c @@ -22,6 +22,7 @@ #include "proto.h" #include "spi.h" #include "strfunc.h" +#include "usart.h" #include "usb_dev.h" #include "version.inc" @@ -77,6 +78,8 @@ typedef enum{ C_maxzeros, C_autom, C_amperiod, + C_usart, + C_ssii, C_AMOUNT } cmd_e; @@ -257,6 +260,10 @@ static errcode_e setuintpar(cmd_e idx, char *par){ if(val > 255 || val == 0) return ERR_BADPAR; the_conf.monittime = val; break; + case C_ssii: + if(val > UINT16_MAX) return ERR_BADPAR; + the_conf.send232_interval = val; + break; default: return ERR_BADCMD; } @@ -282,6 +289,9 @@ static errcode_e setuintpar(cmd_e idx, char *par){ case C_amperiod: val = the_conf.monittime; break; + case C_ssii: + val = the_conf.send232_interval; + break; default: return ERR_BADCMD; } @@ -358,9 +368,15 @@ static errcode_e dumpconf(cmd_e _U_ idx, char _U_ *par){ setuintpar(C_encbufsz, NULL); setuintpar(C_maxzeros, NULL); setuintpar(C_minzeros, NULL); + setuintpar(C_ssii, NULL); return ERR_SILENCE; } +static errcode_e usart(cmd_e _U_ idx, char _U_ *par){ + usart_send_enc(0xdeadbeef, 0xbeefdead); + return ERR_OK; +} + // text commands static const funcdescr_t commands[C_AMOUNT] = { [C_dummy] = {"dummy", dummy}, @@ -392,6 +408,8 @@ static const funcdescr_t commands[C_AMOUNT] = { [C_maxzeros] = {"maxzeros", setuintpar}, [C_autom] = {"autom", setboolpar}, [C_amperiod] = {"amperiod", setuintpar}, + [C_usart] = {"usart", usart}, + [C_ssii] = {"ssii", setuintpar}, }; typedef struct{ @@ -425,6 +443,7 @@ static const help_t helpmessages[] = { {C_setiface1, "set name of first (command) interface"}, {C_setiface2, "set name of second (axis X) interface"}, {C_setiface3, "set name of third (axis Y) interface"}, + {C_ssii, "change interval (ms) of sending enc data to SSII (0 - don't send)"}, {C_storeconf, "store configuration in flash memory"}, {-1, "Debug commands"}, {C_dummy, "dummy integer setter/getter"}, @@ -433,11 +452,18 @@ static const help_t helpmessages[] = { {C_sendY, "send text string to Y encoder's terminal"}, {C_testX, "test X-axis throughput"}, {C_testY, "test Y-axis throughput"}, + {C_usart, "send test encoders data over usart"}, {-1, NULL}, }; static errcode_e help(_U_ cmd_e idx, _U_ char* par){ - CMDWRn("https://github.com/eddyem/stm32samples/tree/master/F1:F103/BISS_C_encoders build #" BUILD_NUMBER " @ " BUILD_DATE); + CMDWRn("https://github.com/eddyem/stm32samples/tree/master/F1:F103/BISS_C_encoders " +#ifdef EBUG + "debug " +#else + "release " +#endif + "build #" BUILD_NUMBER " @ " BUILD_DATE); CMDWRn("\ncommands format: 'command[=setter]\\n'"); const help_t *c = helpmessages; while(c->help){ diff --git a/F1:F103/BISS_C_encoders/usart.c b/F1:F103/BISS_C_encoders/usart.c new file mode 100644 index 0000000..e4702e7 --- /dev/null +++ b/F1:F103/BISS_C_encoders/usart.c @@ -0,0 +1,107 @@ +/* + * usart.c + * + * Copyright 2018 Edward V. Emelianoff + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include + +#include "stm32f1.h" +#include "usart.h" + +// magick starting sequence +#define ENC_MAGICK (204) + +// buffers for out ringbuffer and DMA send +static uint8_t txbuf[UARTBUFSZ]; +static volatile int usart_txrdy = 1; // transmission done + +void usart_send(const uint8_t *buf, int buflen){ + while(!usart_txrdy); + if(buflen > UARTBUFSZ) buflen = UARTBUFSZ; + memcpy(txbuf, buf, buflen); + DMA1_Channel7->CCR &= ~DMA_CCR_EN; + DMA1_Channel7->CMAR = (uint32_t) txbuf; // mem + DMA1_Channel7->CNDTR = buflen; + usart_txrdy = 0; + DMA1_Channel7->CCR |= DMA_CCR_EN; +} + +// encoders raw data +typedef struct __attribute__((packed)){ + uint8_t magick; + uint32_t encY; + uint32_t encX; + uint8_t crc[4]; +} enc_t; + +void usart_send_enc(uint32_t encX, uint32_t encY){ + enc_t edata; + uint8_t *databuf = (uint8_t*) &edata; + uint32_t POS_SUM = 0; + for(int i = 1; i < 9; ++i) POS_SUM += databuf[i]; + edata.crc[0] = POS_SUM >> 8; + edata.crc[1] = ((0xFFFF - POS_SUM) & 0xFF) - edata.crc[0]; + edata.crc[2] = (0xFFFF - POS_SUM) >> 8; + edata.crc[3] = 0; + edata.magick = ENC_MAGICK; + edata.encX = encX; + edata.encY = encY; + usart_send(databuf, sizeof(enc_t)); +} + +/* + * USART2 speed: baudrate = Fck/(USARTDIV) + * USARTDIV stored in USART->BRR + * + * for 36MHz USARTDIV=36000/f(kboud) + */ +void usart_setup(){ + uint32_t tmout = 16000000; + // PA9 - Tx, PA10 - Rx + RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN; + RCC->APB1ENR |= RCC_APB1ENR_USART2EN; + RCC->AHBENR |= RCC_AHBENR_DMA1EN; + GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF2 | GPIO_CRL_CNF3)) | + CRL(2, CNF_AFPP|MODE_NORMAL) | CRL(3, CNF_FLINPUT|MODE_INPUT); + + // USART1 Tx DMA - Channel4 (Rx - channel 5) + DMA1_Channel7->CPAR = (uint32_t) &USART2->DR; // periph + DMA1_Channel7->CCR |= DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 8bit, mem++, mem->per, transcompl irq + // Tx CNDTR set @ each transmission due to data size + NVIC_SetPriority(DMA1_Channel7_IRQn, 3); + NVIC_EnableIRQ(DMA1_Channel7_IRQn); + //NVIC_SetPriority(USART1_IRQn, 0); + // setup usart1 + USART2->BRR = 36000000 / 153000; + USART2->CR1 = USART_CR1_TE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART + while(!(USART1->SR & USART_SR_TC)){ + IWDG->KR = IWDG_REFRESH; + if(--tmout == 0) break; + } // polling idle frame Transmission + USART2->SR = 0; // clear flags + USART2->CR1 |= USART_CR1_RXNEIE; // allow Rx IRQ + USART2->CR3 = USART_CR3_DMAT; // enable DMA Tx +} + +void dma1_channel7_isr(){ + if(DMA1->ISR & DMA_ISR_TCIF7){ // Tx + DMA1->IFCR = DMA_IFCR_CTCIF7; // clear TC flag + usart_txrdy = 1; + } +} diff --git a/F1:F103/BISS_C_encoders/usart.h b/F1:F103/BISS_C_encoders/usart.h index 27e6375..98994dd 100644 --- a/F1:F103/BISS_C_encoders/usart.h +++ b/F1:F103/BISS_C_encoders/usart.h @@ -21,12 +21,10 @@ #pragma once +#include "stdint.h" + #define UARTBUFSZ (128) -// macro for static strings -#define USEND(str) usart_send(str) - -void usart_transmit(); +void usart_send(const uint8_t *buf, int buflen); void usart_setup(); -void usart_send(const char *str); -void usart_putchar(const char ch); +void usart_send_enc(uint32_t encX, uint32_t encY); diff --git a/F1:F103/BISS_C_encoders/version.inc b/F1:F103/BISS_C_encoders/version.inc index aebe739..e4b7dcc 100644 --- a/F1:F103/BISS_C_encoders/version.inc +++ b/F1:F103/BISS_C_encoders/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "96" -#define BUILD_DATE "2025-04-04" +#define BUILD_NUMBER "107" +#define BUILD_DATE "2025-06-02"