本项目用于测试基地任务的F407ZGT6板子各项功能,测试项目全写在main.c里,正在逐步将新增功能拆成别的模块文件,方便移植
- /Modules 模块文件
- key.c 封装多功能按键处理 作者:霍宏鹏
- uartPack.c 封装串口通信函数
- schduler.c 封装时分调度器
- programCtrl.c 封装用户任务控制
- pid.c 封装PID算法与电机闭环控制相关
- 对应的.h文件包含上述对应封装的必须参量、结构体和一些带参宏
- /Core/Src 系统核心文件
- main.c 主程序
常见的位置套速度环,加了点方便的宏
当前整定对象:JGA25-370 12V190RPM电机 46.6减速比 11线编码器(自己测的,淘宝资料完全不靠谱)
- #include "pid.h"
- 按电机个数用motor_t开结构
- 调用Motor_Setup依次初始化
- 开定时中断,调用Motor_Get_Speed定时获取速度(频率大于等于速度环)
- 开PID调度事件,分别调用Motor_Pos_PID_Run和Motor_Spd_PID_Run,速度环频率最好是位置环的两倍以上,避免速度震荡。
- 不想用位置环直接不管它就行
- 没了
如果重定向完卡sys某个函数里,调试反而有输出,那就是没干掉半主机模式
如下
//重定向printf
#include "stdio.h"
//修正标准库流
struct __FILE {
int handle;
};
FILE __stdout;
//定义_sys_exit()禁用半主机模式
void _sys_exit(int x) { x = x; }
//重定向write方法
int _write(int fd, char *ch, int len) {
HAL_UART_Transmit_IT(&_REDIRECT_UART_PORT, (uint8_t *)ch, len);
while (huart1.gState != HAL_UART_STATE_READY) {
}
return len;
}
// END 重定向printf
STM32的标准流浮点输出默认不使能,需要在编译参数中指定软件浮点或是硬件浮点才能使能转换,F4刚好有硬件DFU,跑浮点比软件快很多
用ssprint也没用,当然可以用微库,但如果不想用的话,可以用下面的方法
以Makefile为例,编译参数如下
CFLAGS += -mfloat-abi=hard
LDFLAGS += -u _printf_float -u _scanf_float
keil可以在Target->C/C++->Options->Floating-point->Floating-point model里开启浮点
Makefile里加入操作如下
clean:
@del /Q $(BUILD_DIR)
@echo CLEAN Done
flash:
@make & openocd -f ./openocd.cfg -c "program $(BUILD_DIR)/$(TARGET).elf verify reset exit"
@echo FLASH Done
erase:
@openocd -f ./openocd.cfg -c "init;halt;reset halt;flash erase_address 0x08000000 0x20000;shutdown;"
@echo ERASE Done
usbflash:
@make & STM32_Programmer_CLI -c port=usb1 -w "$(BUILD_DIR)/$(TARGET).bin" 0x08000000 -v -g 0x08000000
@echo USB FLASH Done
usberase:
@STM32_Programmer_CLI -c port=usb1 -e all
@echo ERASE Done
uartflash:
@make & STM32_Programmer_CLI -c port=COM47 -w "$(BUILD_DIR)/$(TARGET).bin" 0x08000000 -v -g 0x08000000
@echo UART FLASH Done
uarterase:
@STM32_Programmer_CLI -c port=COM47 -e all
@echo ERASE Done
烧录时直接make flash即可,调试使用OpenOCD,可以挂STlink和CmsisDAP,都很好用
忘记带烧录器也可以跑USB或者串口烧,慢点有限,凑合用
说起来我忘了git commit前有个操作叫暂存更改,所以这个项目的history乱的离谱(