Initial commit

This commit is contained in:
iamlijihu
2025-05-15 18:18:52 +08:00
commit 36ab4e2a08
17 changed files with 1468 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

10
.vscode/extensions.json vendored Normal file
View File

@@ -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"
]
}

View File

@@ -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": ""
}

37
include/README Normal file
View File

@@ -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

46
lib/README Normal file
View File

@@ -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 <Foo.h>
#include <Bar.h>
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

396
lib/buffer/buffer.cpp Normal file
View File

@@ -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);
}

106
lib/buffer/buffer.h Normal file
View File

@@ -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 <TMCStepper.h>
#include <Arduino.h>
#include <EEPROM.h>
#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

24
platformio.ini Normal file
View File

@@ -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

16
src/main.cpp Normal file
View File

@@ -0,0 +1,16 @@
#include <Arduino.h>
#include "buffer.h"
void setup() {
Serial.begin(115200);
Serial.dtr(false);
buffer_init();
}
void loop() {
buffer_loop();
// Serial.println("loop() is running");
// delay(1000);
}

11
test/README Normal file
View File

@@ -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

View File

@@ -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 ***

View File

@@ -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

View File

@@ -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

177
variants/F072C8/ldscript.ld Normal file
View File

@@ -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
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* 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) }
}

View File

@@ -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

View File

@@ -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