本帖最后由 新曲难觅旧知音 于 2023-10-10 12:10 编辑
#申请原创#
运气很好啊,抽到了二姨家的板子
先给大家看看正面照
没活整就先点个灯吧
首先配置时钟,需要注意的是,这块板子没有板载外部晶振。
不过预留了安装位置,有时间找个晶振装上。
其他就初始化个LED引脚就好了,先写个点灯程序看工程有没有问题。
下载可以看到LED正常闪烁。
第一步新建工程就算结束了。
然后FreeRTOS官网下载最新版本的软件包。
在裸机工程下创建FreeRTOS的目录,并在目录下新建src,include,portable三个文件夹。
这里只用到FreeRTOS文件夹下的内容,把里面Source里的include和portable两个文件夹复制到对应目录,其他.c文件复制到src文件夹里。
然后精简portable里的文件内容,只保留MemMang和GCC里面的ARM_CM0文件夹。
注意:至于这里为什么其他教程是保留RVDS而我们是GCC。因为用RVDS编译会报错,个人推测是因为用的是AC6编译器。(因为我没有AC5)
最后所得文件路径如图所示。
然后在keil里新建这几个文件目录
添加相应的文件进去。注意MemMang文件夹里有好多个heap的c文件,只选择一个就可以了。
然后点击魔术棒,添加头文件路径
这里只需要添加包含头文件的路径就可以了。也就是include和ARM_CM0两个文件夹
然后编译,这时候会提示找不到FreeRTOSConfig.h文件。我们可以从FreeRTOS软件包的Demo里面找个CORTEX_M0+的例程,把它的FreeRTOSConfig.h复制到我们的工程里。
我这里复制进FreeRTOS/include目录里了。之后编译发现报两个错误了
这是因为命名冲突了,直接去stm32l0xx_it.c里注释掉SVC_Handler(void), PendSV_Handler(void)这两个函数
然后重写SysTick_Handler(void)函数
extern void xPortSysTickHandler(void);
//systick中断服务函数
void SysTick_Handler(void)
{
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif /* INCLUDE_xTaskGetSchedulerState */
}
再次编译发现错误就消失了。
在main函数里新建一个task。
xTaskCreate是FreeRTOS中用于创建任务的函数。它的函数原型如下:
BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask);
pxTaskCode:任务函数的指针,即任务的入口函数。
pcName:任务的名称,用于调试和识别任务。
usStackDepth:任务堆栈的深度,以字节为单位。
pvParameters:传递给任务函数的参数。
uxPriority:任务的优先级,数值越高表示优先级越高。
pxCreatedTask:用于获取新创建任务的句柄。
新建一个点灯任务
然后主程序调用就可以了
编译下载就可以看到程序现象
完整工程已上传网盘
https://drfs.ctcontents.com/file/17978698/955554402/dde84a/FreeRTOS_demo.zip
|