【1】uC/OS-III应用开发————>移植uC/OS-III到STM32F767

  1. 移植前准备工作:
    1. 获取STM32裸机最小工程
      1. 跑马灯实验
    2. uC/OS源码获取:
      1. https://www.micrium.com/downloadcenter/,下载需要注册帐号
      2. 本例程ucosiii 3.04(来源正点原子)
    3. uC/OS文件介绍
    4. 移植到STM32工程
      1. 添加分组
      2. 添加对应文件到相应分组
      3. 添加头文件路径
      4. 修改相应文件
        1. 修改startup_stm32f767xx.s,将其中的PendSV_Handler和SysTick_Handler改为OS_CPU_PendSVHandler和OS_CPU_SysTickHandler
        2. 添加支持FPU(浮点运算单元)代码
          ; Reset handler
          Reset_Handler    PROC
                           EXPORT  Reset_Handler             [WEAK]
                  IMPORT  SystemInit
                  IMPORT  __main
          
                           LDR     R0, =SystemInit
                           BLX     R0
          				 
          		         IF {FPU} != "SoftVFP"
                                                          ; Enable Floating Point Support at reset for FPU
                           LDR.W   R0, =0xE000ED88         ; Load address of CPACR register
                           LDR     R1, [R0]                ; Read value at CPACR
                           ORR     R1,  R1, #(0xF <<20)    ; Set bits 20-23 to enable CP10 and CP11 coprocessors
                                                          ; Write back the modified CPACR value
                           STR     R1, [R0]                ; Wait for store to complete
                           DSB
                          
                                                          ; Disable automatic FP register content
                                                          ; Disable lazy context switch
                           LDR.W   R0, =0xE000EF34         ; Load address to FPCCR register
                           LDR     R1, [R0]
                           AND     R1,  R1, #(0x3FFFFFFF)  ; Clear the LSPEN and ASPEN bits
                           STR     R1, [R0]
                           ISB                             ; Reset pipeline now the FPU is enabled
                           ENDIF				 
          				 
                           LDR     R0, =__main
                           BX      R0
                           ENDP

           

        3. 修改bsp.h
        4. 修改bsp.c
          1. 修改BSP_CPU_ClkFreq函数
            CPU_INT32U  BSP_CPU_ClkFreq (void)
            {
                CPU_INT32U hclk_freq;
                
                hclk_freq = HAL_RCC_GetHCLKFreq();
            
                return (hclk_freq);
            }

             

          2. 修改BSP_Init()函数
            /**************************************************
             * 函数名:void  BSP_Init (void)
             * 描述  :外设初始化
             * 输入  :无
             * 输出  :无
             * 返回  :无 
             * 调用  :内部调用 
             **************************************************/
            void  BSP_Init (void)
            {
            	Cache_Enable();                 //打开L1-Cache
            	HAL_Init();				        //初始化HAL库
            	Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
             
                uart_init(115200); 
            }

             

          3. main文件
            1. /**************** (C) COPYRIGHT  SPT *************
               * 文件名      :main.c
               * 芯片        :STM32F767IGT6
               * 开发工具    :MDK V5.25
               * HAL版本     :STM32Cube_FW_F7_V1.4.0
               * uC/OSIII版本:UCOSIII 3.04
               * 作者        :spt
               * 时间        :2020-04-22
               * 联系方式    :
               * 功能简述    :
               *************************************************/
              #include "includes.h"
              #include "bsp.h"
              
              /*
              *********************************************************************************************************
              *                                         任务控制块TCB
              *********************************************************************************************************
              */
              static OS_TCB   AppTaskStartTCB;
              
              /*
              *********************************************************************************************************
              *                                         任务堆栈
              *********************************************************************************************************
              */
              static CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
              
              /*
              *********************************************************************************************************
              *                                         函数原型
              *********************************************************************************************************
              */
              static void AppTaskStart(void *p_arg);
              
              /**************************************************
               * 函数名:main()
               * 描述  :主函数入口
               * 输入  :无
               * 输出  :无
               * 返回  :无 
               * 调用  :内部调用 
               **************************************************/
              int main(void)
              {
                  OS_ERR err;
                  
                  CPU_IntDis();   //关闭所有中断
                  
                  OSInit(&err);   //系统初始化
                  
              	/* 创建起始任务 */
                  OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                            //任务控制块地址
                               (CPU_CHAR   *)"App Task Start",                            //任务名称
                               (OS_TASK_PTR ) AppTaskStart,                               //任务函数
                               (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                               (OS_PRIO     ) APP_TASK_START_PRIO,                        //任务的优先级
                               (CPU_STK    *)&AppTaskStartStk[0],                         //任务堆栈的基地址
                               (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,               //任务堆栈空间剩下1/10时限制其增长
                               (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,                    //任务堆栈空间(单位:sizeof(CPU_STK))
                               (OS_MSG_QTY  ) 5u,                                         //任务可接收的最大消息数
                               (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                               (void       *) 0,                                          //任务扩展(0表不扩展)
                               (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                               (OS_ERR     *)&err);   
                               
                   OSStart(&err);
              }
              
              
              /**************************************************
               * 函数名:static  void  AppTaskStart (void *p_arg)
               * 描述  :起始任务
               * 输入  :无
               * 输出  :无
               * 返回  :无 
               * 调用  :内部调用 
               **************************************************/
              static  void  AppTaskStart (void *p_arg)
              {
                  CPU_INT32U  cpu_clk_freq;
                  CPU_INT32U  cnts;
                  OS_ERR      err;
              
              
                 (void)p_arg;
              
                  BSP_Init();                                                 /* Initialize BSP functions                             */
                  CPU_Init();                                                 /* Initialize the uC/CPU services                       */
              
                  //初始化滴答计数器
                  cpu_clk_freq = BSP_CPU_ClkFreq();                           /* Determine SysTick reference freq.                    */
                  cnts         = cpu_clk_freq                                 /* Determine nbr SysTick increments                     */
                               / (CPU_INT32U)OSCfg_TickRate_Hz;
                  OS_CPU_SysTickInit(cnts);                                   /* Init uC/OS periodic time src (SysTick).              */
                  //内存管理,堆内存池,内存池表
                  Mem_Init();                                                 /* Initialize memory managment module                   */
              //    Math_Init();                                                /* Initialize mathematical module                       */
              
              
              #if OS_CFG_STAT_TASK_EN > 0u
                  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
              #endif
              
              #ifdef CPU_CFG_INT_DIS_MEAS_EN
                  CPU_IntDisMeasMaxCurReset();
              #endif
              
                  while (DEF_TRUE)
                  {
              		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	//PB1置1
              		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);	//PB0置1
              		printf("灯亮了\r\n");
                      OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);
                      
              		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	//PB1置0
              		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB0置0
              		printf("灯灭了\r\n");
                      OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);       
                  }
              }
              /************************ (C) COPYRIGHT  SPT END OF FILE***********************/
              

               

    5. 下载验证
    6. 总结
      1. ucos不支持MDK版本,移植起来稍显麻烦,是不是要转freertos....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值