commit 36ab4e2a08d2dd4fdefaa4ee78ac625ce7eb3f10 Author: iamlijihu Date: Thu May 15 18:18:52 2025 +0800 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/boards/fly_buffer_f072c8.json b/boards/fly_buffer_f072c8.json new file mode 100644 index 0000000..b4183f2 --- /dev/null +++ b/boards/fly_buffer_f072c8.json @@ -0,0 +1,44 @@ +{ + "build": { + "arduino": { + "variant_h": "variant_FLY_BUFFER_F072Cx.h" + }, + "core": "stm32", + "cpu": "cortex-m0", + "extra_flags": "-DSTM32F0 -DSTM32F072xB", + "f_cpu": "48000000L", + "framework_extra_flags": { + "arduino": "-DCUSTOM_PERIPHERAL_PINS" + }, + "mcu": "stm32f072c8t6", + "variant": "F072C8", + "product_line": "STM32F072xB" + }, + "debug": { + "jlink_device": "STM32F072C8", + "openocd_target": "stm32f0x", + "svd_path": "STM32F072x.svd" + }, + "frameworks": [ + "arduino", + "cmsis", + "libopencm3", + "stm32cube" + ], + "name": "Fly Buffer F072C8 (64 kB)", + "upload": { + "maximum_ram_size": 16384, + "maximum_size": 65536, + "protocol": "dfu", + "protocols": [ + "blackmagic", + "cmsis-dap", + "dfu", + "jlink", + "serial", + "stlink" + ] + }, + "url": "", + "vendor": "" +} diff --git a/include/README b/include/README new file mode 100644 index 0000000..49819c0 --- /dev/null +++ b/include/README @@ -0,0 +1,37 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the convention is to give header files names that end with `.h'. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..9379397 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into the executable file. + +The source code of each library should be placed in a separate directory +("lib/your_library_name/[Code]"). + +For example, see the structure of the following example libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +Example contents of `src/main.c` using Foo and Bar: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +The PlatformIO Library Dependency Finder will find automatically dependent +libraries by scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/lib/buffer/buffer.cpp b/lib/buffer/buffer.cpp new file mode 100644 index 0000000..d4c8271 --- /dev/null +++ b/lib/buffer/buffer.cpp @@ -0,0 +1,396 @@ +/** + *************************************************************************************** + * @file buffer.cpp + * @author lijihu + * @version V1.0.0 + * @date 2025/05/10 + * @brief 实现缓冲器功能 + *缓冲器说明 + 光感:遮挡1,不遮挡0; + 耗材开关:有耗材0,无耗材1; + 按键:按下0,松开1; + + 引脚: + HALL1 --> PB2 (光感3) + HALL2 --> PB3 (光感2) + HALL3 --> PB4 (光感1) + ENDSTOP_3 --> PB7(耗材开关) + KEY1 --> PB13(后退) + KEY2 --> PB12(前进) + * + * @note + *************************************************************************************** + * 版权声明 COPYRIGHT 2025 xxx@126.com + *************************************************************************************** +**/ + + +#include "buffer.h" +TMC2209Stepper driver(UART, UART, R_SENSE, DRIVER_ADDRESS); +Buffer buffer={0};//存储个传感器状态 +Motor_State motor_state=Stop; + +bool is_front=false;//前进标志位 +uint32_t front_time=0;//前进时间 +const int EEPROM_ADDR_TIMEOUT = 0; +const uint32_t DEFAULT_TIMEOUT = 30000; +uint32_t timeout=30000;//超时时间,单位:ms; +bool is_error=false;//错误标志位,如果连续30s推送耗材没停过,则认为错误 +String serial_buf; + +static HardwareTimer timer(TIM6);//超时出错 + +void buffer_init(){ + buffer_sensor_init(); + buffer_motor_init(); + delay(1000); + + EEPROM.get(EEPROM_ADDR_TIMEOUT, timeout); + // 判断读取的值是否有效(例如首次写入前是 0xFFFFFFFF 或 0) + if (timeout == 0xFFFFFFFF || timeout == 0) { + timeout = DEFAULT_TIMEOUT; + EEPROM.put(EEPROM_ADDR_TIMEOUT, timeout); + Serial.println("EEPROM is empty"); + } else { + Serial.print("read timeout: "); + Serial.println(timeout); + } + + timer.pause(); + timer.setPrescaleFactor(48);//48分频 48000000/48=1000000 + timer.setOverflow(1000);//1ms + timer.attachInterrupt(&timer_it_callback); + timer.resume(); +} + +void buffer_loop(){ + + uint32_t lastToggleTime = millis(); // 记录上次切换的时间 + while(1) + { + + + if(millis() - lastToggleTime >= 500) // 每隔 500ms + { + lastToggleTime = millis(); // 记录当前时间 + digitalToggle(ERR_LED); + } + //1、读取各传感器的值 + read_sensor_state(); + + #if DEBUG + buffer_debug(); + while(Serial.available()>0){ + char c=Serial.read(); + serial_buf+=c; + int pos_enter = -1; + pos_enter = serial_buf.indexOf("\n"); + if(pos_enter != -1){ + String str=serial_buf.substring(0,pos_enter); + serial_buf=serial_buf.substring(pos_enter+1); + if(strstr(str.c_str(),"gconf")!=NULL){ + TMC2208_n::CHOPCONF_t gconf{0}; + + // 提取 "gconf" 后面的十六进制字符串 + int pos = str.indexOf("gconf"); + if (pos != -1) { + String hexPart = str.substring(pos + 5); // 跳过 "gconf" + hexPart.trim(); // 去除前后空白符 + + // 将字符串转换为 32 位无符号整数 + uint32_t hexValue = strtoul(hexPart.c_str(), NULL, 16); + + // 赋值给结构体(按你的结构定义赋值) + gconf.sr = hexValue; // 假设 sr 是结构体中的原始寄存器值字段 + } + driver.GCONF(gconf.sr); + Serial.print("write GCONF:0x"); + Serial.println(gconf.sr,HEX); + Serial.print("read GCONF: 0x"); + Serial.println(driver.GCONF(),HEX); + + } + + } + } + #else + motor_control(); + + while(Serial.available()>0){ + char c=Serial.read(); + serial_buf+=c; + } + if(serial_buf.length()>0){ + + if(serial_buf=="rt"){ + Serial.print("read timeout="); + Serial.println(timeout); + serial_buf=""; + } + else if(serial_buf.startsWith("set")){ + serial_buf.remove(0,3); + int64_t num=serial_buf.toInt(); + if(num<0||num>0xffffffff){ + serial_buf=""; + Serial.println("Error: Invalid timeout value."); + continue; + } + timeout=num; + EEPROM.put(EEPROM_ADDR_TIMEOUT, timeout); + serial_buf=""; + Serial.print("set succeed! timeout="); + Serial.println(timeout); + } + else{ + Serial.println(serial_buf.c_str()); + Serial.println("command error!"); + serial_buf=""; + } + } + + + #endif + } + +} + + + +void buffer_sensor_init(){ + //传感器初始化 + pinMode(HALL1,INPUT); + pinMode(HALL2,INPUT); + pinMode(HALL3,INPUT); + pinMode(ENDSTOP_3,INPUT); + pinMode(KEY1,INPUT); + pinMode(KEY2,INPUT); + + //耗材指示灯初始化 + pinMode(DUANLIAO,OUTPUT); + pinMode(ERR_LED,OUTPUT); + pinMode(START_LED,OUTPUT); +} + +void buffer_motor_init(){ + //电机驱动引脚初始化 + pinMode(EN_PIN, OUTPUT); + pinMode(STEP_PIN, OUTPUT); + pinMode(DIR_PIN, OUTPUT); + digitalWrite(EN_PIN, LOW); // Enable driver in hardware + + //电机驱动初始化 + driver.begin(); // UART: Init SW UART (if selected) with default 115200 baudrate + driver.beginSerial(9600); + driver.I_scale_analog(false); + driver.toff(5); // Enables driver in software + driver.rms_current(I_CURRENT); // Set motor RMS current + driver.microsteps(Move_Divide_NUM); // Set microsteps to 1/16th + driver.VACTUAL(STOP); // Set velocity + driver.en_spreadCycle(true); + driver.pwm_autoscale(true); + +} + +/** + * @brief 读取各传感器状态 + * @param NULL + * @retval NULL +**/ +void read_sensor_state(void) +{ + buffer.buffer1_pos1_sensor_state= digitalRead(HALL3); + buffer.buffer1_pos2_sensor_state= digitalRead(HALL2); + buffer.buffer1_pos3_sensor_state= digitalRead(HALL1); + buffer.buffer1_material_swtich_state=digitalRead(ENDSTOP_3); + buffer.key1=digitalRead(KEY1); + buffer.key2=digitalRead(KEY2); +} + +/** + * @brief 电机控制 + * @param NULL + * @retval NULL +**/ +void motor_control(void) +{ + + static Motor_State last_motor_state=Stop; + + //按键控制电机 + //按键1按下 + if(!digitalRead(KEY1)) + { + WRITE_EN_PIN(0);//使能 + driver.VACTUAL(STOP); //停止 + + driver.shaft(BACK); + driver.VACTUAL(VACTRUAL_VALUE); + while(!digitalRead(KEY1));//等待松手 + + + driver.VACTUAL(STOP); //停止 + motor_state=Stop; + + is_front=false; + front_time=0; + is_error=false; + WRITE_EN_PIN(1);//失能 + + } + else if(!digitalRead(KEY2))//按键2按下 + { + WRITE_EN_PIN(0); + driver.VACTUAL(STOP); //停止 + + driver.shaft(FORWARD); + driver.VACTUAL(VACTRUAL_VALUE); + while(!digitalRead(KEY2)); + + + driver.VACTUAL(STOP); //停止 + motor_state=Stop; + + is_front=false; + front_time=0; + is_error=false; + WRITE_EN_PIN(1); + + } + + //判断耗材 + if(digitalRead(ENDSTOP_3)) + { + //无耗材,停止电机 + driver.VACTUAL(STOP); //停止 + motor_state=Stop; + + //断料引脚输出低电平 + digitalWrite(DUANLIAO,0); + + //关闭指示灯 + digitalWrite(START_LED,0); + + is_front=false; + front_time=0; + is_error=false; + WRITE_EN_PIN(1); + + + return;//无耗材,结束 + } + + //有耗材,断料引脚输出高电平 + digitalWrite(DUANLIAO,1); + + //开启指示灯 + digitalWrite(START_LED,1); + + //判断是否有错误 + if(is_error){ + //停止电机 + driver.VACTUAL(STOP); //停止 + motor_state=Stop; + WRITE_EN_PIN(1); + return ; + } + + //缓冲器位置记录 + if(buffer.buffer1_pos1_sensor_state) //缓冲器位置为1,耗材往前推 + { + last_motor_state=motor_state; //记录上一次状态 + motor_state=Forward; + is_front=true; + + } + else if(buffer.buffer1_pos2_sensor_state) //缓冲器位置为2,电机停止转动 + { + last_motor_state=motor_state; //记录上一次状态 + motor_state=Stop; + is_front=false; + front_time=0; + } + else if(buffer.buffer1_pos3_sensor_state) //缓冲器位置为3,回退耗材 + { + last_motor_state=motor_state; //记录上一次状态 + motor_state=Back; + is_front=false; + front_time=0; + } + + if(motor_state==last_motor_state)//如果上次状态跟这次状态一致,则不需要再次发送控制命令,结束此次函数 + return; + + //电机控制 + switch(motor_state) + { + case Forward://向前 + { + WRITE_EN_PIN(0); + if(last_motor_state==Back) driver.VACTUAL(STOP);//上次是后退,先停下再前进 + driver.shaft(FORWARD); + driver.VACTUAL(VACTRUAL_VALUE); + + }break; + case Stop://停止 + { + WRITE_EN_PIN(1); + driver.VACTUAL(STOP); + + }break; + case Back://向后 + { + WRITE_EN_PIN(0); + if(last_motor_state==Forward) driver.VACTUAL(STOP);;//上次是前进,先停下再后退 + driver.shaft(BACK); + driver.VACTUAL(VACTRUAL_VALUE); + }break; + + } + + +} + +void timer_it_callback(){ + if(is_front){//如果往前推 + front_time++; + if(front_time>timeout){//如果超时 + is_error=true; + } + } +} + +void buffer_debug(void){ + // Serial.print("buffer1_pos1_sensor_state:");Serial.println(buffer.buffer1_pos1_sensor_state); + // Serial.print("buffer1_pos2_sensor_state:");Serial.println(buffer.buffer1_pos2_sensor_state); + // Serial.print("buffer1_pos3_sensor_state:");Serial.println(buffer.buffer1_pos3_sensor_state); + // Serial.print("buffer1_material_swtich_state:");Serial.println(buffer.buffer1_material_swtich_state); + // Serial.print("key1:");Serial.println(buffer.key1); + // Serial.print("key2:");Serial.println(buffer.key2); + static int i=0; + if(i<0x1ff){ + Serial.print("i:"); + Serial.println(i); + driver.GCONF(i); + driver.PWMCONF(i); + i++; + } + uint32_t gconf = driver.GCONF(); + uint32_t chopconf=driver.CHOPCONF(); + uint32_t pwmconf = driver.PWMCONF(); + if(driver.CRCerror){ + Serial.println("CRCerror"); + } + else{ + Serial.print("GCONF():0x"); + Serial.println(gconf,HEX); + Serial.print("CHOPCONF():0x"); + char buf[11]; // "0x" + 8 digits + null terminator + sprintf(buf, "%08lX", chopconf); // %08lX -> 8位大写十六进制(long unsigned) + Serial.println(buf); + Serial.print("PWMCONF():0x"); + sprintf(buf, "%08lX", pwmconf); // %08lX -> 8位大写十六进制(long unsigned) + Serial.println(buf); + Serial.println(""); + } + delay(1000); +} \ No newline at end of file diff --git a/lib/buffer/buffer.h b/lib/buffer/buffer.h new file mode 100644 index 0000000..a12fabd --- /dev/null +++ b/lib/buffer/buffer.h @@ -0,0 +1,106 @@ +/** + *************************************************************************************** + * @file buffer.cpp + * @author lijihu + * @version V1.0.0 + * @date 2025/05/10 + * @brief 实现缓冲器功能 + *缓冲器说明 + 光感:遮挡1,不遮挡0; + 耗材开关:有耗材0,无耗材1; + 按键:按下0,松开1; + + 引脚: + HALL1 --> PB2 (光感3) + HALL2 --> PB3 (光感2) + HALL3 --> PB4 (光感1) + ENDSTOP_3 --> PB7(耗材开关) + KEY1 --> PB13(后退) + KEY2 --> PB12(前进) + * + * @note + *************************************************************************************** + * 版权声明 COPYRIGHT 2024 xxx@126.com + *************************************************************************************** +**/ + +#ifndef __BUFFER_H__ +#define __BUFFER_H__ + +#include +#include +#include + +#define HALL1 PB2 //光感3 +#define HALL2 PB3 //光感2 +#define HALL3 PB4 //光感1 + +#define ENDSTOP_3 PB7 //耗材开关 + +#define KEY1 PB13 //后退 +#define KEY2 PB12 //前进 + +#define EN_PIN PA6 //使能 +#define DIR_PIN PA7 //方向 +#define STEP_PIN PC13 //步 +#define UART PB1 //软串口 + +#define DUANLIAO PB15 //断料 +#define ERR_LED PA15 //指示灯 +#define START_LED PA8 //指示灯 + +#define DRIVER_ADDRESS 0b00 // TMC Driver address according to MS1 and MS2 +#define R_SENSE 0.11f // Match to your driver + +#define SPEED 300 //转速(单位:r/min) +#define Move_Divide_NUM ((int32_t)(64)) //(每步柔性件控制细分量) +#define VACTRUAL_VALUE (uint32_t)(SPEED*Move_Divide_NUM*200/60/0.715) //VACTUAL寄存器值 + +#define STOP 0 //停止 +#define I_CURRENT (600) //电流 +#define WRITE_EN_PIN(x) digitalWrite(EN_PIN,x)//使能EN引脚 +#define FORWARD 1//耗材方向 +#define BACK 0 + +#define DEBUG 0 + +//定义结构体存储缓冲器中各传感器的的状态 +typedef struct Buffer +{ + //buffer1 + bool buffer1_pos1_sensor_state; + bool buffer1_pos2_sensor_state; + bool buffer1_pos3_sensor_state; + bool buffer1_material_swtich_state; + bool key1; + bool key2; + +}Buffer; + +//电机状态控制枚举 +typedef enum +{ + Forward=0,//向前 + Stop, //停止 + Back //后退 +}Motor_State; + +extern void buffer_sensor_init(); +extern void buffer_motor_init(); + +extern void read_sensor_state(void); +extern void motor_control(void); + +extern void buffer_init(); +extern void buffer_loop(void); +extern void timer_it_callback(); +extern void buffer_debug(void); + +extern bool is_error; +extern uint32_t front_time;//前进时间 +extern uint32_t timeout; +extern bool is_front; +extern TMC2209Stepper driver; + + +#endif \ No newline at end of file diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..c58469c --- /dev/null +++ b/platformio.ini @@ -0,0 +1,24 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:fly_buffer_f072c8] +platform = ststm32 +board = fly_buffer_f072c8 +framework = arduino +upload_protocol = dfu +lib_deps = + TMCStepper +build_flags = + -D USBCON + -D USBD_USE_CDC + -D HSE_VALUE=8000000L + -D USE_HSE +board_build.variants_dir = variants +board_build.board_dir = boards diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..d248ae4 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,16 @@ +#include +#include "buffer.h" + +void setup() { + Serial.begin(115200); + Serial.dtr(false); + buffer_init(); + +} + +void loop() { + buffer_loop(); + // Serial.println("loop() is running"); + // delay(1000); +} + diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/variants/F072C8/PeripheralPins_FLY_BUFFER_F072C.c b/variants/F072C8/PeripheralPins_FLY_BUFFER_F072C.c new file mode 100644 index 0000000..5341aaa --- /dev/null +++ b/variants/F072C8/PeripheralPins_FLY_BUFFER_F072C.c @@ -0,0 +1,250 @@ +/* + ******************************************************************************* + * Copyright (c) 2021, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ +/* + * Automatically generated from STM32F072C(8-B)Ux.xml + * CubeMX DB release 6.0.10 + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Notes: + * - The pins mentioned Px_y_ALTz are alternative possibilities which use other + * HW peripheral instances. You can use them the same way as any other "normal" + * pin (i.e. analogWrite(PA7_ALT1, 128);). + * + * - Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC_IN9 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C2)}, + {PB_14, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF5_I2C2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF1_I2C2)}, + {PB_13, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF5_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** TIM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_TIM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_TIM15, 1, 1)}, // TIM15_CH1N + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_TIM15, 1, 0)}, // TIM15_CH1 + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_TIM15, 2, 0)}, // TIM15_CH2 + {PA_4, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM14, 1, 0)}, // TIM14_CH1 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1 + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 1, 0)}, // TIM3_CH1 + {PA_6_ALT1, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_TIM16, 1, 0)}, // TIM16_CH1 + {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7_ALT1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 2, 0)}, // TIM3_CH2 + {PA_7_ALT2, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_TIM14, 1, 0)}, // TIM14_CH1 + {PA_7_ALT3, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_TIM17, 1, 0)}, // TIM17_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1 + {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0_ALT1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 3, 0)}, // TIM3_CH3 + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1_ALT1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 4, 0)}, // TIM3_CH4 + {PB_1_ALT2, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_TIM14, 1, 0)}, // TIM14_CH1 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM16, 1, 1)}, // TIM16_CH1N + {PB_7, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM17, 1, 1)}, // TIM17_CH1N + {PB_8, TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM16, 1, 0)}, // TIM16_CH1 + {PB_9, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM17, 1, 0)}, // TIM17_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 2, 1)}, // TIM1_CH2N + {PB_14_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM15, 1, 0)}, // TIM15_CH1 + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM1, 3, 1)}, // TIM1_CH3N + {PB_15_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM15, 1, 1)}, // TIM15_CH1N + {PB_15_ALT2, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM15, 2, 0)}, // TIM15_CH2 + {NC, NP, 0} +}; +#endif + +//*** UART *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_0, USART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)}, + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)}, + {PA_14, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_1, USART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)}, + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)}, + {PA_15, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)}, + {PA_15, USART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)}, + {PB_1, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, + {PA_6, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)}, + {PB_7, USART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#if defined(HAL_CAN_MODULE_ENABLED) || defined(HAL_CAN_LEGACY_MODULE_ENABLED) +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_CAN)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_CAN)}, + {NC, NP, 0} +}; +#endif + +#if defined(HAL_CAN_MODULE_ENABLED) || defined(HAL_CAN_LEGACY_MODULE_ENABLED) +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_CAN)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_CAN)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#if defined(HAL_PCD_MODULE_ENABLED) || defined(HAL_HCD_MODULE_ENABLED) +WEAK const PinMap PinMap_USB[] = { + {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_DM + {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_DP + // {PA_13, USB, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_USB)}, // USB_NOE + {NC, NP, 0} +}; +#endif + +//*** No SD *** \ No newline at end of file diff --git a/variants/F072C8/PinNamesVar.h b/variants/F072C8/PinNamesVar.h new file mode 100644 index 0000000..ac4ec65 --- /dev/null +++ b/variants/F072C8/PinNamesVar.h @@ -0,0 +1,47 @@ +/* Alternate pin name */ +PA_1_ALT1 = PA_1 | ALT1, +PA_2_ALT1 = PA_2 | ALT1, +PA_3_ALT1 = PA_3 | ALT1, +PA_6_ALT1 = PA_6 | ALT1, +PA_7_ALT1 = PA_7 | ALT1, +PA_7_ALT2 = PA_7 | ALT2, +PA_7_ALT3 = PA_7 | ALT3, +PB_0_ALT1 = PB_0 | ALT1, +PB_1_ALT1 = PB_1 | ALT1, +PB_1_ALT2 = PB_1 | ALT2, +PB_14_ALT1 = PB_14 | ALT1, +PB_15_ALT1 = PB_15 | ALT1, +PB_15_ALT2 = PB_15 | ALT2, + +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = PC_13, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = PA_2, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = PB_5, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = PB_15, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif + +/* USB */ +#ifdef USBCON + USB_DM = PA_11, + USB_DP = PA_12, + USB_NOE = PA_13, +#endif diff --git a/variants/F072C8/boards_entry.txt b/variants/F072C8/boards_entry.txt new file mode 100644 index 0000000..28beedd --- /dev/null +++ b/variants/F072C8/boards_entry.txt @@ -0,0 +1,50 @@ +# This file help to add generic board entry. +# upload.maximum_size and product_line have to be verified +# and changed if needed. +# See: https://github.com/stm32duino/Arduino_Core_STM32/wiki/Add-a-new-variant-%28board%29 + +# Generic F072C8Tx +GenF0.menu.pnum.GENERIC_F072C8TX=Generic F072C8Tx +GenF0.menu.pnum.GENERIC_F072C8TX.upload.maximum_size=65536 +GenF0.menu.pnum.GENERIC_F072C8TX.upload.maximum_data_size=16384 +GenF0.menu.pnum.GENERIC_F072C8TX.build.board=GENERIC_F072C8TX +GenF0.menu.pnum.GENERIC_F072C8TX.build.product_line=STM32F072xB +GenF0.menu.pnum.GENERIC_F072C8TX.build.variant=STM32F0xx/F072C8(T-U)_F072CB(T-U-Y) +GenF0.menu.pnum.GENERIC_F072C8TX.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32F0xx/STM32F0x2.svd + +# Generic F072CBTx +GenF0.menu.pnum.GENERIC_F072CBTX=Generic F072CBTx +GenF0.menu.pnum.GENERIC_F072CBTX.upload.maximum_size=131072 +GenF0.menu.pnum.GENERIC_F072CBTX.upload.maximum_data_size=16384 +GenF0.menu.pnum.GENERIC_F072CBTX.build.board=GENERIC_F072CBTX +GenF0.menu.pnum.GENERIC_F072CBTX.build.product_line=STM32F072xB +GenF0.menu.pnum.GENERIC_F072CBTX.build.variant=STM32F0xx/F072C8(T-U)_F072CB(T-U-Y) +GenF0.menu.pnum.GENERIC_F072CBTX.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32F0xx/STM32F0x2.svd + +# Generic F072C8Ux +GenF0.menu.pnum.GENERIC_F072C8UX=Generic F072C8Ux +GenF0.menu.pnum.GENERIC_F072C8UX.upload.maximum_size=65536 +GenF0.menu.pnum.GENERIC_F072C8UX.upload.maximum_data_size=16384 +GenF0.menu.pnum.GENERIC_F072C8UX.build.board=GENERIC_F072C8UX +GenF0.menu.pnum.GENERIC_F072C8UX.build.product_line=STM32F072xB +GenF0.menu.pnum.GENERIC_F072C8UX.build.variant=STM32F0xx/F072C8(T-U)_F072CB(T-U-Y) +GenF0.menu.pnum.GENERIC_F072C8UX.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32F0xx/STM32F0x2.svd + +# Generic F072CBUx +GenF0.menu.pnum.GENERIC_F072CBUX=Generic F072CBUx +GenF0.menu.pnum.GENERIC_F072CBUX.upload.maximum_size=131072 +GenF0.menu.pnum.GENERIC_F072CBUX.upload.maximum_data_size=16384 +GenF0.menu.pnum.GENERIC_F072CBUX.build.board=GENERIC_F072CBUX +GenF0.menu.pnum.GENERIC_F072CBUX.build.product_line=STM32F072xB +GenF0.menu.pnum.GENERIC_F072CBUX.build.variant=STM32F0xx/F072C8(T-U)_F072CB(T-U-Y) +GenF0.menu.pnum.GENERIC_F072CBUX.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32F0xx/STM32F0x2.svd + +# Generic F072CBYx +GenF0.menu.pnum.GENERIC_F072CBYX=Generic F072CBYx +GenF0.menu.pnum.GENERIC_F072CBYX.upload.maximum_size=131072 +GenF0.menu.pnum.GENERIC_F072CBYX.upload.maximum_data_size=16384 +GenF0.menu.pnum.GENERIC_F072CBYX.build.board=GENERIC_F072CBYX +GenF0.menu.pnum.GENERIC_F072CBYX.build.product_line=STM32F072xB +GenF0.menu.pnum.GENERIC_F072CBYX.build.variant=STM32F0xx/F072C8(T-U)_F072CB(T-U-Y) +GenF0.menu.pnum.GENERIC_F072CBYX.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32F0xx/STM32F0x2.svd + diff --git a/variants/F072C8/ldscript.ld b/variants/F072C8/ldscript.ld new file mode 100644 index 0000000..7313bb8 --- /dev/null +++ b/variants/F072C8/ldscript.ld @@ -0,0 +1,177 @@ +/** + ****************************************************************************** + * @file LinkerScript.ld + * @author Auto-generated by STM32CubeIDE + * @brief Linker script for STM32F072CBTx Device from STM32F0 series + * 128Kbytes FLASH + * 16Kbytes RAM + * + * Set heap size, stack size and stack location according + * to application requirements. + * + * Set memory bank area and size if external memory is used + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ + +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE + FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab (READONLY) : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM (READONLY) : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM AT> FLASH + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/variants/F072C8/variant_FLY_BUFFER_F072C.cpp b/variants/F072C8/variant_FLY_BUFFER_F072C.cpp new file mode 100644 index 0000000..fb313d0 --- /dev/null +++ b/variants/F072C8/variant_FLY_BUFFER_F072C.cpp @@ -0,0 +1,114 @@ + +#include "pins_arduino.h" + +// Pin name +const PinName digitalPin[] = { + PA_8, + PA_9, + PA_10, + PA_11, + PA_12, + PA_13, + PA_14, + PA_15, + PB_2, + PB_3, + PB_4, + PB_5, + PB_6, + PB_7, + PB_8, + PB_9, + PB_10, + PB_11, + PB_12, + PB_13, + PB_14, + PB_15, + PC_13, + PC_14, + PC_15, + PA_0, + PA_1, + PA_2, + PA_3, + PA_4, + PA_5, + PA_6, + PA_7, + PB_0, + PB_1, + PF_0, + PF_1 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 25, // A0 + 26, // A1 + 27, // A2 + 28, // A3 + 29, // A4 + 30, // A5 + 31, // A6 + 32, // A7 + 33, // A8 + 34 // A9 +}; + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; + RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; + 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; + + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/variants/F072C8/variant_FLY_BUFFER_F072Cx.h b/variants/F072C8/variant_FLY_BUFFER_F072Cx.h new file mode 100644 index 0000000..c02afe3 --- /dev/null +++ b/variants/F072C8/variant_FLY_BUFFER_F072Cx.h @@ -0,0 +1,133 @@ +/* + ******************************************************************************* + * Copyright (c) 2021, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ +#pragma once + +/*---------------------------------------------------------------------------- + * STM32 pins number + *----------------------------------------------------------------------------*/ +#define PA8 0 +#define PA9 1 +#define PA10 2 +#define PA11 3 +#define PA12 4 +#define PA13 5 +#define PA14 6 +#define PA15 7 +#define PB2 8 +#define PB3 9 +#define PB4 10 +#define PB5 11 +#define PB6 12 +#define PB7 13 +#define PB8 14 +#define PB9 15 +#define PB10 16 +#define PB11 17 +#define PB12 18 +#define PB13 19 +#define PB14 20 +#define PB15 21 +#define PC13 22 +#define PC14 23 +#define PC15 24 +#define PA0 PIN_A0 +#define PA1 PIN_A1 +#define PA2 PIN_A2 +#define PA3 PIN_A3 +#define PA4 PIN_A4 +#define PA5 PIN_A5 +#define PA6 PIN_A6 +#define PA7 PIN_A7 +#define PB0 PIN_A8 +#define PB1 PIN_A9 +#define PF0 35 +#define PF1 36 + +// Alternate pins number +#define PA1_ALT1 (PA1 | ALT1) +#define PA2_ALT1 (PA2 | ALT1) +#define PA3_ALT1 (PA3 | ALT1) +#define PA6_ALT1 (PA6 | ALT1) +#define PA7_ALT1 (PA7 | ALT1) +#define PA7_ALT2 (PA7 | ALT2) +#define PA7_ALT3 (PA7 | ALT3) +#define PB0_ALT1 (PB0 | ALT1) +#define PB1_ALT1 (PB1 | ALT1) +#define PB1_ALT2 (PB1 | ALT2) +#define PB14_ALT1 (PB14 | ALT1) +#define PB15_ALT1 (PB15 | ALT1) +#define PB15_ALT2 (PB15 | ALT2) + +#define NUM_DIGITAL_PINS 37 +#define NUM_ANALOG_INPUTS 10 + +// On-board LED pin number +#define LED_BUILTIN PA15 +#define LED_RED LED_BUILTIN +#define LED_GREEN PB3 + +// SPI Definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions +#define TIMER_TONE TIM3 +#define TIMER_SERVO TIM2 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 + +// Default pin used for 'Serial' instance +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +//Used for the GPS Module +#define PIN_SERIAL2_TX PA2 +#define PIN_SERIAL2_RX PA3 + +// Extra HAL modules +#if !defined(HAL_DAC_MODULE_DISABLED) + #define HAL_DAC_MODULE_ENABLED +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial +#endif