少年

  • 一、随笔
  • 二、uCOSIII源码
  • 三、项目导入文件整理
  • 四、导入文件和增加头函数路径
  • 五、代码改动
  • 六、参考资料

一、随笔

  • 移植一个嵌入式系统用了一天时间,只能说不愧是我,在不了解的情况下还是少一些自己的操作,自己挖坑埋自己。记录一下过程和踩过的坑。

二、uCOSIII源码

  • 官网上可以去下,但是比较麻烦,就不多描述了,这里放一份源码(百度网盘的),提取码1111

https://pan.baidu.com/s/1jCoc2sfiij78J0Q-C6ChmA

三、项目导入文件整理

  • 在这个页面建立这两个文件夹,是为了方便后面导入
  • 在uC-BSP新建bsp.c和bsp.h,空文件,等导入之后再加代码
  • 将下面文件路径里框住的文件全部复制到上面一个文件夹,app.c里是main函数,
  • HAL库建立工程,测试程序是点亮自带的灯和串口发送信息,所以就改一下USART1的模式和将PC13引脚设置为输出,RCC和SYS与以前一样就行了。
  • 建立工程也和以前一样,仔细点

四、导入文件和增加头函数路径

  • 折磨开始了,为了能少点折磨,把这几个文件复制到刚刚建立的项目的这个文件夹里
  • 接下来打开keil,点击小方块开始增加item了
  • 点击小方框增加下面这几个分组
  • BSP选择刚刚复制过去的那个文件夹里的文件,记得下面选择全部文件
  • CONFIG里的
  • SOURCE里添加的是这个文件路径,一共有二十个
  • PORT里添加的文件是这个文件路径下的

  • CPU这个分组添加的是uC-CPU文件夹里的文件,同时里面ARM-Cortex-M3\RealView里的文件也要添加
  • 和CPU分组有些类似,进去之后的文件也全部要添加,同时Ports\ARM-Cortex-M3\RealView这个路径里的asm文件也要添加
  • 接下来将这些头文件路径全部加入

加入之后别急着编译,后面还要改代码!!!

五、代码改动

  • 将启动文件里这两处的PendSV_Handler和Systick_Handler改为OS_CPU_PendSVHandler和OS_CPU_SysTickHandler
  • 在app_cfg.h里有两处修改

#define APP_CFG_SERIAL_EN DEF_ENABLED 改为 #define APP_CFG_SERIAL_EN DEF_DISABLED

#define APP_TRACE BSP_Ser_Printf 改为 #define APP_TRACE (void)

  • includes.h里有两处修改

1.在#include <bsp.h> 后面加上
#include “gpio.h”
#include “app_cfg.h”
2.将#include <stm32f10x_lib.h> 改为
#include “stm32f1xx_hal.h”

  • bsp.c代码
// bsp.c
#include "includes.h"#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)CPU_INT32U  BSP_CPU_ClkFreq (void)
{return HAL_RCC_GetHCLKFreq();
}void BSP_Tick_Init(void)
{CPU_INT32U cpu_clk_freq;CPU_INT32U cnts;cpu_clk_freq = BSP_CPU_ClkFreq();#if(OS_VERSION>=3000u)cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;#elsecnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;#endifOS_CPU_SysTickInit(cnts);
}void BSP_Init(void)
{BSP_Tick_Init();MX_GPIO_Init();
}#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{CPU_INT32U  cpu_clk_freq_hz;DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */DWT_CYCCNT      = (CPU_INT32U)0u;DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;cpu_clk_freq_hz = BSP_CPU_ClkFreq();CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS32_to_uSec (CPU_TS32  ts_cnts)
{CPU_INT64U  ts_us;CPU_INT64U  fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS64_to_uSec (CPU_TS64  ts_cnts)
{CPU_INT64U  ts_us;CPU_INT64U  fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif
  • bsp.h代码
// bsp.h
#ifndef  __BSP_H__
#define  __BSP_H__#include "stm32f1xx_hal.h"void BSP_Init(void);#endif
  • lib_cfg.h里修改堆空间的宏定义,它原本是27K,但这块板子RAM一共才20k,修改为5k
#define  LIB_MEM_CFG_HEAP_SIZE          5u * 1024u
  • main.c函数代码
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 任务优先级 */
#define START_TASK_PRIO     3
#define LED0_TASK_PRIO      4
#define LED1_TASK_PRIO      5
#define FLOAT_TASK_PRIO     6/* 任务堆栈大小  */
#define START_STK_SIZE      256
#define LED0_STK_SIZE       128
#define LED1_STK_SIZE       128
#define FLOAT_STK_SIZE      128/* 任务栈 */
CPU_STK START_TASK_STK[START_STK_SIZE];
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
/* 任务控制块 */
OS_TCB StartTaskTCB;
OS_TCB Led0TaskTCB;
OS_TCB Led1TaskTCB;
OS_TCB FloatTaskTCB;
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* 任务函数定义 */
void start_task(void *p_arg);
static  void  AppTaskCreate(void);
static  void  AppObjCreate(void);
static  void  led_pc13(void *p_arg);
static  void  send_msg(void *p_arg);
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{OS_ERR  err;OSInit(&err);HAL_Init();SystemClock_Config();//MX_GPIO_Init(); 这个在BSP的初始化里也会初始化
MX_USART1_UART_Init();  /* 创建任务 */OSTaskCreate((OS_TCB     *)&StartTaskTCB,                /* Create the start task                                */(CPU_CHAR   *)"start task",(OS_TASK_PTR ) start_task,(void       *) 0,(OS_PRIO     ) START_TASK_PRIO,(CPU_STK    *)&START_TASK_STK[0],(CPU_STK_SIZE) START_STK_SIZE/10,(CPU_STK_SIZE) START_STK_SIZE,(OS_MSG_QTY  ) 0,(OS_TICK     ) 0,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);/* 启动多任务系统,控制权交给uC/OS-III */OSStart(&err);            /* Start multitasking (i.e. give control to uC/OS-III). */}void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;/* YangJie add 2021.05.20*/BSP_Init();                                                   /* Initialize BSP functions *///CPU_Init();//Mem_Init();                                                 /* Initialize Memory Management Module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);       //统计任务
#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN            //如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();
#endif#if   OS_CFG_SCHED_ROUND_ROBIN_EN         //当使用时间片轮转的时候//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif      OS_CRITICAL_ENTER();    //进入临界区/* 创建LED0任务 */OSTaskCreate((OS_TCB   * )&Led0TaskTCB,        (CPU_CHAR   * )"led_pc13",        (OS_TASK_PTR )led_pc13,             (void       * )0,                   (OS_PRIO      )LED0_TASK_PRIO,     (CPU_STK   * )&LED0_TASK_STK[0], (CPU_STK_SIZE)LED0_STK_SIZE/10, (CPU_STK_SIZE)LED0_STK_SIZE,        (OS_MSG_QTY  )0,                    (OS_TICK      )0,                   (void       * )0,                   (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR   * )&err);               /* 创建LED1任务 */OSTaskCreate((OS_TCB  * )&Led1TaskTCB,        (CPU_CHAR   * )"led1 task",       (OS_TASK_PTR )send_msg,             (void       * )0,                   (OS_PRIO      )LED1_TASK_PRIO,      (CPU_STK   * )&LED1_TASK_STK[0],    (CPU_STK_SIZE)LED1_STK_SIZE/10, (CPU_STK_SIZE)LED1_STK_SIZE,        (OS_MSG_QTY  )0,                    (OS_TICK      )0,                   (void       * )0,               (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR  * )&err);OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);       //挂起开始任务             OS_CRITICAL_EXIT();    //进入临界区
}
/*** 函数功能: 启动任务函数体。* 输入参数: p_arg 是在创建该任务时传递的形参* 返 回 值: 无* 说    明:无*/
static  void  led_pc13 (void *p_arg)
{OS_ERR      err;(void)p_arg;BSP_Init();                                                 /* Initialize BSP functions                             */CPU_Init();Mem_Init();                                                 /* Initialize Memory Management Module                  */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate();                                            /* Create Application Tasks                             */AppObjCreate();                                             /* Create Application Objects                           */while (DEF_TRUE){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
static  void  send_msg (void *p_arg)
{OS_ERR      err;(void)p_arg;BSP_Init();                                                 /* Initialize BSP functions                             */CPU_Init();Mem_Init();                                                 /* Initialize Memory Management Module                  */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate();                                            /* Create Application Tasks                             */AppObjCreate();                                             /* Create Application Objects                           */while (DEF_TRUE){printf("hello world \r\n");OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/* USER CODE BEGIN 4 */
/*** 函数功能: 创建应用任务* 输入参数: p_arg 是在创建该任务时传递的形参* 返 回 值: 无* 说    明:无*/
static  void  AppTaskCreate (void)
{}/*** 函数功能: uCOSIII内核对象创建* 输入参数: 无* 返 回 值: 无* 说    明:无*/
static  void  AppObjCreate (void)
{}
/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  • 效果

六、参考资料

  • STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程,这位大佬写的很详细,不过他后面的用的时候把HAL库的初始化函数都注释掉了,我试了一会终于加上了。
  • 如果在某个地址没有权限进行写操作,看看这个链接STM32F4 MDK5软件仿真 error : no ‘read’ permission,芯片不一样,但能用

STM32F103C8移植uCOSIII(HAL库)相关推荐

  1. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  2. cebemax hal库 stm32 OLED移植 解析

    cebemax hal库 stm32 OLED移植 序言: 这是一篇对于作者对于将OLED的驱动代码移植成hal库的文章,会有完整的过程,后面自然也会有完整的代码,希望能够帮到大家,同时也是做一个记录 ...

  3. STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...

  4. stm32f103移植ucosIII系统

    文章目录 一. 使用stmcubemax创建工程 二. 准备uCOSIII源码 三. 移植前准备 1. 在ucos源码中新建两个文件夹 2. 在uC-BSP文件夹下新建bsp.c和bsp.h文件 3. ...

  5. STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本

    一.stm32跑马灯实验 a.GPIO general purpose input output 通用输入输出端口,可以做输入也可做输出,GPIO端口可通过程序配置成输入或输出. STM32FXXXI ...

  6. STM32【H7】理论——综述、HAL库简述

    文章目录 1. STM32H7芯片简介 1.1 STM32H7与STM32F1.F4系列芯片的区别 1.2 硬件框图 1.3 STM32H7各型号对比 1.4 总线框图和时钟 1.5 AXI总线 1. ...

  7. STM32(HAL库 标准库通用) AS608光学指纹模块驱动

    工作原理: 引脚连接: AS608模块 TXD 连接单片机RXT,RXD连接TXD,touch引脚可以随便接一个IO 引脚,最后一根线接3.3V,touch引脚主要用于判断是否有手指按下,本文测试没用 ...

  8. UCOSIII移植STM32(Cotex-M4)HAL库相关问题

    作者的开发板:        STM32L431(Cotex-M4) 开发环境:                Keil5 MDK+ STM32CubeMX 官方例程+源码:        UCOSI ...

  9. STM32F103C8T6移植uC/OS-III基于HAL库

    目录 一.ucos是什么 二.获取uC/OS-III源码 三.使用CubeMX建立HAL库 四.移植准备 五.移植 1.添加文件到项目 2.更改代码 3.参数配置 六.烧录 七.实验结果 八.实现三个 ...

最新文章

  1. 智慧停车产业链市场全透析
  2. 最强大的多线程解决方案!!
  3. java连接数据库hei_如何黑MySQL5数据库?(来自:http://superhei.blogbus.com)
  4. mysql innodb 多线程插入_mysql innodb 并发插入问题,包大量死锁错误
  5. pwnable.tw startorw
  6. 用树莓派控制WS2812圣诞树灯饰
  7. 数据分析师自学好还是报班好
  8. 《Head First 设计模式》例子的C++实现(4 单件模式)
  9. 怎么在计算机里找到CF里保存的视频,Win10电脑上查看穿越火线录制保存视频的具体方法...
  10. 【面经】米哈游数据开发面经
  11. The Battle of Chibi---赤壁之战(DP+数据结构(树状数组))
  12. matlab中的分数次方,matlab中如何画出幂函数指数为分数时比如y=x^(1/3)的完整图像...
  13. spring-IOC原理详解
  14. 消息称Snapchat将收购自制表情应用开发商Bitstrips
  15. 基于Java的Minecraft游戏后端自定义插件 05事件监听器
  16. Xshell配色美化
  17. 小白也能轻松上手selenium,无忧获取淘宝商品信息,献给手把手教的会的你
  18. 数据异常检测方法以及实际应用
  19. 文玩第一股,微拍堂跑在了玩物得志前面?
  20. 并行FLASH引导的一点经验-阿哲(转)

热门文章

  1. 蓝桥杯历届试题-蚂蚁感冒
  2. java-php-python-ssm校园面包超市系统计算机毕业设计
  3. 工作交接_java后端
  4. oracle数据库通过域名链接
  5. Vivado中ILA(集成逻辑分析仪)的使用
  6. matlab 全息图,全息图matlab程序.doc
  7. R语言 平均值,中位数和模式
  8. OAuth2.0,CodeChallenge的生成问题
  9. 假如你收到了一封来自Twoo的邮件...
  10. 进制转换:十六进制转八进制、十六进制转十进制