# 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为例 ![img.png](misc/img.png) 在CubeMX左侧找到Middleware and Software Packs 在下拉框中找到X-CUBE-ALGOBUILD,点击下载并勾选启用 ![img_1.png](misc/img_1.png) 最后在CubeMX中完成启用,重新生成代码 ![img_2.png](misc/img_2.png) 在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] 操作逻辑