# JUSTFW
**Repository Path**: justrm/justfw
## Basic Information
- **Project Name**: JUSTFW
- **Description**: 江西理工大学rm电控框架
- **Primary Language**: C
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 6
- **Created**: 2023-08-02
- **Last Updated**: 2025-11-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: RoboMaster
## README
# 简介
JUSTFW(Just Framework)是一个基于FreeRTOS的RoboMaster机器人电控框架
# 如何配置cmake
### 1.CubeMX在生成IDE的选项中选择STM32CubeIDE
### 2.在Clion中导入工程
### 3.导入JUSTFW
在项目的根目录下运行 `git clone https://gitee.com/justrm/justfw`
### 4.修改CMakeLists_template.txt
在Clion生成的 `CMakeLists_template.txt`中找到如下代码
```cmake
add_executable($${PROJECT_NAME}.elf $${SOURCES} $${LINKER_SCRIPT})
```
将其替换为(以框架文件夹名为justfw为例)
```cmake
macro(FIND_INCLUDE_DIR result curdir) #定义函数,2个参数:存放结果result;指定路径curdir;
file(GLOB_RECURSE children "${curdir}/*.hpp" "${curdir}/*.h" ) #遍历获取{curdir}中*.hpp和*.h文件列表
set(dirlist "") #定义dirlist中间变量,并初始化
foreach(child ${children}) #for循环
string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child}) #字符串替换,用/前的字符替换/*h
if(IS_DIRECTORY ${LIB_NAME}) #判断是否为路径
list (FIND dirlist ${LIB_NAME} list_index) #去重,查找dirlist中是否有${LIB_NAME}指定的值,可以区分字符串相同数子后缀不同的路径:例如/app/test_1和/app/test_2
if(${list_index} LESS 0) #若没找到则代表列表中没有该路径
LIST(APPEND dirlist ${LIB_NAME}) #将合法的路径加入dirlist变量中
endif() #结束判断
endif()
endforeach() #结束for循环
set(${result} ${dirlist}) #dirlist结果放入result变量中
endmacro()
FIND_INCLUDE_DIR(INCLUDES "justfw/modules")
include_directories(${INCLUDES})
FIND_INCLUDE_DIR(INCLUDES "justfw/lib")
include_directories(${INCLUDES})
file(GLOB_RECURSE JUSTFW "justfw/lib/*.c" "justfw/lib/*.h" "justfw/interface/*.c" "justfw/interface/*.h" "justfw/modules/*.c" "justfw/modules/*.h" )
include_directories(justfw/interface)
add_executable($${PROJECT_NAME}.elf $${SOURCES} $${LINKER_SCRIPT} $${JUSTFW})
```
找到 `#Uncomment for hardware floating point` ,
并将其后的数行代码解除注释
### 5.添加arm_math库(在部分模块中使用了arm_math加速运算)
以cubemx为例

在CubeMX左侧找到Middleware and Software Packs
在下拉框中找到X-CUBE-ALGOBUILD,点击下载并勾选启用

最后在CubeMX中完成启用,重新生成代码

在cmakelists_template.txt中添加
```cmake
#DSP
include_directories("Middlewares/ST/ARM/DSP/Inc")
link_directories(Middlewares/ST/ARM/DSP/Lib)
link_libraries(libarm_cortexM4lf_math.a) #Middlewares/ST/ARM/DSP/Lib下的文件名
```
### 6.屏蔽原厂USB驱动(cherryUSB)
移植参考[cherryUSB官方文档](https://cherryusb.readthedocs.io/zh-cn/latest/quick_start/index.html#usb-device)
cubemx设置usb为device only,不启用USB_DEVICE包
修改main.c初始化部分(使用define防止cubemx替换)
```objectivec
//屏蔽HAL usb初始化
#define MX_USB_OTG_FS_PCD_Init() do{}while(0)
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
...
MX_USB_OTG_FS_PCD_Init();
...
/* USER CODE BEGIN 2 */
//屏蔽HAL usb初始化
#undef MX_USB_OTG_FS_PCD_Init
```
修改stm32f4xx_it.c中的USB中断函数
```objectivec
void OTG_FS_IRQHandler(void)
{
/* USER CODE BEGIN OTG_FS_IRQn 0 */
#define HAL_PCD_IRQHandler(a) do{}while(0);
/* USER CODE END OTG_FS_IRQn 0 */
HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
/* USER CODE BEGIN OTG_FS_IRQn 1 */
#undef HAL_PCD_IRQHandler
extern void USBD_IRQHandler(uint8_t busid);
USBD_IRQHandler(0);
/* USER CODE END OTG_FS_IRQn 1 */
}
```
### 7.在main.c中添加初始化代码
```objectivec
...(HAL INIT)
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
Modules_Init();
extern void cdc_acm_init(uint8_t busid,uint32_t reg_base);
cdc_acm_init(0,USB_OTG_FS_PERIPH_BASE);
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
```
# TODO:
- [ ] 写一个像样的README
- 核心实现
- [X] 类ros软总线tinybus
- [ ] 基于外部通信的话题注入
- utils
- [X] PID封装
- [ ] 斜坡函数
- [ ] 限幅函数
- [ ] 一阶滤波
- [X] 滑动窗口滤波
- [X] 卡尔曼滤波
- BSP驱动
- [X] CAN
- [X] UART
- [ ] ~~I2C~~
- [ ] ~~SPI~~
- [ ] PWM
- [ ] ADC
- [ ] GPIO
- [X] USB虚拟串口
- 器件驱动
- 电机驱动
- [X] C610
- [X] C620
- [X] M6020
- [X] MF9025
- [X] CyberGear
- [ ] 通用PWM
- [ ] 通用直流有刷电机
- IMU驱动
- [ ] MPU6600
- [X] BMI088
- [ ] IST8310
- 遥控器驱动
- [X] DR16
- [X] 蜂鸣器
- [X] 裁判系统解析
- 发射机构控制
- [X] 摩擦轮发射
- [ ] 气动发射
- [X] 弹仓控制
- 算法
- [X] AHRS
- 底盘运动学解析
- [X] 四麦轮
- [X] 四全向轮
- [ ] 三全向轮
- [X] 四舵轮
- [ ] 三舵轮
- [X] 轮腿底盘
- 云台控制
- [X] 二轴云台
- [X] 六轴机械臂
- 逻辑
- [X] 视觉通信模块
- [X] 操作逻辑