STM32F429移植FreeRTOS

一、环境

Win10、Keil uVision5、STM32CubeMX、STM32F429IGT6

二、准备工作

2.1创建基于HAL库的STM32F429基础工程

创建新项目,MCU型号选择STM32F429IGTx,然后开始项目。

选择使用外部高速时钟,时钟源为外部晶振,然后配置系统时钟,根据晶振频率将系统时钟配置到180MHz。

配置USART1为异步收发串口模式,设定为115200波特率,8位数据位,1位停止位,无奇偶校验,配置USART1相关外设IO引脚,启用USART1 DMA收发传输,启用USART1中断和其DMA收发关联通道中断并设定优先级。

在项目管理子页面对项目相关配置项以及代码生成项进行相关配置。

建议对HAL时基源选择为SysTick以外的时钟源。

以上步骤完成后点击生成代码,代码生成完以后用Keil uVision5打开项目并进行编译,此时编译应该是能正常编译的。

经过以上步骤,我们创建了不含有FreeRTOS的基础工程(如果想使用CMSIS接口的也可以在配置时直接勾选使用FreeRTOS中间件)。

2.2获取FreeRTOS源码

FreeRTOS作为开源RTOS,允许开源商用,可以在其官方网站找到源码获取入口(官方网址为:www.freertos.org)。进入官网后,在首页点击下载FreeRTOS,进入下载页面点击下载。这里我获取的是FreeRTOS V10.3.1的源码。

三、FreeRTOS移植

在STM32CubeMX生成的项目目录中添加子目录FreeRTOS。将官方源码中Source目录中的所有内容全部复制到我们创建的FreeRTOS目录下。保留FreeRTOS\portable目录下的Keil、MemMang、RVDS,其他的可以删除(其实Keil也可以删除)。

在Keil uVision5中创建分组FreeRTOS_CORE、FreeRTOS_PORTABLE。将FreeRTOS目录下的croutine.c、event_groups.c、list.c、queue.c、stream_buffer.c、tasks.c、timers.c全部添加到分组FreeRTOS_CORE。将FreeRTOS\portable\MemMang\heap_4.c和FreeRTOS\portable\RVDS\ARM_CM4F\port.c添加到分组FreeRTOS_PORTABLE。

然后将FreeRTOS的相关头文件路径添加到项目中。

将官方Demo中的FreeRTOS复制到我们的工程目录FreeRTOS\include中去。

将FreeRTOSConfig.h中第45行左右的 #ifdef __ICCARM__ 修改为 #ifdef __CC_ARM以便和我们使用的编译器匹配。

将FreeRTOSConfig.h中目前没有实现的没有使用的钩子函数开启宏关闭(官方Demo中开启了这些宏):configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK。

打开文件stm32f4xx_it.c,找到SVC_Handler、PendSV_Handler、SysTick_Handler的函数定义将其屏蔽,因为这三个函数和FreeRTOS内核息息相关,在FreeRTOS内核源码中有具体实现,屏蔽掉是为了祛除重定义。

这时候编译,会正常通过。

四、添加基础功能

经过以上步骤实际上已经基本完成了FreeRTOS V10.3.1在STM32F429IGT6的移植,但是为了方便测试,我们还将添加一些基础功能。

4.1串口DMA发送

添加USART1_Tx DMA传输N字节相关代码段:

#define USART1_TX_DMA_BUFFER_MAX_SIZE 1024
uint8_t Usart1_Tx_DMA_Buffer[USART1_TX_DMA_BUFFER_MAX_SIZE+1];
uint16_t Usart1_DMASend_NBytes(uint8_t* buffer, uint16_t size)
{uint16_t size_t=0;if(!size) return 0;size_t = (size > USART1_TX_DMA_BUFFER_MAX_SIZE ? USART1_TX_DMA_BUFFER_MAX_SIZE : size);  while(0 != __HAL_DMA_GET_COUNTER(&hdma_usart1_tx)){;}  if(buffer!=NULL) {memcpy(&Usart1_Tx_DMA_Buffer[0], buffer,size_t);}HAL_UART_Transmit_DMA(&huart1, Usart1_Tx_DMA_Buffer, size_t);       return size;
}

创建几个简单的FreeRTOS任务:

#define START_TASK_PRIO      1
#define START_STK_SIZE      128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);                             #define USART1_SEND_TASK_PRIO      2
#define USART1_SEND_STK_SIZE        256
TaskHandle_t USART1_SendTask_Handler;
void USART1_Send_task(void *pvParameters);          #define APP_TASK_PRIO       3
#define APP_STK_SIZE        256
TaskHandle_t APP_Task_Handler;
void APP_task(void *pvParameters);#define SENSOR_TASK_PRIO      4
#define SENSOR_STK_SIZE         256
TaskHandle_t Sensor_Task_Handler;
void Sensor_task(void *pvParameters);#define USART1_TX_Q_NUM    5
QueueHandle_t Queue_Usart1_tx;     #define MAX_FRAME_COMM_BUFFER_SIZE USART1_TX_DMA_BUFFER_MAX_SIZE
typedef struct
{uint8_t* start_addr;           uint16_t len;
}Usart1_Tx_Buffer_Typedef;int main(void)
{BaseType_t TaskCreateStatus;   HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();TaskCreateStatus= 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); if(pdPASS == TaskCreateStatus){//printf(" start_task create success\r\n");}vTaskStartScheduler();          while (1){}
}void start_task(void *pvParameters)
{BaseType_t TaskCreateStatus;     taskENTER_CRITICAL();           Queue_Usart1_tx=xQueueCreate(USART1_TX_Q_NUM,sizeof(Usart1_Tx_Buffer_Typedef));   TaskCreateStatus= xTaskCreate((TaskFunction_t )USART1_Send_task,      (const char*    )"USART1_Send_task",      (uint16_t       )USART1_SEND_STK_SIZE, (void*          )NULL,               (UBaseType_t    )USART1_SEND_TASK_PRIO, (TaskHandle_t*  )&USART1_SendTask_Handler);  if(pdPASS == TaskCreateStatus){//printf(" LED0Task create success\r\n");}TaskCreateStatus= xTaskCreate((TaskFunction_t )APP_task,         (const char*    )"APP_task",      (uint16_t       )APP_STK_SIZE, (void*          )NULL,               (UBaseType_t    )APP_TASK_PRIO, (TaskHandle_t*  )&APP_Task_Handler);  if(pdPASS == TaskCreateStatus){//printf(" LED0Task create success\r\n");}TaskCreateStatus= xTaskCreate((TaskFunction_t )Sensor_task,         (const char*    )"Sensor_task",       (uint16_t       )SENSOR_STK_SIZE, (void*          )NULL,                (UBaseType_t    )SENSOR_TASK_PRIO,  (TaskHandle_t*  )&Sensor_Task_Handler);  if(pdPASS == TaskCreateStatus){//printf(" LED0Task create success\r\n");}                  vTaskDelete(StartTask_Handler); taskEXIT_CRITICAL();
}void USART1_SendData(uint8_t *pData,uint16_t len)
{   Usart1_Tx_Buffer_Typedef    Tx_Buff;Tx_Buff.start_addr  = pData;Tx_Buff.len                = len;xQueueSendToBack(Queue_Usart1_tx,(void *)&Tx_Buff,portMAX_DELAY);
}void USART1_Send_task(void *pvParameters)
{Usart1_Tx_Buffer_Typedef Tx_Type;BaseType_t res = pdTRUE;while(1){res = xQueueReceive(Queue_Usart1_tx,&Tx_Type,portMAX_DELAY);  if(res == pdTRUE) Usart1_DMASend_NBytes(Tx_Type.start_addr,Tx_Type.len);//通过DMA发送  vTaskDelay(10);    }
}void APP_task(void *pvParameters)
{uint8_t testOut[128];uint32_t index=0;while(1){sprintf((char*)testOut,"APP_task %u \r\n",index++);USART1_SendData(testOut,strlen((const char*)testOut));vTaskDelay(100);                           }
}void Sensor_task(void *pvParameters)
{uint8_t testOut2[128];uint32_t index=0;while(1){sprintf((char*)testOut2,"Sensor_task %u \r\n",index++);USART1_SendData(testOut2,strlen((const char*)testOut2));vTaskDelay(100);                        }
}

4.2下载验证

将工程进行编译、下载验证,符合预期。

五、项目完整源码下载连接

https://download.csdn.net/download/smallerxuan/12551345

STM32F4移植FreeRTOS V10.3.1相关推荐

  1. Cortex M33处理器下移植FreeRTOS V10.2.0的操作记录

    1.前言 本文记录了本人使用Keil V5.28向Cortex M33处理器下的一款MCU进行FreeRTOS V10.2.0的移植操作,过程中描述如存在不当或错误之处欢迎指正. 2.FreeRTOS ...

  2. STM32系列单片机标准库移植FreeRTOS V10.4.6详解

      文中所用到的资料下载地址 https://download.csdn.net/download/qq_20222919/87370679   最近看正点原子新录制了手把手教你学FreeRTOS的视 ...

  3. STM32F4基础工程移植FreeRTOS

    本篇目标:基于上一篇的基础工程(stm32f4_first_demo)上,移植freertos,建立移植工程(stm32f4_freertos). 资料准备: Freertos源文件 最后工程:项目工 ...

  4. freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

    最近因为工作需要用到FreeRTOS,其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程,但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的 ...

  5. 飞思卡尔 k60/k64 移植FreeRTOS+USB

            每年七八月份是智能车大赛的比赛时间,前段时间,学校车队的学弟问我嵌入式系统的问题,于是笔者拿起多年未碰的K60/K64芯片,搭建了一个FreeRTOS+USB的系统框架.文章结尾提供源 ...

  6. GD32F303移植FreeRTOS

    GD32F303移植FreeRTOS 一.移植环境 系统:WIN7 MDK:keil v5.26 开发板:GD32F303C-EVAL 固件库:V1.0.2 FreeRTOS版本:V10.4.0 二. ...

  7. GD32F407 移植FreeRTOS+Lwip

    文章目录 移植过程 移植FreeRTOS 源码拷贝 FreeRTOSConfig.h 注意事项 移植LWIP 源码拷贝与编译 初始化 移植过程 freeRTOS V10.4.5 下载 https:// ...

  8. STM32F407霸天虎FreeRTOS学习笔记——移植FreeRTOS到开发板上

    STM32F407霸天虎FreeRTOS学习笔记--移植FreeRTOS到开发板上 FreeRTOS源码获取 移植第一步:创建文件夹 Keil main.c 实验效果 FreeRTOS源码获取 在移植 ...

  9. 基于STM32F4移植W5500官方驱动库ioLibrary_Driver(转)

    源: 基于STM32F4移植W5500官方驱动库ioLibrary_Driver 参考: 基于STM32+W5500 的Ethernet和Internet移植 Upgrade W5500 Throug ...

最新文章

  1. Linux之绝对路径和相对路径
  2. 网站优化之关键词的挖掘准则有哪些?
  3. 防重复请求处理的实践与总结
  4. numa对MySQL多实例性能影响
  5. 在服务器生成ssl认证
  6. SQL注入——基于报错的注入(五)
  7. leetcode35 插入的位置
  8. mysql报904_EXP-00008:遇到ORACLE错误904问题
  9. rstudio安装包_如何安装R与Rstudio
  10. 山师计算机学硕分数线,2020山东师范大学考研复试分数线已公布
  11. 最小公倍数 [最小公约数的拓展]
  12. Java -- IO
  13. [转]Vue Cli3 + VS Code 愉快调试
  14. pycharm破解补丁激活
  15. 输出三角形,平行四边形,菱形
  16. PPP协议和PPPoE协议
  17. golang无穷大的判断
  18. Squid访问控制实例
  19. 快手2020校园招聘秋招笔试--工程C试卷 (编程题题解全)
  20. 【Web技术】云开发到底怎么用?看这篇就够了

热门文章

  1. LC-417. 太平洋大西洋水流问题(多源BFS、DFS)
  2. 搭建自己的个人服务器(网络配置篇)
  3. 缅怀AI之父图灵,谈论人工智能电话的过去和现在
  4. 微生物组领域最高质量的资源全在这-公众号大全
  5. 数商云SCM系统供应商全生命周期管理,助力建筑材料企业快速定位合适供应商
  6. CSS / 圆角边框+阴影+浮动
  7. Object方法实践之对象数组转化
  8. python中文字符串转语音_Python实现文字转语音功能
  9. 计算机系统集成资质认证条件有哪些?
  10. 1613-3-傅溥衍 总结《2016年11月17日》【连续四十八天总结】