diff --git a/F1:F103/Canon_managing_device/canonusb.bin b/F1:F103/Canon_managing_device/canonusb.bin index 23df0e8..3cc6098 100755 Binary files a/F1:F103/Canon_managing_device/canonusb.bin and b/F1:F103/Canon_managing_device/canonusb.bin differ diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index b4e5f17..1d82208 100755 Binary files a/F3:F303/Multistepper/multistepper.bin and b/F3:F303/Multistepper/multistepper.bin differ diff --git a/F3:F303/Multistepper/steppers.c b/F3:F303/Multistepper/steppers.c index 6dc33d1..fda2a9f 100644 --- a/F3:F303/Multistepper/steppers.c +++ b/F3:F303/Multistepper/steppers.c @@ -324,7 +324,6 @@ void addmicrostep(uint8_t i){ // check state of i`th stepper static void chkstepper(int i){ int32_t i32; - uint32_t u32; static uint8_t stopctr[MOTORSNO] = {0}; // counters for encoders/position zeroing after stopping @ esw // check DIAGN only for UART/SPI if(the_conf.motflags[i].drvtype == DRVTYPE_UART || the_conf.motflags[i].drvtype == DRVTYPE_SPI){ diff --git a/F3:F303/Multistepper/usb.c b/F3:F303/Multistepper/usb.c deleted file mode 100644 index a2ee479..0000000 --- a/F3:F303/Multistepper/usb.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2024 Edward V. Emelianov . - * - * 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 3 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, see . - */ - -#include - -#include "hardware.h" -#include "usb.h" -#include "usb_lib.h" - -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}; -// inbuf overflow when receiving -volatile uint8_t bufovrfl = 0; -// last send data size -static volatile int lastdsz = 0; - -// called from transmit EP -void send_next(){ - int buflen = RB_read((ringbuffer*)&rbout, (uint8_t*)usbbuff, USB_TXBUFSZ); - if(buflen == 0){ - if(lastdsz == 64) EP_Write(3, NULL, 0); // send ZLP after 64 bits packet when nothing more to send - lastdsz = 0; - return; - }else if(buflen < 0){ - lastdsz = 0; - // Uncomment next line if you want 4Mbit/s instead of 6Mbit/s - //EP_Write(3, NULL, 0); // send ZLP if buffer is in writting state now - return; - } - EP_Write(3, (uint8_t*)usbbuff, buflen); - lastdsz = buflen; -} - -// blocking send full content of ring buffer -int USB_sendall(){ - while(lastdsz > 0){ - if(!usbON) return FALSE; - } - return TRUE; -} - -// put `buf` into queue to send -int USB_send(const uint8_t *buf, int len){ - if(!buf || !usbON || !len) return FALSE; - while(len){ - int a = RB_write((ringbuffer*)&rbout, buf, len); - if(a > 0){ - len -= a; - buf += a; - } else if (a < 0) continue; // do nothing if buffer is in reading state - if(lastdsz == 0) send_next(); // need to run manually - all data sent, so no IRQ on IN - } - return TRUE; -} - -int USB_putbyte(uint8_t byte){ - if(!usbON) return FALSE; - int l = 0; - while((l = RB_write((ringbuffer*)&rbout, &byte, 1)) != 1){ - if(l < 0) continue; - } - if(lastdsz == 0) send_next(); // need to run manually - all data sent, so no IRQ on IN - return TRUE; -} - -int USB_sendstr(const char *string){ - if(!string || !usbON) return FALSE; - int len = 0; - const char *b = string; - while(*b++) ++len; - if(!len) return FALSE; - return USB_send((const uint8_t*)string, len); -} - -/** - * @brief USB_receive - get binary data from receiving ring-buffer - * @param buf (i) - buffer for received data - * @param len - length of `buf` - * @return amount of received bytes (negative, if overfull happened) - */ -int USB_receive(uint8_t *buf, int len){ - chkin(); - if(bufovrfl){ - while(1 != RB_clearbuf((ringbuffer*)&rbin)); - bufovrfl = 0; - return -1; - } - int sz = RB_read((ringbuffer*)&rbin, buf, len); - if(sz < 0) return 0; // buffer in writting state - return sz; -} - -/** - * @brief USB_receivestr - get string up to '\n' and replace '\n' with 0 - * @param buf - receiving buffer - * @param len - its length - * @return strlen or negative value indicating overflow (if so, string won't be ends with 0 and buffer should be cleared) - */ -int USB_receivestr(char *buf, int len){ - chkin(); - if(bufovrfl){ - while(1 != RB_clearbuf((ringbuffer*)&rbin)); - bufovrfl = 0; - return -1; - } - int l = RB_readto((ringbuffer*)&rbin, '\n', (uint8_t*)buf, len); - if(l < 1){ - if(rbin.length == RB_datalen((ringbuffer*)&rbin)){ // buffer is full but no '\n' found - while(1 != RB_clearbuf((ringbuffer*)&rbin)); - return -1; - } - return 0; - } - if(l == 0) return 0; - buf[l-1] = 0; // replace '\n' with strend - return l; -} - diff --git a/F3:F303/Multistepper/usb.h b/F3:F303/Multistepper/usb.h deleted file mode 100644 index 4583b9b..0000000 --- a/F3:F303/Multistepper/usb.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2024 Edward V. Emelianov . - * - * 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 3 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, see . - */ - -#pragma once - -#include "ringbuffer.h" -#include "usbhw.h" - -// sizes of ringbuffers for outgoing and incoming data -#define RBOUTSZ (512) -#define RBINSZ (256) - -#define newline() USB_putbyte('\n') -#define USND(s) do{USB_sendstr(s); USB_putbyte('\n');}while(0) - -#define STR_HELPER(s) #s -#define STR(s) STR_HELPER(s) - -#ifdef EBUG -#define DBG(str) do{USB_sendstr(__FILE__ " (L" STR(__LINE__) "): " str); newline();}while(0) -#else -#define DBG(str) -#endif - -extern volatile ringbuffer rbout, rbin; -extern volatile uint8_t bufisempty, bufovrfl; - -void send_next(); -int USB_sendall(); -int USB_send(const uint8_t *buf, int len); -int USB_putbyte(uint8_t byte); -int USB_sendstr(const char *string); -int USB_receive(uint8_t *buf, int len); -int USB_receivestr(char *buf, int len); diff --git a/F3:F303/Multistepper/usbhw.c b/F3:F303/Multistepper/usbhw.c deleted file mode 100644 index 4f061b7..0000000 --- a/F3:F303/Multistepper/usbhw.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2024 Edward V. Emelianov . - * - * 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 3 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, see . - */ -#include "usb.h" -#include "usb_lib.h" - -// here we suppose that all PIN settings done in hw_setup earlier -void USB_setup(){ -#if defined STM32F3 - NVIC_DisableIRQ(USB_LP_IRQn); - // remap USB LP & Wakeup interrupts to 75 and 76 - works only on pure F303 - RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // enable tacting of SYSCFG - SYSCFG->CFGR1 |= SYSCFG_CFGR1_USB_IT_RMP; -#elif defined STM32F1 - NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn); - NVIC_DisableIRQ(USB_HP_CAN1_TX_IRQn); -#elif defined STM32F0 - NVIC_DisableIRQ(USB_IRQn); - RCC->APB1ENR |= RCC_APB1ENR_CRSEN; - RCC->CFGR3 &= ~RCC_CFGR3_USBSW; // reset USB - RCC->CR2 |= RCC_CR2_HSI48ON; // turn ON HSI48 - uint32_t tmout = 16000000; - while(!(RCC->CR2 & RCC_CR2_HSI48RDY)){if(--tmout == 0) break;} - FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; - CRS->CFGR &= ~CRS_CFGR_SYNCSRC; - CRS->CFGR |= CRS_CFGR_SYNCSRC_1; // USB SOF selected as sync source - CRS->CR |= CRS_CR_AUTOTRIMEN; // enable auto trim - CRS->CR |= CRS_CR_CEN; // enable freq counter & block CRS->CFGR as read-only - RCC->CFGR |= RCC_CFGR_SW; -#endif - RCC->APB1ENR |= RCC_APB1ENR_USBEN; - //?? - USB->CNTR = USB_CNTR_FRES; // Force USB Reset - for(uint32_t ctr = 0; ctr < 72000; ++ctr) nop(); // wait >1ms - USB->CNTR = 0; - USB->BTABLE = 0; - USB->DADDR = 0; - USB->ISTR = 0; - USB->CNTR = USB_CNTR_RESETM | USB_CNTR_WKUPM; // allow only wakeup & reset interrupts -#if defined STM32F3 - NVIC_EnableIRQ(USB_LP_IRQn); -#elif defined STM32F1 - NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); -#elif defined STM32F0 - USB->BCDR |= USB_BCDR_DPPU; - NVIC_EnableIRQ(USB_IRQn); -#endif -} - - diff --git a/F3:F303/Multistepper/usbhw.h b/F3:F303/Multistepper/usbhw.h deleted file mode 100644 index 033846f..0000000 --- a/F3:F303/Multistepper/usbhw.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2024 Edward V. Emelianov . - * - * 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 3 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, see . - */ -#pragma once - -#if defined STM32F0 -#include -#elif defined STM32F1 -#include -// there's no this define in standard header -#define USB_BASE ((uint32_t)0x40005C00) -#elif defined STM32F3 -#include -#endif - -// max endpoints number -#define STM32ENDPOINTS 8 -/** - * Buffers size definition - **/ - -// F0 - USB2_16; F1 - USB1_16; F3 - 1/2 depending on series -#if !defined USB1_16 && !defined USB2_16 -#if defined STM32F0 -#define USB2_16 -#elif defined STM32F1 -#define USB1_16 -#else -#error "Can't determine USB1_16 or USB2_16, define by hands" -#endif -#endif - -// BTABLE_SIZE FOR STM32F3: -// In STM32F303/302xB/C, 512 bytes SRAM is not shared with CAN. -// In STM32F302x6/x8 and STM32F30xxD/E, 726 bytes dedicated SRAM and 256 bytes shared SRAM with CAN i.e. -// 1Kbytes dedicated SRAM in case CAN is disabled. -// remember, that USB_BTABLE_SIZE will be divided by ACCESSZ, so don't divide it twice for 32-bit addressing - -#ifdef NOCAN -#if defined STM32F0 -#define USB_BTABLE_SIZE 1024 -#elif defined STM32F3 -#define USB_BTABLE_SIZE 512 -#warning "Please, check real buffer size due to docs" -#else -#error "define STM32F0 or STM32F3" -#endif -#else // !NOCAN: F0/F3 with CAN or F1 (can't simultaneously run CAN and USB) -#if defined STM32F0 -#define USB_BTABLE_SIZE 768 -#elif defined STM32F3 -#define USB_BTABLE_SIZE 726 -//#warning "Please, check real buffer size due to docs" -#else // STM32F103: 1024 bytes but with 32-bit addressing -#define USB_BTABLE_SIZE 1024 -#endif -#endif // NOCAN - -// first 64 bytes of USB_BTABLE are registers! -//#define USB_EP0_BASEADDR 64 -// for USB FS EP0 buffers are from 8 to 64 bytes long (64 for PL2303) -#define USB_EP0_BUFSZ 64 -// USB transmit buffer size (64 for PL2303) -#define USB_TXBUFSZ 64 -// USB receive buffer size (64 for PL2303) -#define USB_RXBUFSZ 64 -// EP1 - interrupt - buffer size -#define USB_EP1BUFSZ 8 - -#define USB_BTABLE_BASE 0x40006000 -#define USB ((USB_TypeDef *) USB_BASE) - -#ifdef USB_BTABLE -#undef USB_BTABLE -#endif -#define USB_BTABLE ((USB_BtableDef *)(USB_BTABLE_BASE)) -#define USB_ISTR_EPID 0x0000000F -#define USB_FNR_LSOF_0 0x00000800 -#define USB_FNR_lSOF_1 0x00001000 -#define USB_LPMCSR_BESL_0 0x00000010 -#define USB_LPMCSR_BESL_1 0x00000020 -#define USB_LPMCSR_BESL_2 0x00000040 -#define USB_LPMCSR_BESL_3 0x00000080 -#define USB_EPnR_CTR_RX 0x00008000 -#define USB_EPnR_DTOG_RX 0x00004000 -#define USB_EPnR_STAT_RX 0x00003000 -#define USB_EPnR_STAT_RX_0 0x00001000 -#define USB_EPnR_STAT_RX_1 0x00002000 -#define USB_EPnR_SETUP 0x00000800 -#define USB_EPnR_EP_TYPE 0x00000600 -#define USB_EPnR_EP_TYPE_0 0x00000200 -#define USB_EPnR_EP_TYPE_1 0x00000400 -#define USB_EPnR_EP_KIND 0x00000100 -#define USB_EPnR_CTR_TX 0x00000080 -#define USB_EPnR_DTOG_TX 0x00000040 -#define USB_EPnR_STAT_TX 0x00000030 -#define USB_EPnR_STAT_TX_0 0x00000010 -#define USB_EPnR_STAT_TX_1 0x00000020 -#define USB_EPnR_EA 0x0000000F -#define USB_COUNTn_RX_BLSIZE 0x00008000 -#define USB_COUNTn_NUM_BLOCK 0x00007C00 -#define USB_COUNTn_RX 0x0000003F - -#define USB_TypeDef USB_TypeDef_custom - -typedef struct { - __IO uint32_t EPnR[STM32ENDPOINTS]; - __IO uint32_t RESERVED[STM32ENDPOINTS]; - __IO uint32_t CNTR; - __IO uint32_t ISTR; - __IO uint32_t FNR; - __IO uint32_t DADDR; - __IO uint32_t BTABLE; -} USB_TypeDef; - -// F303 D/E have 2x16 access scheme -typedef struct{ -#if defined USB2_16 - __IO uint16_t USB_ADDR_TX; - __IO uint16_t USB_COUNT_TX; - __IO uint16_t USB_ADDR_RX; - __IO uint16_t USB_COUNT_RX; -#define ACCESSZ (1) -#define BUFTYPE uint8_t -#elif defined USB1_16 - __IO uint32_t USB_ADDR_TX; - __IO uint32_t USB_COUNT_TX; - __IO uint32_t USB_ADDR_RX; - __IO uint32_t USB_COUNT_RX; -#define ACCESSZ (2) -#define BUFTYPE uint16_t -#else -#error "Define USB1_16 or USB2_16" -#endif -} USB_EPDATA_TypeDef; - - -typedef struct{ - __IO USB_EPDATA_TypeDef EP[STM32ENDPOINTS]; -} USB_BtableDef; - -void USB_setup(); diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 5630367..1ccd19b 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "200" -#define BUILD_DATE "2025-02-06" +#define BUILD_NUMBER "202" +#define BUILD_DATE "2025-04-16"