wip
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
54587
workspace/.metadata/.ide.log-2025-12-06.log
Normal file
54587
workspace/.metadata/.ide.log-2025-12-06.log
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -8,3 +8,4 @@
|
|||||||
*** SESSION dic 06, 2025 15:55:43.678 ------------------------------------------
|
*** SESSION dic 06, 2025 15:55:43.678 ------------------------------------------
|
||||||
*** SESSION dic 06, 2025 16:57:32.486 ------------------------------------------
|
*** SESSION dic 06, 2025 16:57:32.486 ------------------------------------------
|
||||||
*** SESSION dic 06, 2025 22:49:40.40 -------------------------------------------
|
*** SESSION dic 06, 2025 22:49:40.40 -------------------------------------------
|
||||||
|
*** SESSION dic 07, 2025 19:18:34.790 ------------------------------------------
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1,10 +1,10 @@
|
|||||||
23:30:07 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
21:37:00 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||||
make -j12 all
|
make -j12 all
|
||||||
arm-none-eabi-size AUTOM10.elf
|
arm-none-eabi-size AUTOM10.elf
|
||||||
text data bss dec hex filename
|
text data bss dec hex filename
|
||||||
42072 460 7148 49680 c210 AUTOM10.elf
|
45384 464 7184 53032 cf28 AUTOM10.elf
|
||||||
Finished building: default.size.stdout
|
Finished building: default.size.stdout
|
||||||
|
|
||||||
|
|
||||||
23:30:08 Build Finished. 0 errors, 0 warnings. (took 340ms)
|
21:37:00 Build Finished. 0 errors, 0 warnings. (took 185ms)
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
23:29:57 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
21:36:56 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||||
make -j12 all
|
make -j12 all
|
||||||
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xB -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I../USB_DEVICE/App -I../USB_DEVICE/Target -I../Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o"
|
arm-none-eabi-gcc "../Core/Src/cdc_int.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xB -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I../USB_DEVICE/App -I../USB_DEVICE/Target -I../Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/cdc_int.d" -MT"Core/Src/cdc_int.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/cdc_int.o"
|
||||||
arm-none-eabi-gcc -o "AUTOM10.elf" @"objects.list" -mcpu=cortex-m3 -T"C:\progetti\AUTOM\workspace\AUTOM10\STM32F103C8TX_FLASH.ld" --specs=nosys.specs -Wl,-Map="AUTOM10.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
|
arm-none-eabi-gcc -o "AUTOM10.elf" @"objects.list" -mcpu=cortex-m3 -T"C:\progetti\AUTOM\workspace\AUTOM10\STM32F103C8TX_FLASH.ld" --specs=nosys.specs -Wl,-Map="AUTOM10.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
|
||||||
Finished building target: AUTOM10.elf
|
Finished building target: AUTOM10.elf
|
||||||
|
|
||||||
arm-none-eabi-size AUTOM10.elf
|
arm-none-eabi-size AUTOM10.elf
|
||||||
arm-none-eabi-objdump -h -S AUTOM10.elf > "AUTOM10.list"
|
arm-none-eabi-objdump -h -S AUTOM10.elf > "AUTOM10.list"
|
||||||
text data bss dec hex filename
|
text data bss dec hex filename
|
||||||
42072 460 7148 49680 c210 AUTOM10.elf
|
45384 464 7184 53032 cf28 AUTOM10.elf
|
||||||
Finished building: default.size.stdout
|
Finished building: default.size.stdout
|
||||||
|
|
||||||
Finished building: AUTOM10.list
|
Finished building: AUTOM10.list
|
||||||
|
|
||||||
23:30:07 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
21:37:00 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||||
make -j12 all
|
make -j12 all
|
||||||
arm-none-eabi-size AUTOM10.elf
|
arm-none-eabi-size AUTOM10.elf
|
||||||
text data bss dec hex filename
|
text data bss dec hex filename
|
||||||
42072 460 7148 49680 c210 AUTOM10.elf
|
45384 464 7184 53032 cf28 AUTOM10.elf
|
||||||
Finished building: default.size.stdout
|
Finished building: default.size.stdout
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY); }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
retval=c1;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c2;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c3;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,549 @@
|
|||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file : main.c
|
||||||
|
* @brief : Main program body
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
/* Private includes ----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
|
||||||
|
#include "pwm.h"
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PTD */
|
||||||
|
|
||||||
|
/* USER CODE END PTD */
|
||||||
|
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PD */
|
||||||
|
|
||||||
|
/* USER CODE END PD */
|
||||||
|
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PM */
|
||||||
|
|
||||||
|
/* USER CODE END PM */
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
ADC_HandleTypeDef hadc1;
|
||||||
|
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
UART_HandleTypeDef huart1;
|
||||||
|
|
||||||
|
/* USER CODE BEGIN PV */
|
||||||
|
TIM_HandleTypeDef htim1;
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim3;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
/* USER CODE END PV */
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
void SystemClock_Config(void);
|
||||||
|
static void MX_GPIO_Init(void);
|
||||||
|
static void MX_TIM2_Init(void);
|
||||||
|
static void MX_TIM4_Init(void);
|
||||||
|
static void MX_ADC1_Init(void);
|
||||||
|
static void MX_USART1_UART_Init(void);
|
||||||
|
/* USER CODE BEGIN PFP */
|
||||||
|
|
||||||
|
/* USER CODE END PFP */
|
||||||
|
|
||||||
|
/* Private user code ---------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
void HAL_SYSTICK_Callback(void){
|
||||||
|
static unsigned char c10ms = 0;
|
||||||
|
|
||||||
|
static uint8_t c100ms = 0;
|
||||||
|
static uint8_t c1s = 0;
|
||||||
|
if (++c10ms >= 10) { // 10 ms
|
||||||
|
c10ms = 0;
|
||||||
|
if (++c100ms >= 10) { // 10 ms
|
||||||
|
c100ms = 0; //flag_10ms = 1; // set a flag; do real work in main loop
|
||||||
|
if (++c1s >= 10) { // 10 ms
|
||||||
|
c1s = 0;
|
||||||
|
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The application entry point.
|
||||||
|
* @retval int
|
||||||
|
*/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
|
/* MCU Configuration--------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
||||||
|
HAL_Init();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Init */
|
||||||
|
|
||||||
|
/* USER CODE END Init */
|
||||||
|
|
||||||
|
/* Configure the system clock */
|
||||||
|
SystemClock_Config();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN SysInit */
|
||||||
|
|
||||||
|
/* USER CODE END SysInit */
|
||||||
|
|
||||||
|
/* Initialize all configured peripherals */
|
||||||
|
MX_GPIO_Init();
|
||||||
|
MX_USB_DEVICE_Init();
|
||||||
|
MX_TIM2_Init();
|
||||||
|
MX_TIM4_Init();
|
||||||
|
MX_ADC1_Init();
|
||||||
|
MX_USART1_UART_Init();
|
||||||
|
/* USER CODE BEGIN 2 */
|
||||||
|
StopMot(timMot1,FWMot1);
|
||||||
|
StopMot(timMot1,BWMot1);
|
||||||
|
StopMot(timMot2,FWMot2);
|
||||||
|
StopMot(timMot2,BWMot2);
|
||||||
|
StopMot(timMot3,FWMot3);
|
||||||
|
StopMot(timMot3,BWMot3);
|
||||||
|
StopMot(timMot4,FWMot4);
|
||||||
|
StopMot(timMot4,BWMot4);
|
||||||
|
CDC_Transmit_FS((uint8_t*)"Start\r\n", 7);
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
/* USER CODE BEGIN WHILE */
|
||||||
|
while (1){
|
||||||
|
manageCDC();
|
||||||
|
// while (CDC_Available()) {
|
||||||
|
// int c = CDC_ReadByte();
|
||||||
|
//if (c < 0) break;
|
||||||
|
|
||||||
|
// uint8_t out = (uint8_t)c;
|
||||||
|
// if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
|
||||||
|
// unsigned char s[100];
|
||||||
|
// sprintf((char*)s,"\nc=%03d",c);
|
||||||
|
// while (CDC_Transmit_FS(s, 6) == USBD_BUSY) {
|
||||||
|
// // tiny spin or yield
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//HAL_Delay(1000);
|
||||||
|
// CDC_Transmit_FS((uint8_t*)"Ping\r\n", 6);
|
||||||
|
/* USER CODE END WHILE */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 3 */
|
||||||
|
}
|
||||||
|
/* USER CODE END 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief System Clock Configuration
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SystemClock_Config(void)
|
||||||
|
{
|
||||||
|
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
||||||
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
||||||
|
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
||||||
|
|
||||||
|
/** Initializes the RCC Oscillators according to the specified parameters
|
||||||
|
* in the RCC_OscInitTypeDef structure.
|
||||||
|
*/
|
||||||
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
||||||
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
||||||
|
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
||||||
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
||||||
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
|
||||||
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initializes the CPU, AHB and APB buses clocks
|
||||||
|
*/
|
||||||
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
||||||
|
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
|
||||||
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||||
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||||
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
||||||
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
||||||
|
|
||||||
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_USB;
|
||||||
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
|
||||||
|
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
|
||||||
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ADC1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_ADC1_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 0 */
|
||||||
|
|
||||||
|
ADC_ChannelConfTypeDef sConfig = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 1 */
|
||||||
|
|
||||||
|
/** Common config
|
||||||
|
*/
|
||||||
|
hadc1.Instance = ADC1;
|
||||||
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
||||||
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||||
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||||
|
hadc1.Init.NbrOfConversion = 1;
|
||||||
|
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_4;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||||
|
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN ADC1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM2 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM2_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 1 */
|
||||||
|
htim2.Instance = TIM2;
|
||||||
|
htim2.Init.Prescaler = 0;
|
||||||
|
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim2.Init.Period = 17999;
|
||||||
|
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 1000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 2000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 3000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 4000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM2_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM4 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM4_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 1 */
|
||||||
|
htim4.Instance = TIM4;
|
||||||
|
htim4.Init.Prescaler = 0;
|
||||||
|
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim4.Init.Period = 17999;
|
||||||
|
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 5000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 6000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 7000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 8000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM4_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USART1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_USART1_UART_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 1 */
|
||||||
|
huart1.Instance = USART1;
|
||||||
|
huart1.Init.BaudRate = 115200;
|
||||||
|
huart1.Init.WordLength = UART_WORDLENGTH_8B;
|
||||||
|
huart1.Init.StopBits = UART_STOPBITS_1;
|
||||||
|
huart1.Init.Parity = UART_PARITY_NONE;
|
||||||
|
huart1.Init.Mode = UART_MODE_TX_RX;
|
||||||
|
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||||
|
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
|
||||||
|
if (HAL_UART_Init(&huart1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN USART1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GPIO Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_GPIO_Init(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* GPIO Ports Clock Enable */
|
||||||
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOB, INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOA, BUZ_Pin|LED1_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : LED2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = LED2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : P1_Pin P2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = P1_Pin|P2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : AIN1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = AIN1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||||
|
HAL_GPIO_Init(AIN1_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : INH1_Pin INH2_Pin INH3_Pin INH4_Pin
|
||||||
|
EXP1_Pin EXP2_Pin EXP3_Pin */
|
||||||
|
GPIO_InitStruct.Pin = INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : CH1_Pin CH2_Pin CH3_Pin CH4_Pin */
|
||||||
|
GPIO_InitStruct.Pin = CH1_Pin|CH2_Pin|CH3_Pin|CH4_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : BUZ_Pin LED1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = BUZ_Pin|LED1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_2 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 4 */
|
||||||
|
|
||||||
|
/* USER CODE END 4 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is executed in case of error occurrence.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void Error_Handler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN Error_Handler_Debug */
|
||||||
|
/* User can add his own implementation to report the HAL error return state */
|
||||||
|
__disable_irq();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/* USER CODE END Error_Handler_Debug */
|
||||||
|
}
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
/**
|
||||||
|
* @brief Reports the name of the source file and the source line number
|
||||||
|
* where the assert_param error has occurred.
|
||||||
|
* @param file: pointer to the source file name
|
||||||
|
* @param line: assert_param error line source number
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void assert_failed(uint8_t *file, uint32_t line)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN 6 */
|
||||||
|
/* User can add his own implementation to report the file name and line number,
|
||||||
|
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||||||
|
/* USER CODE END 6 */
|
||||||
|
}
|
||||||
|
#endif /* USE_FULL_ASSERT */
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==4){
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* eeprom.c
|
||||||
|
*
|
||||||
|
* Created on: Dec 7, 2025
|
||||||
|
* Author: user
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY); }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",rxbuf[2],rxbuf[3],val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* eeprom.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 7, 2025
|
||||||
|
* Author: user
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EEPROM_H
|
||||||
|
#define __EEPROM_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple EEPROM emulation for STM32F103C8T6 (medium density).
|
||||||
|
* - Uses 2 Flash pages (1 kB each) at the end of Flash.
|
||||||
|
* - Stores variables as 16-bit values identified by 16-bit "virtual addresses".
|
||||||
|
*
|
||||||
|
* You must define the list of virtual addresses in eeprom.c: EE_VirtAddrs[].
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EE_OK = 0,
|
||||||
|
EE_ERROR,
|
||||||
|
EE_NOT_FOUND,
|
||||||
|
EE_NO_SPACE
|
||||||
|
} EE_Status;
|
||||||
|
|
||||||
|
/* Flash parameters for STM32F103C8T6 */
|
||||||
|
#define EE_FLASH_BASE_ADDR 0x08000000U
|
||||||
|
#define EE_PAGE_SIZE 0x400U /* 1 kB pages */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Here we assume a 64 kB Flash device (STM32F103C8T6):
|
||||||
|
* Flash range: 0x0800 0000 - 0x0800 FFFF
|
||||||
|
* Pages: 0..63 (64 pages)
|
||||||
|
* We use the last 2 pages for EEPROM:
|
||||||
|
* - Page 62: 0x0800 F800
|
||||||
|
* - Page 63: 0x0800 FC00
|
||||||
|
*/
|
||||||
|
#define EE_PAGE0_BASE (EE_FLASH_BASE_ADDR + (62U * EE_PAGE_SIZE))
|
||||||
|
#define EE_PAGE1_BASE (EE_FLASH_BASE_ADDR + (63U * EE_PAGE_SIZE))
|
||||||
|
|
||||||
|
/* Page status markers (stored in the first halfword of each page) */
|
||||||
|
#define EE_PAGE_STATUS_ERASED 0xFFFFU
|
||||||
|
#define EE_PAGE_STATUS_VALID 0xAAAAU
|
||||||
|
#define EE_PAGE_STATUS_RECEIVE 0x5555U
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure how many virtual variables you have.
|
||||||
|
* Example: bytes, words, and array elements mapped to 16-bit variables.
|
||||||
|
* Set EE_NUM_VIRTUAL_ADDR and define EE_VirtAddrs[] in eeprom.c.
|
||||||
|
*/
|
||||||
|
/* 32 virtual variables, sequential addresses */
|
||||||
|
#define EE_NUM_VIRTUAL_ADDR 32U
|
||||||
|
#define EEW_ADDR(i) (uint16_t)(0x0001 + (i)) // i = 0..31
|
||||||
|
|
||||||
|
/* Pseudo-array accessor */
|
||||||
|
static inline EE_Status EEW_Read(uint8_t idx, uint16_t *value)
|
||||||
|
{
|
||||||
|
return EE_ReadVariable(EEW_ADDR(idx), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EE_Status EEW_Write(uint8_t idx, uint16_t value)
|
||||||
|
{
|
||||||
|
return EE_WriteVariable(EEW_ADDR(idx), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Virtual address table (defined in eeprom.c, can be customized) */
|
||||||
|
extern const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR];
|
||||||
|
|
||||||
|
/* Public API */
|
||||||
|
EE_Status EE_Init(void);
|
||||||
|
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data);
|
||||||
|
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __EEPROM_H */
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* eeprom.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 7, 2025
|
||||||
|
* Author: user
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SRC_EEPROM_H_
|
||||||
|
#define SRC_EEPROM_H_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SRC_EEPROM_H_ */
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,553 @@
|
|||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file : main.c
|
||||||
|
* @brief : Main program body
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
/* Private includes ----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PTD */
|
||||||
|
|
||||||
|
/* USER CODE END PTD */
|
||||||
|
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PD */
|
||||||
|
|
||||||
|
/* USER CODE END PD */
|
||||||
|
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PM */
|
||||||
|
|
||||||
|
/* USER CODE END PM */
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
ADC_HandleTypeDef hadc1;
|
||||||
|
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
UART_HandleTypeDef huart1;
|
||||||
|
|
||||||
|
/* USER CODE BEGIN PV */
|
||||||
|
TIM_HandleTypeDef htim1;
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim3;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
/* USER CODE END PV */
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
void SystemClock_Config(void);
|
||||||
|
static void MX_GPIO_Init(void);
|
||||||
|
static void MX_TIM2_Init(void);
|
||||||
|
static void MX_TIM4_Init(void);
|
||||||
|
static void MX_ADC1_Init(void);
|
||||||
|
static void MX_USART1_UART_Init(void);
|
||||||
|
/* USER CODE BEGIN PFP */
|
||||||
|
|
||||||
|
/* USER CODE END PFP */
|
||||||
|
|
||||||
|
/* Private user code ---------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
void HAL_SYSTICK_Callback(void){
|
||||||
|
static unsigned char c10ms = 0;
|
||||||
|
|
||||||
|
static uint8_t c100ms = 0;
|
||||||
|
static uint8_t c1s = 0;
|
||||||
|
if (++c10ms >= 10) { // 10 ms
|
||||||
|
c10ms = 0;
|
||||||
|
if (++c100ms >= 10) { // 10 ms
|
||||||
|
c100ms = 0; //flag_10ms = 1; // set a flag; do real work in main loop
|
||||||
|
if (++c1s >= 10) { // 10 ms
|
||||||
|
c1s = 0;
|
||||||
|
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The application entry point.
|
||||||
|
* @retval int
|
||||||
|
*/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
|
/* MCU Configuration--------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
||||||
|
HAL_Init();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Init */
|
||||||
|
|
||||||
|
/* USER CODE END Init */
|
||||||
|
|
||||||
|
/* Configure the system clock */
|
||||||
|
SystemClock_Config();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN SysInit */
|
||||||
|
|
||||||
|
/* USER CODE END SysInit */
|
||||||
|
|
||||||
|
/* Initialize all configured peripherals */
|
||||||
|
MX_GPIO_Init();
|
||||||
|
MX_USB_DEVICE_Init();
|
||||||
|
MX_TIM2_Init();
|
||||||
|
MX_TIM4_Init();
|
||||||
|
MX_ADC1_Init();
|
||||||
|
MX_USART1_UART_Init();
|
||||||
|
/* USER CODE BEGIN 2 */
|
||||||
|
StopMot(timMot1,FWMot1);
|
||||||
|
StopMot(timMot1,BWMot1);
|
||||||
|
StopMot(timMot2,FWMot2);
|
||||||
|
StopMot(timMot2,BWMot2);
|
||||||
|
StopMot(timMot3,FWMot3);
|
||||||
|
StopMot(timMot3,BWMot3);
|
||||||
|
StopMot(timMot4,FWMot4);
|
||||||
|
StopMot(timMot4,BWMot4);
|
||||||
|
//CDC_Transmit_FS((uint8_t*)"Start\r\n", 7);
|
||||||
|
while (CDC_Transmit_FS((uint8_t*)"Start\r\n", 7) == USBD_BUSY);
|
||||||
|
if (EE_Init() != EE_OK){
|
||||||
|
// handle error (optional)
|
||||||
|
}
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
/* USER CODE BEGIN WHILE */
|
||||||
|
while (1){
|
||||||
|
manageCDC();
|
||||||
|
// while (CDC_Available()) {
|
||||||
|
// int c = CDC_ReadByte();
|
||||||
|
//if (c < 0) break;
|
||||||
|
|
||||||
|
// uint8_t out = (uint8_t)c;
|
||||||
|
// if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
|
||||||
|
// unsigned char s[100];
|
||||||
|
// sprintf((char*)s,"\nc=%03d",c);
|
||||||
|
// while (CDC_Transmit_FS(s, 6) == USBD_BUSY) {
|
||||||
|
// // tiny spin or yield
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//HAL_Delay(1000);
|
||||||
|
// CDC_Transmit_FS((uint8_t*)"Ping\r\n", 6);
|
||||||
|
/* USER CODE END WHILE */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 3 */
|
||||||
|
}
|
||||||
|
/* USER CODE END 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief System Clock Configuration
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SystemClock_Config(void)
|
||||||
|
{
|
||||||
|
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
||||||
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
||||||
|
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
||||||
|
|
||||||
|
/** Initializes the RCC Oscillators according to the specified parameters
|
||||||
|
* in the RCC_OscInitTypeDef structure.
|
||||||
|
*/
|
||||||
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
||||||
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
||||||
|
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
||||||
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
||||||
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
|
||||||
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initializes the CPU, AHB and APB buses clocks
|
||||||
|
*/
|
||||||
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
||||||
|
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
|
||||||
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||||
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||||
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
||||||
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
||||||
|
|
||||||
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_USB;
|
||||||
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
|
||||||
|
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
|
||||||
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ADC1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_ADC1_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 0 */
|
||||||
|
|
||||||
|
ADC_ChannelConfTypeDef sConfig = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 1 */
|
||||||
|
|
||||||
|
/** Common config
|
||||||
|
*/
|
||||||
|
hadc1.Instance = ADC1;
|
||||||
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
||||||
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||||
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||||
|
hadc1.Init.NbrOfConversion = 1;
|
||||||
|
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_4;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||||
|
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN ADC1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM2 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM2_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 1 */
|
||||||
|
htim2.Instance = TIM2;
|
||||||
|
htim2.Init.Prescaler = 0;
|
||||||
|
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim2.Init.Period = 17999;
|
||||||
|
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 1000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 2000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 3000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 4000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM2_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM4 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM4_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 1 */
|
||||||
|
htim4.Instance = TIM4;
|
||||||
|
htim4.Init.Prescaler = 0;
|
||||||
|
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim4.Init.Period = 17999;
|
||||||
|
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 5000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 6000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 7000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 8000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM4_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USART1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_USART1_UART_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 1 */
|
||||||
|
huart1.Instance = USART1;
|
||||||
|
huart1.Init.BaudRate = 115200;
|
||||||
|
huart1.Init.WordLength = UART_WORDLENGTH_8B;
|
||||||
|
huart1.Init.StopBits = UART_STOPBITS_1;
|
||||||
|
huart1.Init.Parity = UART_PARITY_NONE;
|
||||||
|
huart1.Init.Mode = UART_MODE_TX_RX;
|
||||||
|
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||||
|
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
|
||||||
|
if (HAL_UART_Init(&huart1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN USART1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GPIO Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_GPIO_Init(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* GPIO Ports Clock Enable */
|
||||||
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOB, INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOA, BUZ_Pin|LED1_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : LED2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = LED2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : P1_Pin P2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = P1_Pin|P2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : AIN1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = AIN1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||||
|
HAL_GPIO_Init(AIN1_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : INH1_Pin INH2_Pin INH3_Pin INH4_Pin
|
||||||
|
EXP1_Pin EXP2_Pin EXP3_Pin */
|
||||||
|
GPIO_InitStruct.Pin = INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : CH1_Pin CH2_Pin CH3_Pin CH4_Pin */
|
||||||
|
GPIO_InitStruct.Pin = CH1_Pin|CH2_Pin|CH3_Pin|CH4_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : BUZ_Pin LED1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = BUZ_Pin|LED1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_2 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 4 */
|
||||||
|
|
||||||
|
/* USER CODE END 4 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is executed in case of error occurrence.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void Error_Handler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN Error_Handler_Debug */
|
||||||
|
/* User can add his own implementation to report the HAL error return state */
|
||||||
|
__disable_irq();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/* USER CODE END Error_Handler_Debug */
|
||||||
|
}
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
/**
|
||||||
|
* @brief Reports the name of the source file and the source line number
|
||||||
|
* where the assert_param error has occurred.
|
||||||
|
* @param file: pointer to the source file name
|
||||||
|
* @param line: assert_param error line source number
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void assert_failed(uint8_t *file, uint32_t line)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN 6 */
|
||||||
|
/* User can add his own implementation to report the file name and line number,
|
||||||
|
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||||||
|
/* USER CODE END 6 */
|
||||||
|
}
|
||||||
|
#endif /* USE_FULL_ASSERT */
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",rxbuf[2],rxbuf[3],val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* eeprom.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 7, 2025
|
||||||
|
* Author: user
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EEPROM_H
|
||||||
|
#define __EEPROM_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple EEPROM emulation for STM32F103C8T6 (medium density).
|
||||||
|
* - Uses 2 Flash pages (1 kB each) at the end of Flash.
|
||||||
|
* - Stores variables as 16-bit values identified by 16-bit "virtual addresses".
|
||||||
|
*
|
||||||
|
* You must define the list of virtual addresses in eeprom.c: EE_VirtAddrs[].
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EE_OK = 0,
|
||||||
|
EE_ERROR,
|
||||||
|
EE_NOT_FOUND,
|
||||||
|
EE_NO_SPACE
|
||||||
|
} EE_Status;
|
||||||
|
|
||||||
|
/* Flash parameters for STM32F103C8T6 */
|
||||||
|
#define EE_FLASH_BASE_ADDR 0x08000000U
|
||||||
|
#define EE_PAGE_SIZE 0x400U /* 1 kB pages */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Here we assume a 64 kB Flash device (STM32F103C8T6):
|
||||||
|
* Flash range: 0x0800 0000 - 0x0800 FFFF
|
||||||
|
* Pages: 0..63 (64 pages)
|
||||||
|
* We use the last 2 pages for EEPROM:
|
||||||
|
* - Page 62: 0x0800 F800
|
||||||
|
* - Page 63: 0x0800 FC00
|
||||||
|
*/
|
||||||
|
#define EE_PAGE0_BASE (EE_FLASH_BASE_ADDR + (62U * EE_PAGE_SIZE))
|
||||||
|
#define EE_PAGE1_BASE (EE_FLASH_BASE_ADDR + (63U * EE_PAGE_SIZE))
|
||||||
|
|
||||||
|
/* Page status markers (stored in the first halfword of each page) */
|
||||||
|
#define EE_PAGE_STATUS_ERASED 0xFFFFU
|
||||||
|
#define EE_PAGE_STATUS_VALID 0xAAAAU
|
||||||
|
#define EE_PAGE_STATUS_RECEIVE 0x5555U
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure how many virtual variables you have.
|
||||||
|
* Example: bytes, words, and array elements mapped to 16-bit variables.
|
||||||
|
* Set EE_NUM_VIRTUAL_ADDR and define EE_VirtAddrs[] in eeprom.c.
|
||||||
|
*/
|
||||||
|
#define EE_NUM_VIRTUAL_ADDR 16U
|
||||||
|
|
||||||
|
/* Virtual address table (defined in eeprom.c, can be customized) */
|
||||||
|
extern const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR];
|
||||||
|
|
||||||
|
/* Public API */
|
||||||
|
EE_Status EE_Init(void);
|
||||||
|
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data);
|
||||||
|
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __EEPROM_H */
|
||||||
|
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
retval=c1;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c2;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c3;
|
||||||
|
retval*=10;
|
||||||
|
retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%c%c=%04x",val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,549 @@
|
|||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file : main.c
|
||||||
|
* @brief : Main program body
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
/* Private includes ----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PTD */
|
||||||
|
|
||||||
|
/* USER CODE END PTD */
|
||||||
|
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PD */
|
||||||
|
|
||||||
|
/* USER CODE END PD */
|
||||||
|
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN PM */
|
||||||
|
|
||||||
|
/* USER CODE END PM */
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
ADC_HandleTypeDef hadc1;
|
||||||
|
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
UART_HandleTypeDef huart1;
|
||||||
|
|
||||||
|
/* USER CODE BEGIN PV */
|
||||||
|
TIM_HandleTypeDef htim1;
|
||||||
|
TIM_HandleTypeDef htim2;
|
||||||
|
TIM_HandleTypeDef htim3;
|
||||||
|
TIM_HandleTypeDef htim4;
|
||||||
|
/* USER CODE END PV */
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
void SystemClock_Config(void);
|
||||||
|
static void MX_GPIO_Init(void);
|
||||||
|
static void MX_TIM2_Init(void);
|
||||||
|
static void MX_TIM4_Init(void);
|
||||||
|
static void MX_ADC1_Init(void);
|
||||||
|
static void MX_USART1_UART_Init(void);
|
||||||
|
/* USER CODE BEGIN PFP */
|
||||||
|
|
||||||
|
/* USER CODE END PFP */
|
||||||
|
|
||||||
|
/* Private user code ---------------------------------------------------------*/
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
void HAL_SYSTICK_Callback(void){
|
||||||
|
static unsigned char c10ms = 0;
|
||||||
|
|
||||||
|
static uint8_t c100ms = 0;
|
||||||
|
static uint8_t c1s = 0;
|
||||||
|
if (++c10ms >= 10) { // 10 ms
|
||||||
|
c10ms = 0;
|
||||||
|
if (++c100ms >= 10) { // 10 ms
|
||||||
|
c100ms = 0; //flag_10ms = 1; // set a flag; do real work in main loop
|
||||||
|
if (++c1s >= 10) { // 10 ms
|
||||||
|
c1s = 0;
|
||||||
|
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The application entry point.
|
||||||
|
* @retval int
|
||||||
|
*/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
|
/* MCU Configuration--------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
||||||
|
HAL_Init();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Init */
|
||||||
|
|
||||||
|
/* USER CODE END Init */
|
||||||
|
|
||||||
|
/* Configure the system clock */
|
||||||
|
SystemClock_Config();
|
||||||
|
|
||||||
|
/* USER CODE BEGIN SysInit */
|
||||||
|
|
||||||
|
/* USER CODE END SysInit */
|
||||||
|
|
||||||
|
/* Initialize all configured peripherals */
|
||||||
|
MX_GPIO_Init();
|
||||||
|
MX_USB_DEVICE_Init();
|
||||||
|
MX_TIM2_Init();
|
||||||
|
MX_TIM4_Init();
|
||||||
|
MX_ADC1_Init();
|
||||||
|
MX_USART1_UART_Init();
|
||||||
|
/* USER CODE BEGIN 2 */
|
||||||
|
StopMot(timMot1,FWMot1);
|
||||||
|
StopMot(timMot1,BWMot1);
|
||||||
|
StopMot(timMot2,FWMot2);
|
||||||
|
StopMot(timMot2,BWMot2);
|
||||||
|
StopMot(timMot3,FWMot3);
|
||||||
|
StopMot(timMot3,BWMot3);
|
||||||
|
StopMot(timMot4,FWMot4);
|
||||||
|
StopMot(timMot4,BWMot4);
|
||||||
|
CDC_Transmit_FS((uint8_t*)"Start\r\n", 7);
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
/* USER CODE BEGIN WHILE */
|
||||||
|
while (1){
|
||||||
|
manageCDC();
|
||||||
|
// while (CDC_Available()) {
|
||||||
|
// int c = CDC_ReadByte();
|
||||||
|
//if (c < 0) break;
|
||||||
|
|
||||||
|
// uint8_t out = (uint8_t)c;
|
||||||
|
// if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
|
||||||
|
// unsigned char s[100];
|
||||||
|
// sprintf((char*)s,"\nc=%03d",c);
|
||||||
|
// while (CDC_Transmit_FS(s, 6) == USBD_BUSY) {
|
||||||
|
// // tiny spin or yield
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//HAL_Delay(1000);
|
||||||
|
// CDC_Transmit_FS((uint8_t*)"Ping\r\n", 6);
|
||||||
|
/* USER CODE END WHILE */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 3 */
|
||||||
|
}
|
||||||
|
/* USER CODE END 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief System Clock Configuration
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SystemClock_Config(void)
|
||||||
|
{
|
||||||
|
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
||||||
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
||||||
|
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
||||||
|
|
||||||
|
/** Initializes the RCC Oscillators according to the specified parameters
|
||||||
|
* in the RCC_OscInitTypeDef structure.
|
||||||
|
*/
|
||||||
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
||||||
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
||||||
|
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
||||||
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||||||
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
||||||
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
|
||||||
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initializes the CPU, AHB and APB buses clocks
|
||||||
|
*/
|
||||||
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
||||||
|
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
|
||||||
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||||
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||||
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
||||||
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
||||||
|
|
||||||
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_USB;
|
||||||
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
|
||||||
|
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
|
||||||
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ADC1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_ADC1_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 0 */
|
||||||
|
|
||||||
|
ADC_ChannelConfTypeDef sConfig = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 1 */
|
||||||
|
|
||||||
|
/** Common config
|
||||||
|
*/
|
||||||
|
hadc1.Instance = ADC1;
|
||||||
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
||||||
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||||
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||||
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||||
|
hadc1.Init.NbrOfConversion = 1;
|
||||||
|
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_4;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||||
|
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN ADC1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM2 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM2_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM2_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 1 */
|
||||||
|
htim2.Instance = TIM2;
|
||||||
|
htim2.Init.Prescaler = 0;
|
||||||
|
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim2.Init.Period = 17999;
|
||||||
|
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 1000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 2000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 3000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 4000;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM2_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM2_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TIM4 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_TIM4_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 0 */
|
||||||
|
|
||||||
|
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||||
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||||
|
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||||
|
|
||||||
|
/* USER CODE BEGIN TIM4_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 1 */
|
||||||
|
htim4.Instance = TIM4;
|
||||||
|
htim4.Init.Prescaler = 0;
|
||||||
|
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
htim4.Init.Period = 17999;
|
||||||
|
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
|
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
|
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||||
|
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||||
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||||
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 5000;
|
||||||
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
|
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 6000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 7000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.Pulse = 8000;
|
||||||
|
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN TIM4_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END TIM4_Init 2 */
|
||||||
|
HAL_TIM_MspPostInit(&htim4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USART1 Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_USART1_UART_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN USART1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 1 */
|
||||||
|
huart1.Instance = USART1;
|
||||||
|
huart1.Init.BaudRate = 115200;
|
||||||
|
huart1.Init.WordLength = UART_WORDLENGTH_8B;
|
||||||
|
huart1.Init.StopBits = UART_STOPBITS_1;
|
||||||
|
huart1.Init.Parity = UART_PARITY_NONE;
|
||||||
|
huart1.Init.Mode = UART_MODE_TX_RX;
|
||||||
|
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||||
|
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
|
||||||
|
if (HAL_UART_Init(&huart1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* USER CODE BEGIN USART1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END USART1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GPIO Initialization Function
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MX_GPIO_Init(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_1 */
|
||||||
|
|
||||||
|
/* GPIO Ports Clock Enable */
|
||||||
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOB, INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOA, BUZ_Pin|LED1_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : LED2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = LED2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : P1_Pin P2_Pin */
|
||||||
|
GPIO_InitStruct.Pin = P1_Pin|P2_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pin : AIN1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = AIN1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||||
|
HAL_GPIO_Init(AIN1_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : INH1_Pin INH2_Pin INH3_Pin INH4_Pin
|
||||||
|
EXP1_Pin EXP2_Pin EXP3_Pin */
|
||||||
|
GPIO_InitStruct.Pin = INH1_Pin|INH2_Pin|INH3_Pin|INH4_Pin
|
||||||
|
|EXP1_Pin|EXP2_Pin|EXP3_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : CH1_Pin CH2_Pin CH3_Pin CH4_Pin */
|
||||||
|
GPIO_InitStruct.Pin = CH1_Pin|CH2_Pin|CH3_Pin|CH4_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : BUZ_Pin LED1_Pin */
|
||||||
|
GPIO_InitStruct.Pin = BUZ_Pin|LED1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN MX_GPIO_Init_2 */
|
||||||
|
|
||||||
|
/* USER CODE END MX_GPIO_Init_2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 4 */
|
||||||
|
|
||||||
|
/* USER CODE END 4 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is executed in case of error occurrence.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void Error_Handler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN Error_Handler_Debug */
|
||||||
|
/* User can add his own implementation to report the HAL error return state */
|
||||||
|
__disable_irq();
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/* USER CODE END Error_Handler_Debug */
|
||||||
|
}
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
/**
|
||||||
|
* @brief Reports the name of the source file and the source line number
|
||||||
|
* where the assert_param error has occurred.
|
||||||
|
* @param file: pointer to the source file name
|
||||||
|
* @param line: assert_param error line source number
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void assert_failed(uint8_t *file, uint32_t line)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN 6 */
|
||||||
|
/* User can add his own implementation to report the file name and line number,
|
||||||
|
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||||||
|
/* USER CODE END 6 */
|
||||||
|
}
|
||||||
|
#endif /* USE_FULL_ASSERT */
|
||||||
@@ -0,0 +1,302 @@
|
|||||||
|
#include "eeprom.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Record format (4 bytes):
|
||||||
|
* [0] VirtAddress (uint16_t)
|
||||||
|
* [2] Data (uint16_t)
|
||||||
|
*
|
||||||
|
* Page layout:
|
||||||
|
* [0] PageStatus (uint16_t)
|
||||||
|
* [2..] Records...
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t VirtAddress;
|
||||||
|
uint16_t Data;
|
||||||
|
} EE_Record_t;
|
||||||
|
|
||||||
|
/* Active page base address (runtime selected in EE_Init) */
|
||||||
|
static uint32_t EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
|
||||||
|
/* ==== USER CONFIGURABLE VIRTUAL ADDRESS LIST ===============================
|
||||||
|
* Define your variable IDs here. They must be unique 16-bit values.
|
||||||
|
* Map your configuration variables (bytes, words, arrays) onto these IDs.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* 0x0001: uint16_t parameter_A
|
||||||
|
* 0x0002: uint16_t parameter_B
|
||||||
|
* 0x0010..0x0014: 10-byte array -> 5 uint16_t values
|
||||||
|
*/
|
||||||
|
const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
|
||||||
|
{
|
||||||
|
0x0001,
|
||||||
|
0x0002,
|
||||||
|
0x0003,
|
||||||
|
0x0004,
|
||||||
|
0x0010,
|
||||||
|
0x0011,
|
||||||
|
0x0012,
|
||||||
|
0x0013,
|
||||||
|
0x0014,
|
||||||
|
0x0020,
|
||||||
|
0x0021,
|
||||||
|
0x0022,
|
||||||
|
0x0030,
|
||||||
|
0x0031,
|
||||||
|
0x0032,
|
||||||
|
0x0033
|
||||||
|
};
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
/* --- Internal helpers ---------------------------------------------------- */
|
||||||
|
|
||||||
|
static uint16_t EE_GetPageStatus(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
return *(__IO uint16_t *)pageBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HAL_StatusTypeDef EE_FlashProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef status;
|
||||||
|
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data);
|
||||||
|
HAL_FLASH_Lock();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HAL_StatusTypeDef EE_FlashErasePage(uint32_t PageAddress)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef status;
|
||||||
|
FLASH_EraseInitTypeDef EraseInit;
|
||||||
|
uint32_t PageError = 0;
|
||||||
|
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
|
||||||
|
EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||||
|
EraseInit.PageAddress = PageAddress;
|
||||||
|
EraseInit.NbPages = 1;
|
||||||
|
|
||||||
|
status = HAL_FLASHEx_Erase(&EraseInit, &PageError);
|
||||||
|
|
||||||
|
HAL_FLASH_Lock();
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find first free record address in given page (returns 0 if full) */
|
||||||
|
static uint32_t EE_FindFreeAddress(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
uint32_t addr = pageBase + 2U; /* Skip status word */
|
||||||
|
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||||
|
|
||||||
|
while (addr < (pageEnd - sizeof(EE_Record_t) + 1U))
|
||||||
|
{
|
||||||
|
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||||
|
|
||||||
|
if (vaddr == 0xFFFFU)
|
||||||
|
{
|
||||||
|
/* Empty slot */
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
addr += sizeof(EE_Record_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0U; /* No space */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find latest value of VirtAddress in a specific page */
|
||||||
|
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
|
||||||
|
{
|
||||||
|
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||||
|
uint32_t addr;
|
||||||
|
|
||||||
|
if (Data == NULL)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Start from last possible record and go backwards */
|
||||||
|
for (addr = pageEnd - sizeof(EE_Record_t); addr > pageBase + 1U; addr -= sizeof(EE_Record_t))
|
||||||
|
{
|
||||||
|
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||||
|
uint16_t value = *(__IO uint16_t *)(addr + 2U);
|
||||||
|
|
||||||
|
if (vaddr == 0xFFFFU)
|
||||||
|
{
|
||||||
|
/* Empty slot, skip */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vaddr == VirtAddress)
|
||||||
|
{
|
||||||
|
*Data = value;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Format both pages: erase and set PAGE0 as VALID */
|
||||||
|
static EE_Status EE_Format(void)
|
||||||
|
{
|
||||||
|
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* PAGE1 will remain erased (status = 0xFFFF) */
|
||||||
|
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the base of the other page */
|
||||||
|
static uint32_t EE_GetOtherPageBase(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
return (pageBase == EE_PAGE0_BASE) ? EE_PAGE1_BASE : EE_PAGE0_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Page transfer (garbage collection + new write) */
|
||||||
|
static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
|
||||||
|
{
|
||||||
|
uint32_t oldBase = EE_ActivePageBase;
|
||||||
|
uint32_t newBase = EE_GetOtherPageBase(oldBase);
|
||||||
|
uint32_t addr;
|
||||||
|
uint16_t value;
|
||||||
|
EE_Status st;
|
||||||
|
|
||||||
|
/* Erase new page */
|
||||||
|
if (EE_FlashErasePage(newBase) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Mark new page as RECEIVE */
|
||||||
|
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Start writing records just after status */
|
||||||
|
addr = newBase + 2U;
|
||||||
|
|
||||||
|
/* For each known virtual variable */
|
||||||
|
for (uint16_t i = 0; i < EE_NUM_VIRTUAL_ADDR; i++)
|
||||||
|
{
|
||||||
|
uint16_t vaddr = EE_VirtAddrs[i];
|
||||||
|
|
||||||
|
if (vaddr == VirtAddress)
|
||||||
|
{
|
||||||
|
/* Use the new data passed into PageTransfer */
|
||||||
|
value = Data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Read latest value from old active page */
|
||||||
|
st = EE_FindInPage(oldBase, vaddr, &value);
|
||||||
|
if (st != EE_OK)
|
||||||
|
{
|
||||||
|
/* Variable never written -> skip */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write record to new page */
|
||||||
|
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
addr += sizeof(EE_Record_t);
|
||||||
|
if (addr >= (newBase + EE_PAGE_SIZE))
|
||||||
|
return EE_NO_SPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Erase old page */
|
||||||
|
if (EE_FlashErasePage(oldBase) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Mark new page as VALID */
|
||||||
|
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Update active page */
|
||||||
|
EE_ActivePageBase = newBase;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- Public API ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the EEPROM emulation.
|
||||||
|
* - Checks page statuses and chooses the active page.
|
||||||
|
* - If inconsistent or blank, formats pages.
|
||||||
|
*/
|
||||||
|
EE_Status EE_Init(void)
|
||||||
|
{
|
||||||
|
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
|
||||||
|
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
|
||||||
|
|
||||||
|
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
/* Fresh device -> format */
|
||||||
|
return EE_Format();
|
||||||
|
}
|
||||||
|
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
else if ((status1 == EE_PAGE_STATUS_VALID) && (status0 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
EE_ActivePageBase = EE_PAGE1_BASE;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Any weird or inconsistent state -> reformat */
|
||||||
|
return EE_Format();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a 16-bit variable by its virtual address.
|
||||||
|
*/
|
||||||
|
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
|
||||||
|
{
|
||||||
|
if (Data == NULL)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
return EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write (append) a 16-bit variable.
|
||||||
|
* - Writes a new record in the active page.
|
||||||
|
* - If the page is full, triggers a page transfer (GC).
|
||||||
|
*/
|
||||||
|
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||||
|
{
|
||||||
|
uint32_t freeAddr;
|
||||||
|
EE_Status st;
|
||||||
|
|
||||||
|
/* Find free space in active page */
|
||||||
|
freeAddr = EE_FindFreeAddress(EE_ActivePageBase);
|
||||||
|
if (freeAddr != 0U)
|
||||||
|
{
|
||||||
|
/* Write new record */
|
||||||
|
if (EE_FlashProgramHalfWord(freeAddr, VirtAddress) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
if (EE_FlashProgramHalfWord(freeAddr + 2U, Data) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No space -> page transfer */
|
||||||
|
st = EE_PageTransfer(VirtAddress, Data);
|
||||||
|
return st;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x02x=%04x",eeadd,val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
#include "cdc_int.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
#include "pwm.h"
|
||||||
|
|
||||||
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern TIM_HandleTypeDef htim2;
|
||||||
|
extern TIM_HandleTypeDef htim3;
|
||||||
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageCDC(void){
|
||||||
|
static uint8_t rxbuf[100];
|
||||||
|
static uint8_t rxidx=0;
|
||||||
|
unsigned char s[100];
|
||||||
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
|
if (CDC_Available()) {
|
||||||
|
int rx = CDC_ReadByte();
|
||||||
|
if (rx < 0) return;
|
||||||
|
//uint8_t out = (uint8_t)c;
|
||||||
|
//if (out >= 'a' && out <= 'z') out -= 32; // to upper
|
||||||
|
rxbuf[rxidx]=rx;
|
||||||
|
while (CDC_Transmit_FS(&rxbuf[rxidx], 1) == USBD_BUSY);//echo
|
||||||
|
if((rx==0x0d)||(rx==0x0a)){
|
||||||
|
if(rxidx){
|
||||||
|
switch(rxbuf[0]){
|
||||||
|
case 'i':
|
||||||
|
sprintf((char*)s,"\ninfo");
|
||||||
|
while (CDC_Transmit_FS(s, 5) == USBD_BUSY);
|
||||||
|
sprintf((char*)s,"\npwm %d%d%d%d%d%d%d%d",IsPwmRunning(timMot1,FWMot1),IsPwmRunning(timMot1,BWMot1),IsPwmRunning(timMot2,FWMot2),IsPwmRunning(timMot2,BWMot2),IsPwmRunning(timMot3,FWMot3),IsPwmRunning(timMot3,BWMot3),IsPwmRunning(timMot4,FWMot4),IsPwmRunning(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
__HAL_TIM_GET_COMPARE(&htim3, TIM_CHANNEL_1);
|
||||||
|
sprintf((char*)s,"\n0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx",(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,FWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot1,BWMot1),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,FWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot2,BWMot2),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,FWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot3,BWMot3),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,FWMot4),(uint32_t)__HAL_TIM_GET_COMPARE(timMot4,BWMot4));
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if(rxidx==8){
|
||||||
|
if((rxbuf[1]>='1')&&(rxbuf[1]<='4')){
|
||||||
|
mot=rxbuf[1]-='0';
|
||||||
|
if(rxbuf[2]=='f'){
|
||||||
|
dir=FW;
|
||||||
|
}else if(rxbuf[2]=='b'){
|
||||||
|
dir=BW;
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv s=f|b");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 16) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(((rxbuf[3]>='0')&&(rxbuf[3]<='9'))&&((rxbuf[4]>='0')&&(rxbuf[4]<='9'))&&((rxbuf[5]>='0')&&(rxbuf[5]<='9'))&&((rxbuf[6]>='0')&&(rxbuf[6]<='9'))&&((rxbuf[7]>='0')&&(rxbuf[7]<='9'))){
|
||||||
|
dm=rxbuf[3]-='0';
|
||||||
|
m=rxbuf[4]-='0';
|
||||||
|
c=rxbuf[5]-='0';
|
||||||
|
d=rxbuf[6]-='0';
|
||||||
|
u=rxbuf[7]-='0';
|
||||||
|
val=dm;
|
||||||
|
val*=10;
|
||||||
|
val+=m;
|
||||||
|
val*=10;
|
||||||
|
val+=c;
|
||||||
|
val*=10;
|
||||||
|
val+=d;
|
||||||
|
val*=10;
|
||||||
|
val+=u;
|
||||||
|
SetMot(mot,dir,val);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 00000>=vvvvv<=99999");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv 1>=m<=4");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 19) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?mnsvvvvv");//m nmotore senso valore
|
||||||
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]>='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%02x=%04x",eeadd,val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]>='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf((char*)s,"\n?");
|
||||||
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxidx=0;
|
||||||
|
}else rxidx++;
|
||||||
|
// tiny spin or yield
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -38,7 +38,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="inh2"/>
|
<item key="textPattern" value="EE_ReadVariable"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="INH1_GPIO_Port"/>
|
<item key="textPattern" value="inh2"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="INH1"/>
|
<item key="textPattern" value="INH1_GPIO_Port"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="INH1_Pin"/>
|
<item key="textPattern" value="INH1"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="Led2"/>
|
<item key="textPattern" value="INH1_Pin"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="htim3"/>
|
<item key="textPattern" value="Led2"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="led2"/>
|
<item key="textPattern" value="htim3"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="HAL_GPIO_TogglePin"/>
|
<item key="textPattern" value="led2"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="pwm.h"/>
|
<item key="textPattern" value="HAL_GPIO_TogglePin"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="HAL_TIM_PWM_Start"/>
|
<item key="textPattern" value="pwm.h"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="GPIO_PIN_13"/>
|
<item key="textPattern" value="HAL_TIM_PWM_Start"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
<item key="ignoreCase" value="true"/>
|
<item key="ignoreCase" value="true"/>
|
||||||
<item key="isRegExSearch" value="false"/>
|
<item key="isRegExSearch" value="false"/>
|
||||||
<item key="isWholeWord" value="false"/>
|
<item key="isWholeWord" value="false"/>
|
||||||
<item key="textPattern" value="LED1"/>
|
<item key="textPattern" value="GPIO_PIN_13"/>
|
||||||
<item key="scope" value="0"/>
|
<item key="scope" value="0"/>
|
||||||
<list key="fileNamePatterns">
|
<list key="fileNamePatterns">
|
||||||
<item value="*"/>
|
<item value="*"/>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<item key="hasShownOverlayPopupBefore" value="true"/>
|
<item key="hasShownOverlayPopupBefore" value="true"/>
|
||||||
<item key="replaceBarOpen" value="false"/>
|
<item key="replaceBarOpen" value="false"/>
|
||||||
<list key="searchhistory">
|
<list key="searchhistory">
|
||||||
|
<item value="eeadd"/>
|
||||||
<item value="hin"/>
|
<item value="hin"/>
|
||||||
</list>
|
</list>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#Sat Dec 06 22:49:36 CET 2025
|
#Sun Dec 07 19:18:32 CET 2025
|
||||||
org.eclipse.core.runtime=2
|
org.eclipse.core.runtime=2
|
||||||
org.eclipse.platform=4.33.0.v20240903-0240
|
org.eclipse.platform=4.33.0.v20240903-0240
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="502542006040019408" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1023042563599610397" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="502542006040019408" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1023042563599610397" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="502542006040019408" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1023042563599610397" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="502542006040019408" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1023042563599610397" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include "usb_device.h"
|
#include "usb_device.h"
|
||||||
|
|
||||||
#include "usbd_cdc_if.h"
|
#include "usbd_cdc_if.h"
|
||||||
#include "cdc_int.h"
|
#include "cdc_int.h"
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "eeprom.h"
|
||||||
#include "pwm.h"
|
#include "pwm.h"
|
||||||
|
|
||||||
extern TIM_HandleTypeDef htim1;
|
extern TIM_HandleTypeDef htim1;
|
||||||
@@ -11,12 +13,49 @@ extern TIM_HandleTypeDef htim2;
|
|||||||
extern TIM_HandleTypeDef htim3;
|
extern TIM_HandleTypeDef htim3;
|
||||||
extern TIM_HandleTypeDef htim4;
|
extern TIM_HandleTypeDef htim4;
|
||||||
|
|
||||||
|
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
|
||||||
|
if((c1>='0')&&(c1<='9')){
|
||||||
|
c1-='0';
|
||||||
|
}else if((c1>='a')&&(c1<='f')){
|
||||||
|
c1=(c1-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c2>='0')&&(c2<='9')){
|
||||||
|
c2-='0';
|
||||||
|
}else if((c2>='a')&&(c2<='f')){
|
||||||
|
c2=(c2-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c3>='0')&&(c3<='9')){
|
||||||
|
c3-='0';
|
||||||
|
}else if((c3>='a')&&(c3<='f')){
|
||||||
|
c3=(c3-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
if((c4>='0')&&(c4<='9')){
|
||||||
|
c4-='0';
|
||||||
|
}else if((c4>='a')&&(c4<='f')){
|
||||||
|
c4=(c4-'a')+10;
|
||||||
|
}else return false;
|
||||||
|
|
||||||
|
*retval=c1;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c2;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c3;
|
||||||
|
*retval*=10;
|
||||||
|
*retval+=c4;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void manageCDC(void){
|
void manageCDC(void){
|
||||||
static uint8_t rxbuf[100];
|
static uint8_t rxbuf[100];
|
||||||
static uint8_t rxidx=0;
|
static uint8_t rxidx=0;
|
||||||
unsigned char s[100];
|
unsigned char s[100];
|
||||||
uint8_t mot,dir,dm,m,c,d,u;
|
uint8_t mot,dir,dm,m,c,d,u;
|
||||||
uint16_t val;
|
uint16_t val;
|
||||||
|
uint16_t eeadd;
|
||||||
|
|
||||||
if (CDC_Available()) {
|
if (CDC_Available()) {
|
||||||
int rx = CDC_ReadByte();
|
int rx = CDC_ReadByte();
|
||||||
@@ -80,6 +119,50 @@ void manageCDC(void){
|
|||||||
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
while (CDC_Transmit_FS(s, 10) == USBD_BUSY);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
if(rxidx>1){
|
||||||
|
if(rxbuf[1]=='r'){
|
||||||
|
if(rxidx==4){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
EEW_Read(eeadd, &val);
|
||||||
|
sprintf((char*)s,"\nee 0x%02x=%04x",eeadd,val);
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else if(rxbuf[1]=='w'){
|
||||||
|
if(rxidx==8){
|
||||||
|
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
|
||||||
|
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
|
||||||
|
EEW_Write(eeadd, val);
|
||||||
|
sprintf((char*)s,"\ndone");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaa hex values");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?er|w");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
sprintf((char*)s,"\n?eraa | ewaavvvv");
|
||||||
|
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
sprintf((char*)s,"\n?");
|
sprintf((char*)s,"\n?");
|
||||||
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
while (CDC_Transmit_FS(s, 2) == USBD_BUSY);
|
||||||
|
|||||||
287
workspace/AUTOM10/Core/Src/eeprom.c
Normal file
287
workspace/AUTOM10/Core/Src/eeprom.c
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
#include "eeprom.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Record format (4 bytes):
|
||||||
|
* [0] VirtAddress (uint16_t)
|
||||||
|
* [2] Data (uint16_t)
|
||||||
|
*
|
||||||
|
* Page layout:
|
||||||
|
* [0] PageStatus (uint16_t)
|
||||||
|
* [2..] Records...
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t VirtAddress;
|
||||||
|
uint16_t Data;
|
||||||
|
} EE_Record_t;
|
||||||
|
|
||||||
|
/* Active page base address (runtime selected in EE_Init) */
|
||||||
|
static uint32_t EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
|
||||||
|
/* 32 sequential virtual addresses */
|
||||||
|
const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
|
||||||
|
{
|
||||||
|
0x0001, 0x0002, 0x0003, 0x0004,
|
||||||
|
0x0005, 0x0006, 0x0007, 0x0008,
|
||||||
|
0x0009, 0x000A, 0x000B, 0x000C,
|
||||||
|
0x000D, 0x000E, 0x000F, 0x0010,
|
||||||
|
0x0011, 0x0012, 0x0013, 0x0014,
|
||||||
|
0x0015, 0x0016, 0x0017, 0x0018,
|
||||||
|
0x0019, 0x001A, 0x001B, 0x001C,
|
||||||
|
0x001D, 0x001E, 0x001F, 0x0020
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
/* --- Internal helpers ---------------------------------------------------- */
|
||||||
|
|
||||||
|
static uint16_t EE_GetPageStatus(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
return *(__IO uint16_t *)pageBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HAL_StatusTypeDef EE_FlashProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef status;
|
||||||
|
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data);
|
||||||
|
HAL_FLASH_Lock();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HAL_StatusTypeDef EE_FlashErasePage(uint32_t PageAddress)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef status;
|
||||||
|
FLASH_EraseInitTypeDef EraseInit;
|
||||||
|
uint32_t PageError = 0;
|
||||||
|
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
|
||||||
|
EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||||
|
EraseInit.PageAddress = PageAddress;
|
||||||
|
EraseInit.NbPages = 1;
|
||||||
|
|
||||||
|
status = HAL_FLASHEx_Erase(&EraseInit, &PageError);
|
||||||
|
|
||||||
|
HAL_FLASH_Lock();
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find first free record address in given page (returns 0 if full) */
|
||||||
|
static uint32_t EE_FindFreeAddress(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
uint32_t addr = pageBase + 2U; /* Skip status word */
|
||||||
|
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||||
|
|
||||||
|
while (addr < (pageEnd - sizeof(EE_Record_t) + 1U))
|
||||||
|
{
|
||||||
|
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||||
|
|
||||||
|
if (vaddr == 0xFFFFU)
|
||||||
|
{
|
||||||
|
/* Empty slot */
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
addr += sizeof(EE_Record_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0U; /* No space */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find latest value of VirtAddress in a specific page */
|
||||||
|
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
|
||||||
|
{
|
||||||
|
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||||
|
uint32_t addr;
|
||||||
|
|
||||||
|
if (Data == NULL)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Start from last possible record and go backwards */
|
||||||
|
for (addr = pageEnd - sizeof(EE_Record_t); addr > pageBase + 1U; addr -= sizeof(EE_Record_t))
|
||||||
|
{
|
||||||
|
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||||
|
uint16_t value = *(__IO uint16_t *)(addr + 2U);
|
||||||
|
|
||||||
|
if (vaddr == 0xFFFFU)
|
||||||
|
{
|
||||||
|
/* Empty slot, skip */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vaddr == VirtAddress)
|
||||||
|
{
|
||||||
|
*Data = value;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Format both pages: erase and set PAGE0 as VALID */
|
||||||
|
static EE_Status EE_Format(void)
|
||||||
|
{
|
||||||
|
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* PAGE1 will remain erased (status = 0xFFFF) */
|
||||||
|
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the base of the other page */
|
||||||
|
static uint32_t EE_GetOtherPageBase(uint32_t pageBase)
|
||||||
|
{
|
||||||
|
return (pageBase == EE_PAGE0_BASE) ? EE_PAGE1_BASE : EE_PAGE0_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Page transfer (garbage collection + new write) */
|
||||||
|
static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
|
||||||
|
{
|
||||||
|
uint32_t oldBase = EE_ActivePageBase;
|
||||||
|
uint32_t newBase = EE_GetOtherPageBase(oldBase);
|
||||||
|
uint32_t addr;
|
||||||
|
uint16_t value;
|
||||||
|
EE_Status st;
|
||||||
|
|
||||||
|
/* Erase new page */
|
||||||
|
if (EE_FlashErasePage(newBase) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Mark new page as RECEIVE */
|
||||||
|
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Start writing records just after status */
|
||||||
|
addr = newBase + 2U;
|
||||||
|
|
||||||
|
/* For each known virtual variable */
|
||||||
|
for (uint16_t i = 0; i < EE_NUM_VIRTUAL_ADDR; i++)
|
||||||
|
{
|
||||||
|
uint16_t vaddr = EE_VirtAddrs[i];
|
||||||
|
|
||||||
|
if (vaddr == VirtAddress)
|
||||||
|
{
|
||||||
|
/* Use the new data passed into PageTransfer */
|
||||||
|
value = Data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Read latest value from old active page */
|
||||||
|
st = EE_FindInPage(oldBase, vaddr, &value);
|
||||||
|
if (st != EE_OK)
|
||||||
|
{
|
||||||
|
/* Variable never written -> skip */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write record to new page */
|
||||||
|
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
addr += sizeof(EE_Record_t);
|
||||||
|
if (addr >= (newBase + EE_PAGE_SIZE))
|
||||||
|
return EE_NO_SPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Erase old page */
|
||||||
|
if (EE_FlashErasePage(oldBase) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Mark new page as VALID */
|
||||||
|
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
/* Update active page */
|
||||||
|
EE_ActivePageBase = newBase;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- Public API ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the EEPROM emulation.
|
||||||
|
* - Checks page statuses and chooses the active page.
|
||||||
|
* - If inconsistent or blank, formats pages.
|
||||||
|
*/
|
||||||
|
EE_Status EE_Init(void)
|
||||||
|
{
|
||||||
|
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
|
||||||
|
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
|
||||||
|
|
||||||
|
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
/* Fresh device -> format */
|
||||||
|
return EE_Format();
|
||||||
|
}
|
||||||
|
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
else if ((status1 == EE_PAGE_STATUS_VALID) && (status0 == EE_PAGE_STATUS_ERASED))
|
||||||
|
{
|
||||||
|
EE_ActivePageBase = EE_PAGE1_BASE;
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Any weird or inconsistent state -> reformat */
|
||||||
|
return EE_Format();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a 16-bit variable by its virtual address.
|
||||||
|
*/
|
||||||
|
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
|
||||||
|
{
|
||||||
|
if (Data == NULL)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
return EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write (append) a 16-bit variable.
|
||||||
|
* - Writes a new record in the active page.
|
||||||
|
* - If the page is full, triggers a page transfer (GC).
|
||||||
|
*/
|
||||||
|
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||||
|
{
|
||||||
|
uint32_t freeAddr;
|
||||||
|
EE_Status st;
|
||||||
|
|
||||||
|
/* Find free space in active page */
|
||||||
|
freeAddr = EE_FindFreeAddress(EE_ActivePageBase);
|
||||||
|
if (freeAddr != 0U)
|
||||||
|
{
|
||||||
|
/* Write new record */
|
||||||
|
if (EE_FlashProgramHalfWord(freeAddr, VirtAddress) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
if (EE_FlashProgramHalfWord(freeAddr + 2U, Data) != HAL_OK)
|
||||||
|
return EE_ERROR;
|
||||||
|
|
||||||
|
return EE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No space -> page transfer */
|
||||||
|
st = EE_PageTransfer(VirtAddress, Data);
|
||||||
|
return st;
|
||||||
|
}
|
||||||
|
|
||||||
88
workspace/AUTOM10/Core/Src/eeprom.h
Normal file
88
workspace/AUTOM10/Core/Src/eeprom.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* eeprom.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 7, 2025
|
||||||
|
* Author: user
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EEPROM_H
|
||||||
|
#define __EEPROM_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple EEPROM emulation for STM32F103C8T6 (medium density).
|
||||||
|
* - Uses 2 Flash pages (1 kB each) at the end of Flash.
|
||||||
|
* - Stores variables as 16-bit values identified by 16-bit "virtual addresses".
|
||||||
|
*
|
||||||
|
* You must define the list of virtual addresses in eeprom.c: EE_VirtAddrs[].
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EE_OK = 0,
|
||||||
|
EE_ERROR,
|
||||||
|
EE_NOT_FOUND,
|
||||||
|
EE_NO_SPACE
|
||||||
|
} EE_Status;
|
||||||
|
|
||||||
|
/* Flash parameters for STM32F103C8T6 */
|
||||||
|
#define EE_FLASH_BASE_ADDR 0x08000000U
|
||||||
|
#define EE_PAGE_SIZE 0x400U /* 1 kB pages */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Here we assume a 64 kB Flash device (STM32F103C8T6):
|
||||||
|
* Flash range: 0x0800 0000 - 0x0800 FFFF
|
||||||
|
* Pages: 0..63 (64 pages)
|
||||||
|
* We use the last 2 pages for EEPROM:
|
||||||
|
* - Page 62: 0x0800 F800
|
||||||
|
* - Page 63: 0x0800 FC00
|
||||||
|
*/
|
||||||
|
#define EE_PAGE0_BASE (EE_FLASH_BASE_ADDR + (62U * EE_PAGE_SIZE))
|
||||||
|
#define EE_PAGE1_BASE (EE_FLASH_BASE_ADDR + (63U * EE_PAGE_SIZE))
|
||||||
|
|
||||||
|
/* Page status markers (stored in the first halfword of each page) */
|
||||||
|
#define EE_PAGE_STATUS_ERASED 0xFFFFU
|
||||||
|
#define EE_PAGE_STATUS_VALID 0xAAAAU
|
||||||
|
#define EE_PAGE_STATUS_RECEIVE 0x5555U
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure how many virtual variables you have.
|
||||||
|
* Example: bytes, words, and array elements mapped to 16-bit variables.
|
||||||
|
* Set EE_NUM_VIRTUAL_ADDR and define EE_VirtAddrs[] in eeprom.c.
|
||||||
|
*/
|
||||||
|
/* 32 virtual variables, sequential addresses */
|
||||||
|
#define EE_NUM_VIRTUAL_ADDR 32U
|
||||||
|
#define EEW_ADDR(i) (uint16_t)(0x0001 + (i)) // i = 0..31
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Virtual address table (defined in eeprom.c, can be customized) */
|
||||||
|
extern const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR];
|
||||||
|
|
||||||
|
/* Public API */
|
||||||
|
EE_Status EE_Init(void);
|
||||||
|
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data);
|
||||||
|
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
|
||||||
|
|
||||||
|
/* Pseudo-array accessor */
|
||||||
|
static inline EE_Status EEW_Read(uint8_t idx, uint16_t *value)
|
||||||
|
{
|
||||||
|
return EE_ReadVariable(EEW_ADDR(idx), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EE_Status EEW_Write(uint8_t idx, uint16_t value)
|
||||||
|
{
|
||||||
|
return EE_WriteVariable(EEW_ADDR(idx), value);
|
||||||
|
}
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __EEPROM_H */
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
#include "usbd_cdc_if.h"
|
#include "usbd_cdc_if.h"
|
||||||
#include "cdc_int.h"
|
#include "cdc_int.h"
|
||||||
|
#include "eeprom.h"
|
||||||
#include "pwm.h"
|
#include "pwm.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
@@ -133,7 +133,11 @@ int main(void)
|
|||||||
StopMot(timMot3,BWMot3);
|
StopMot(timMot3,BWMot3);
|
||||||
StopMot(timMot4,FWMot4);
|
StopMot(timMot4,FWMot4);
|
||||||
StopMot(timMot4,BWMot4);
|
StopMot(timMot4,BWMot4);
|
||||||
CDC_Transmit_FS((uint8_t*)"Start\r\n", 7);
|
//CDC_Transmit_FS((uint8_t*)"Start\r\n", 7);
|
||||||
|
while (CDC_Transmit_FS((uint8_t*)"Start\r\n", 7) == USBD_BUSY);
|
||||||
|
if (EE_Init() != EE_OK){
|
||||||
|
for(;;);//errore eeprom
|
||||||
|
}
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1 +1,4 @@
|
|||||||
../Core/Src/cdc_int.c:14:6:manageCDC 32
|
../Core/Src/eeprom.h:74:25:EEW_Read 1
|
||||||
|
../Core/Src/eeprom.h:79:25:EEW_Write 1
|
||||||
|
../Core/Src/cdc_int.c:16:6:toHex 17
|
||||||
|
../Core/Src/cdc_int.c:52:6:manageCDC 51
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Core/Src/cdc_int.o: ../Core/Src/cdc_int.c ../USB_DEVICE/App/usb_device.h \
|
|||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h \
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h \
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h \
|
||||||
../Core/Inc/cdc_int.h ../Core/Inc/pwm.h
|
../Core/Inc/cdc_int.h ../Core/Src/eeprom.h ../Core/Inc/pwm.h
|
||||||
../USB_DEVICE/App/usb_device.h:
|
../USB_DEVICE/App/usb_device.h:
|
||||||
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h:
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h:
|
||||||
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h:
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h:
|
||||||
@@ -81,4 +81,5 @@ Core/Src/cdc_int.o: ../Core/Src/cdc_int.c ../USB_DEVICE/App/usb_device.h \
|
|||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h:
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h:
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:
|
||||||
../Core/Inc/cdc_int.h:
|
../Core/Inc/cdc_int.h:
|
||||||
|
../Core/Src/eeprom.h:
|
||||||
../Core/Inc/pwm.h:
|
../Core/Inc/pwm.h:
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1,4 @@
|
|||||||
../Core/Src/cdc_int.c:14:6:manageCDC 184 static
|
../Core/Src/eeprom.h:74:25:EEW_Read 16 static
|
||||||
|
../Core/Src/eeprom.h:79:25:EEW_Write 16 static
|
||||||
|
../Core/Src/cdc_int.c:16:6:toHex 16 static
|
||||||
|
../Core/Src/cdc_int.c:52:6:manageCDC 184 static
|
||||||
|
|||||||
11
workspace/AUTOM10/Debug/Core/Src/eeprom.cyclo
Normal file
11
workspace/AUTOM10/Debug/Core/Src/eeprom.cyclo
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
../Core/Src/eeprom.c:39:17:EE_GetPageStatus 1
|
||||||
|
../Core/Src/eeprom.c:44:26:EE_FlashProgramHalfWord 1
|
||||||
|
../Core/Src/eeprom.c:55:26:EE_FlashErasePage 1
|
||||||
|
../Core/Src/eeprom.c:74:17:EE_FindFreeAddress 3
|
||||||
|
../Core/Src/eeprom.c:95:18:EE_FindInPage 5
|
||||||
|
../Core/Src/eeprom.c:126:18:EE_Format 4
|
||||||
|
../Core/Src/eeprom.c:144:17:EE_GetOtherPageBase 2
|
||||||
|
../Core/Src/eeprom.c:150:18:EE_PageTransfer 11
|
||||||
|
../Core/Src/eeprom.c:222:11:EE_Init 7
|
||||||
|
../Core/Src/eeprom.c:252:11:EE_ReadVariable 2
|
||||||
|
../Core/Src/eeprom.c:265:11:EE_WriteVariable 4
|
||||||
62
workspace/AUTOM10/Debug/Core/Src/eeprom.d
Normal file
62
workspace/AUTOM10/Debug/Core/Src/eeprom.d
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
Core/Src/eeprom.o: ../Core/Src/eeprom.c ../Core/Src/eeprom.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h \
|
||||||
|
../Core/Inc/stm32f1xx_hal_conf.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h \
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h \
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h \
|
||||||
|
../Drivers/CMSIS/Include/core_cm3.h \
|
||||||
|
../Drivers/CMSIS/Include/cmsis_version.h \
|
||||||
|
../Drivers/CMSIS/Include/cmsis_compiler.h \
|
||||||
|
../Drivers/CMSIS/Include/cmsis_gcc.h \
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h \
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h
|
||||||
|
../Core/Src/eeprom.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h:
|
||||||
|
../Core/Inc/stm32f1xx_hal_conf.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h:
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h:
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h:
|
||||||
|
../Drivers/CMSIS/Include/core_cm3.h:
|
||||||
|
../Drivers/CMSIS/Include/cmsis_version.h:
|
||||||
|
../Drivers/CMSIS/Include/cmsis_compiler.h:
|
||||||
|
../Drivers/CMSIS/Include/cmsis_gcc.h:
|
||||||
|
../Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h:
|
||||||
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h:
|
||||||
BIN
workspace/AUTOM10/Debug/Core/Src/eeprom.o
Normal file
BIN
workspace/AUTOM10/Debug/Core/Src/eeprom.o
Normal file
Binary file not shown.
11
workspace/AUTOM10/Debug/Core/Src/eeprom.su
Normal file
11
workspace/AUTOM10/Debug/Core/Src/eeprom.su
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
../Core/Src/eeprom.c:39:17:EE_GetPageStatus 16 static
|
||||||
|
../Core/Src/eeprom.c:44:26:EE_FlashProgramHalfWord 32 static
|
||||||
|
../Core/Src/eeprom.c:55:26:EE_FlashErasePage 40 static
|
||||||
|
../Core/Src/eeprom.c:74:17:EE_FindFreeAddress 32 static
|
||||||
|
../Core/Src/eeprom.c:95:18:EE_FindInPage 40 static
|
||||||
|
../Core/Src/eeprom.c:126:18:EE_Format 8 static
|
||||||
|
../Core/Src/eeprom.c:144:17:EE_GetOtherPageBase 16 static
|
||||||
|
../Core/Src/eeprom.c:150:18:EE_PageTransfer 40 static
|
||||||
|
../Core/Src/eeprom.c:222:11:EE_Init 16 static
|
||||||
|
../Core/Src/eeprom.c:252:11:EE_ReadVariable 16 static
|
||||||
|
../Core/Src/eeprom.c:265:11:EE_WriteVariable 24 static
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
../Core/Src/main.c:74:6:HAL_SYSTICK_Callback 4
|
../Core/Src/main.c:74:6:HAL_SYSTICK_Callback 4
|
||||||
../Core/Src/main.c:97:5:main 1
|
../Core/Src/main.c:97:5:main 3
|
||||||
../Core/Src/main.c:170:6:SystemClock_Config 4
|
../Core/Src/main.c:174:6:SystemClock_Config 4
|
||||||
../Core/Src/main.c:218:13:MX_ADC1_Init 3
|
../Core/Src/main.c:222:13:MX_ADC1_Init 3
|
||||||
../Core/Src/main.c:265:13:MX_TIM2_Init 9
|
../Core/Src/main.c:269:13:MX_TIM2_Init 9
|
||||||
../Core/Src/main.c:341:13:MX_TIM4_Init 9
|
../Core/Src/main.c:345:13:MX_TIM4_Init 9
|
||||||
../Core/Src/main.c:415:13:MX_USART1_UART_Init 2
|
../Core/Src/main.c:419:13:MX_USART1_UART_Init 2
|
||||||
../Core/Src/main.c:448:13:MX_GPIO_Init 1
|
../Core/Src/main.c:452:13:MX_GPIO_Init 1
|
||||||
../Core/Src/main.c:524:6:Error_Handler 1
|
../Core/Src/main.c:528:6:Error_Handler 1
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \
|
|||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h \
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h \
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h \
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h \
|
||||||
../Core/Inc/cdc_int.h ../Core/Inc/pwm.h
|
../Core/Inc/cdc_int.h ../Core/Src/eeprom.h ../Core/Inc/pwm.h
|
||||||
../Core/Inc/main.h:
|
../Core/Inc/main.h:
|
||||||
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h:
|
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h:
|
||||||
../Core/Inc/stm32f1xx_hal_conf.h:
|
../Core/Inc/stm32f1xx_hal_conf.h:
|
||||||
@@ -81,4 +81,5 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \
|
|||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h:
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h:
|
||||||
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:
|
../Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:
|
||||||
../Core/Inc/cdc_int.h:
|
../Core/Inc/cdc_int.h:
|
||||||
|
../Core/Src/eeprom.h:
|
||||||
../Core/Inc/pwm.h:
|
../Core/Inc/pwm.h:
|
||||||
|
|||||||
Binary file not shown.
@@ -1,9 +1,9 @@
|
|||||||
../Core/Src/main.c:74:6:HAL_SYSTICK_Callback 8 static
|
../Core/Src/main.c:74:6:HAL_SYSTICK_Callback 8 static
|
||||||
../Core/Src/main.c:97:5:main 8 static
|
../Core/Src/main.c:97:5:main 8 static
|
||||||
../Core/Src/main.c:170:6:SystemClock_Config 88 static
|
../Core/Src/main.c:174:6:SystemClock_Config 88 static
|
||||||
../Core/Src/main.c:218:13:MX_ADC1_Init 24 static
|
../Core/Src/main.c:222:13:MX_ADC1_Init 24 static
|
||||||
../Core/Src/main.c:265:13:MX_TIM2_Init 64 static
|
../Core/Src/main.c:269:13:MX_TIM2_Init 64 static
|
||||||
../Core/Src/main.c:341:13:MX_TIM4_Init 64 static
|
../Core/Src/main.c:345:13:MX_TIM4_Init 64 static
|
||||||
../Core/Src/main.c:415:13:MX_USART1_UART_Init 8 static
|
../Core/Src/main.c:419:13:MX_USART1_UART_Init 8 static
|
||||||
../Core/Src/main.c:448:13:MX_GPIO_Init 40 static
|
../Core/Src/main.c:452:13:MX_GPIO_Init 40 static
|
||||||
../Core/Src/main.c:524:6:Error_Handler 4 static,ignoring_inline_asm
|
../Core/Src/main.c:528:6:Error_Handler 4 static,ignoring_inline_asm
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
# Add inputs and outputs from these tool invocations to the build variables
|
# Add inputs and outputs from these tool invocations to the build variables
|
||||||
C_SRCS += \
|
C_SRCS += \
|
||||||
../Core/Src/cdc_int.c \
|
../Core/Src/cdc_int.c \
|
||||||
|
../Core/Src/eeprom.c \
|
||||||
../Core/Src/main.c \
|
../Core/Src/main.c \
|
||||||
../Core/Src/pwm.c \
|
../Core/Src/pwm.c \
|
||||||
../Core/Src/stm32f1xx_hal_msp.c \
|
../Core/Src/stm32f1xx_hal_msp.c \
|
||||||
@@ -16,6 +17,7 @@ C_SRCS += \
|
|||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./Core/Src/cdc_int.o \
|
./Core/Src/cdc_int.o \
|
||||||
|
./Core/Src/eeprom.o \
|
||||||
./Core/Src/main.o \
|
./Core/Src/main.o \
|
||||||
./Core/Src/pwm.o \
|
./Core/Src/pwm.o \
|
||||||
./Core/Src/stm32f1xx_hal_msp.o \
|
./Core/Src/stm32f1xx_hal_msp.o \
|
||||||
@@ -26,6 +28,7 @@ OBJS += \
|
|||||||
|
|
||||||
C_DEPS += \
|
C_DEPS += \
|
||||||
./Core/Src/cdc_int.d \
|
./Core/Src/cdc_int.d \
|
||||||
|
./Core/Src/eeprom.d \
|
||||||
./Core/Src/main.d \
|
./Core/Src/main.d \
|
||||||
./Core/Src/pwm.d \
|
./Core/Src/pwm.d \
|
||||||
./Core/Src/stm32f1xx_hal_msp.d \
|
./Core/Src/stm32f1xx_hal_msp.d \
|
||||||
@@ -42,7 +45,7 @@ Core/Src/%.o Core/Src/%.su Core/Src/%.cyclo: ../Core/Src/%.c Core/Src/subdir.mk
|
|||||||
clean: clean-Core-2f-Src
|
clean: clean-Core-2f-Src
|
||||||
|
|
||||||
clean-Core-2f-Src:
|
clean-Core-2f-Src:
|
||||||
-$(RM) ./Core/Src/cdc_int.cyclo ./Core/Src/cdc_int.d ./Core/Src/cdc_int.o ./Core/Src/cdc_int.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/pwm.cyclo ./Core/Src/pwm.d ./Core/Src/pwm.o ./Core/Src/pwm.su ./Core/Src/stm32f1xx_hal_msp.cyclo ./Core/Src/stm32f1xx_hal_msp.d ./Core/Src/stm32f1xx_hal_msp.o ./Core/Src/stm32f1xx_hal_msp.su ./Core/Src/stm32f1xx_it.cyclo ./Core/Src/stm32f1xx_it.d ./Core/Src/stm32f1xx_it.o ./Core/Src/stm32f1xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f1xx.cyclo ./Core/Src/system_stm32f1xx.d ./Core/Src/system_stm32f1xx.o ./Core/Src/system_stm32f1xx.su
|
-$(RM) ./Core/Src/cdc_int.cyclo ./Core/Src/cdc_int.d ./Core/Src/cdc_int.o ./Core/Src/cdc_int.su ./Core/Src/eeprom.cyclo ./Core/Src/eeprom.d ./Core/Src/eeprom.o ./Core/Src/eeprom.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/pwm.cyclo ./Core/Src/pwm.d ./Core/Src/pwm.o ./Core/Src/pwm.su ./Core/Src/stm32f1xx_hal_msp.cyclo ./Core/Src/stm32f1xx_hal_msp.d ./Core/Src/stm32f1xx_hal_msp.o ./Core/Src/stm32f1xx_hal_msp.su ./Core/Src/stm32f1xx_it.cyclo ./Core/Src/stm32f1xx_it.d ./Core/Src/stm32f1xx_it.o ./Core/Src/stm32f1xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f1xx.cyclo ./Core/Src/system_stm32f1xx.d ./Core/Src/system_stm32f1xx.o ./Core/Src/system_stm32f1xx.su
|
||||||
|
|
||||||
.PHONY: clean-Core-2f-Src
|
.PHONY: clean-Core-2f-Src
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
"./Core/Src/cdc_int.o"
|
"./Core/Src/cdc_int.o"
|
||||||
|
"./Core/Src/eeprom.o"
|
||||||
"./Core/Src/main.o"
|
"./Core/Src/main.o"
|
||||||
"./Core/Src/pwm.o"
|
"./Core/Src/pwm.o"
|
||||||
"./Core/Src/stm32f1xx_hal_msp.o"
|
"./Core/Src/stm32f1xx_hal_msp.o"
|
||||||
|
|||||||
Reference in New Issue
Block a user