打印
[其他ST产品]

STM32系列单片机标准库移植FreeRTOS

[复制链接]
楼主: qsrg51
手机看帖
扫描二维码
随时随地手机跟帖
21
qsrg51|  楼主 | 2023-12-26 19:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
双击错误提示,跳转到代码中。

使用特权

评论回复
22
qsrg51|  楼主 | 2023-12-26 19:39 | 只看该作者
 这里主要是头文件的路径错误,将sys.h 和 usart.h前面的路径删除掉,再次编译。

使用特权

评论回复
23
qsrg51|  楼主 | 2023-12-26 19:40 | 只看该作者
此时编译错误减少了,但是还有一个led.h的路径错误。双击错误提示,跳转到文件中。

使用特权

评论回复
24
qsrg51|  楼主 | 2023-12-26 19:40 | 只看该作者
 这个freertos_demo.c文件中是FreeRTOS任务相关的代码,正点原子的示例中用到了液晶屏和LED灯,在这里删除液晶屏相关代码,只保留LED灯相关代码。同时要修改LED头文件路径。

使用特权

评论回复
25
qsrg51|  楼主 | 2023-12-26 19:40 | 只看该作者
删除文件中LCD相关的代码

使用特权

评论回复
26
qsrg51|  楼主 | 2023-12-26 19:41 | 只看该作者
修改LED相关代码,修改后代码如下:
#include "freertos_demo.h"
#include "usart.h"
#include "led.h"

/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 */

/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */

/******************************************************************************************************/


/**
* [url=home.php?mod=space&uid=247401]@brief[/url]       FreeRTOS例程入口函数
* @param       无
* @retval      无
*/
void freertos_demo(void)
{
     xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();
}

/**
* @brief       start_task
* @param       pvParameters : 传入参数(未用到)
* @retval      无
*/
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           /* 进入临界区 */
    /* 创建任务1 */
    xTaskCreate((TaskFunction_t )task1,
                (const char*    )"task1",
                (uint16_t       )TASK1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK1_PRIO,
                (TaskHandle_t*  )&Task1Task_Handler);
    /* 创建任务2 */
    xTaskCreate((TaskFunction_t )task2,
                (const char*    )"task2",
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler);
    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

/**
* @brief       task1
* @param       pvParameters : 传入参数(未用到)
* @retval      无
*/
void task1(void *pvParameters)
{
    while(1)
    {        
        LED0=!LED0;                                                  /* LED0闪烁 */
        vTaskDelay(100);                                               /* 延时1000ticks */
    }
}

/**
* @brief       task2
* @param       pvParameters : 传入参数(未用到)
* @retval      无
*/
void task2(void *pvParameters)
{
    while(1)
    {
       LED1=!LED1;
        vTaskDelay(200);                           /* 延时1000ticks */
    }
}

使用特权

评论回复
27
qsrg51|  楼主 | 2023-12-26 19:53 | 只看该作者
修改完成后再次编译工程,这时还有一个错误。

使用特权

评论回复
28
qsrg51|  楼主 | 2023-12-26 19:53 | 只看该作者
 双击错误提示,定位到代码中。

使用特权

评论回复
29
qsrg51|  楼主 | 2023-12-26 19:53 | 只看该作者
 错误提示声明语句不能出现在可执行语句之后。将这行代码移动到函数开始位置处。再次编译工程。


 这时候工程0错误,0警告。

使用特权

评论回复
30
qsrg51|  楼主 | 2023-12-26 19:54 | 只看该作者
下载验证
  在工程中可以看到正点原子的这个芯片用的是103RC系列的芯片,LED口为PA8和PD2口,如果自己有板子的话就可以下载程序验证了。


使用特权

评论回复
31
qsrg51|  楼主 | 2023-12-26 19:54 | 只看该作者
 电路板运行效果

使用特权

评论回复
32
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
 示波器测量LED波形。

使用特权

评论回复
33
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
 通过示波器波形可以看出,一个LED100ms闪烁一次,一个LED200ms闪烁一次。和代码中设置的一样,说明程序功能正常。FreeRTOS的移植已经成功了。

使用特权

评论回复
34
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
将工程移植到其他型号MCU上
  这个工程用只能用到STM32F103RC系列的MCU上,但是我们自己不一定都用的是这个系类的MCU,如果我们用的是其他系列的MCU,那么此时还需要将次工程移植到我们自己的MCU上去。

使用特权

评论回复
35
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
下面就将这个工程移植到STM32F103C8T6芯片上去,首先将刚才的工程复制一份,并重命名。

使用特权

评论回复
36
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
将工程重命名为 FreeRTOS_demo_103C8T6,打开工程。

使用特权

评论回复
37
qsrg51|  楼主 | 2023-12-26 19:55 | 只看该作者
修改单片机型号
  单击魔术棒按钮,选择Device选项,将单片机型号选为STM32F103C8


使用特权

评论回复
38
qsrg51|  楼主 | 2023-12-26 19:56 | 只看该作者
修改单片机类型
  由于STM32F103C8系列MCU是中等容量单片机,而工程默认的STM32F103RC系列MCU是大容量单片机,这里要在C/C++ 选项中将单片机宏定义的类型修改为STM32F10X_MD

使用特权

评论回复
39
qsrg51|  楼主 | 2023-12-26 19:56 | 只看该作者
修改下载文件
  选择debug选项,单击setting按钮,打开Flash Download 选项,选择这个512K的下载文件,然后单击Remove按钮,将默认的这个下载文件删除掉。

使用特权

评论回复
40
qsrg51|  楼主 | 2023-12-26 19:56 | 只看该作者
 单击Add按钮,添加新的下载文件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则