软件版本:STM32CubeMX 5.2.1
芯片:STM32F412RETx
网上看到一些设置的文章,一般都是旧版软件的配置,所以自己设置后,记录一下
1. 选择FreeRTOS,然后下拉选择CMSIS_V2,以前也没用过,第一次用所以直接就选择高版本的
默认配置下会自动创建一个task
什么都不修改,直接生成工程会报警告
大致意思是FreeRTOS会使用Systick(而且时强制使用Systick,不能修改的),建议将SYS里的Timebase Source改成其他你不用的定时器
修改后再次点生成工程就没报错的了,但是实际还是有问题
选择NVIC,就会看到一个警告弹窗出来
由于FreeRTOS里中断优先级时从5开始的,如果原来已经设置过串口、ADC、定时器等,则这里还要修改这些中断优先级
生成工程后,编译发现一堆未定义报错
linking...
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol eTaskGetState (referred from cmsis_os2.o).
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol uxTaskGetStackHighWaterMark (referred from cmsis_os2.o).
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol uxTaskGetSystemState (referred from cmsis_os2.o).
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol vTaskDelayUntil (referred from cmsis_os2.o).
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol xQueueGetMutexHolder (referred from cmsis_os2.o).
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol xTimerPendFunctionCallFromISR (referred from cmsis_os2.o).
回到stm32CubeMx,选择FreeRTOS后再选择Include parameters,对比编译时显示未定义的函数,就会看到是禁用状态,大概给看一下后,我懒得对比,就干脆全部enable,
在生成工程,编译,还有个未定义
linking...
STM32F412\STM32F412.axf: Error: L6218E: Undefined symbol uxTaskGetSystemState (referred from cmsis_os2.o).
但是再Include Parameters里没有这个函数
在Keil里对整个工程搜索uxTaskGetSystemState,发现uxTaskGetSystemState定义在task.c文件里,需要条件configUSE_TRACE_FACILITY == 1满足才行
再回到stm32cubemx查看freeRTOS配置,使能USE_TRACE_FACILITY
再生成工程,编译就应该没问题了
不过我的是已经写过其他功能的工程添加FreeRTOS,所以我这边还有另一个报错
../Src/main.c(1171): error: #247: function "HAL_TIM_PeriodElapsedCallback" has already been defined
HAL_TIM_PeriodElapsedCallback重复定义,因为我原来已经使用过定时器,自己重载定义了HAL_TIM_PeriodElapsedCallback函数,在添加FreeRTOS时,需要修改SYS的Timebase Source为其他定时器,stm32cubemx就会自动再创建一个HAL_TIM_PeriodElapsedCallback函数,所以就重定义了,把自己定义的HAL_TIM_PeriodElapsedCallback删掉,用stm32cubemx生成的那个函数即可
至于FreeRTOS配置里的各种参数配置的意思就不说了,因为我都不熟悉,乱说误导人