背景简述
项目出发点:
(1)STM32 CUBE MX 软件的选用:
对于毕业以后很久没有碰过STM32代码编写的码农来说,如果按照传统的HAL库编写单片机程序费时费力。哪怕是仅仅用裸机跑功能,不仅仅需要重新阅读数据手册和开发板厂家的教程,而且还基于厂家例程改写引脚、外设参数等等。出于项目周期、任务达成两方面考量,为快速完成可供芯片功能、性能测试用途的STM32 demo工程代码,可考虑使用STM32 CUBE MX 软件进行快速代码生成,配合开发板相关手册、网上教程进行排障。(STM32CUBE MX官方下载地址)
(2)RTOS的应用
基于项目多任务实时处理的需求,在项目中添加FREE_RTOS操作系统。借助STM32 CUBE MX 软件和操作系统配套官方配件包(配件包官方下载地址)进行快速移植、配置。
一方面,做项目没有足够时间系统性重拾以前的内容;另一方面,之前学生时代简单上手STM32工程进行实验,没有深究其中的众多机制(书到用时方恨少啊…),所以写下排障的记录,也供有类似需求的开发者参考,抛砖引玉,如有误请大佬指正。
工程的目标:使用STM32CUMX快速配置使用freertos的F103芯片工程,并进行点灯测试验证工程代码完整性以及FREERTOS操作系统移植效果。
现象:编译过程无报错,但是开发板的灯长亮没有按照线程中的控制发生闪烁
环境配置
物理环境:STM32F103开发板+keil,
软件配置:
1、FREERTOS配置
2、点灯操作在LED线程中完成,测试代码如下:
#define ON GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
#define LED1_PIN GPIO_PIN_5
#define LED1_GPIO_PORT GPIOB
#define LED1(a) HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_PIN,a)
void StartTask_LED(void *argument)
{
/* USER CODE BEGIN StartTask_LED */
/* Infinite loop */
for(;;)
{
LED1(ON);
osDelay(400);
LED1(OFF);
osDelay(400);
}
/* USER CODE END StartTask_LED */
}
3、其他时钟树、系统嘀嗒定时器配置均无误。
解决方法
使用裸机点灯程序排除硬件问题以及IDE编译配置问题,最终怀疑到CMSIS V2封装上,随后进行配置调整,如下图interface选项改为CMSIS V1,重新编译
重新编译keil出现错误declaration is incompatible,遂将部分测试代码更改为
void StartTask_LED(void const * argument)
{
/* USER CODE BEGIN StartTask_LED */
/* Infinite loop */
for(;;)
{
LED1(ON);
osDelay(400);
LED1(OFF);
osDelay(400);
}
/* USER CODE END StartTask_LED */
}
编译通过,点灯成功。具体不同版本的封装库为何导致点灯失败暂不清楚,帖子仅作为记录抛砖引玉。有路过的大佬望指点迷津。