打印
[应用相关]

使用STM32CubeIDE生成工程并移植UCOSIII

[复制链接]
3564|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2021-6-5 18:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
生成工程

生成工程的过程跟用STM32CubeMX是一样的,配置好后点击code generation,即可生成新的工程,生成的工程如下图所示。


使用特权

评论回复
沙发
gwsan|  楼主 | 2021-6-5 18:56 | 只看该作者
移植UCOSIII1、到Micrium官网下载ucos源码程序(MDK版)

网址:https://www.micrium.com/

1.1、进入主界面点击 Downloads


使用特权

评论回复
板凳
gwsan|  楼主 | 2021-6-5 18:56 | 只看该作者
1.2 选择芯片

我用的STM32F407,所以选择F4系列的芯片


使用特权

评论回复
地板
gwsan|  楼主 | 2021-6-5 18:57 | 只看该作者
1.3下载源码

因为我的工程是用STM32CubeIDE生成的,在新弹出网页的最下方,下载的


在该源码文件中,有一个Micrium的文件夹,里面是移植需要用到的程序源码,还有一个PDF文件,这个文件里面详细说明了移植步骤。


使用特权

评论回复
5
gwsan|  楼主 | 2021-6-5 18:58 | 只看该作者
2、在工程中移植源码2.12.1.1首先我们把Micrium文件夹放到之前生生成的工程目录下,然后回到工程中刷新目录,就可以看到该文件了



使用特权

评论回复
6
gwsan|  楼主 | 2021-6-5 18:58 | 只看该作者

2.1.2 选中Micrium文件夹后,右击,选择 Resource Configurations > Exclude from build…,在弹出的对话框中,取消选中Debug 和Release选项。


使用特权

评论回复
7
gwsan|  楼主 | 2021-6-5 18:59 | 只看该作者
2.1.3 设置相关文件的包含路径

因为我用的是UC/OS III,所以选择的是UC/OS III的相关文件,如果是UC/OSII的话,操作时类似的,其实具体的文件路径,在上面提到的官方的PDF文件中都有详细的介绍。




使用特权

评论回复
8
gwsan|  楼主 | 2021-6-5 19:00 | 只看该作者
2.2 修改代码
2.2.1 main.c
增加包含文件

/* USER CODE BEGIN Includes */
#include <app_cfg.h>
#include <cpu_core.h>
#include <os.h>
#include <os_app_hooks.h>
#include <cpu.h>
/* USER CODE END Includes */


使用特权

评论回复
9
gwsan|  楼主 | 2021-6-5 19:01 | 只看该作者
相关定义

/* USER CODE BEGIN PD */
//#warning "Modify this value to match the number of external interrupts in your MCU"
#define EXT_INT_MAX_NBR 22u
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
static OS_TCB StartupTaskTCB;
static CPU_STK StartupTaskStk[APP_CFG_STARTUP_TASK_STK_SIZE];
static void StartupTask (void *p_arg);
/* USER CODE END PV */


使用特权

评论回复
10
gwsan|  楼主 | 2021-6-5 19:02 | 只看该作者
初始化

int main(void)
{
  /* USER CODE BEGIN 1 */
        OS_ERR os_err;
        CPU_INT16U int_id;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  CPU_IntDis();
  for (int_id = CPU_INT_EXT0; int_id <= (EXT_INT_MAX_NBR - 1u); int_id++)
  {
          /* Set all external intr. to KA interrupt priority boundary */
          CPU_IntSrcPrioSet(int_id, CPU_CFG_KA_IPL_BOUNDARY/*, CPU_INT_KA*/);
  }
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  OSInit(&os_err);
  if (os_err != OS_ERR_NONE)
  {
          while (1);
  }
  App_OS_SetAllHooks();
  OSTaskCreate(&StartupTaskTCB,
  "Startup Task",
  StartupTask,
  0u,
  APP_CFG_STARTUP_TASK_PRIO,
  &StartupTaskStk[0u],
  StartupTaskStk[APP_CFG_STARTUP_TASK_STK_SIZE / 10u],
  APP_CFG_STARTUP_TASK_STK_SIZE,
  0u,
  0u,
  0u,
  (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  &os_err);
  if (os_err != OS_ERR_NONE)
  {
          while (1);
  }
  OSStart(&os_err);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//          HAL_GPIO_TogglePin(BUZZER_GPIO_Port,BUZZER_Pin);
//          HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}


使用特权

评论回复
11
gwsan|  楼主 | 2021-6-5 19:03 | 只看该作者
重新定义HAL_InitTick() 和 HAL_GetTick()函数

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
        /* define as empty to prevent the system tick being initialized before
        the OS starts */
        return (HAL_OK);
}
uint32_t HAL_GetTick(void)
{
        CPU_INT32U os_tick_ctr;
        #if (OS_VERSION >= 30000u)
        OS_ERR os_err;
        os_tick_ctr = OSTimeGet(&os_err);
        #else
        os_tick_ctr = OSTimeGet();
        #endif
        return os_tick_ctr;
}


使用特权

评论回复
12
gwsan|  楼主 | 2021-6-5 19:04 | 只看该作者
创建开始任务

static void StartupTask (void *p_arg)
{
        CPU_INT32U cpu_clk;
        OS_ERR os_err;
        (void)p_arg;
        cpu_clk = HAL_RCC_GetHCLKFreq();
        /* Initialize and enable System Tick timer */
        OS_CPU_SysTickInit(cpu_clk);
        while (DEF_TRUE)
        {
                 HAL_GPIO_TogglePin(BUZZER_GPIO_Port,BUZZER_Pin);
                 OSTimeDlyHMSM(0u, 0u, 0u, 200u,OS_OPT_TIME_HMSM_STRICT,&os_err);
        }
}


使用特权

评论回复
13
gwsan|  楼主 | 2021-6-5 19:06 | 只看该作者
2.2.2 修改启动文件

这就改完了,我写的是一个蜂鸣器的任务,可以正常工作。


使用特权

评论回复
14
CosOxygen| | 2021-9-14 22:00 | 只看该作者
你们这个东西是多少年前的?现在M公司主页都已经看不到了

使用特权

评论回复
15
daichaodai| | 2021-9-15 07:48 | 只看该作者
STcubeide里面要得集成ucos就好了

使用特权

评论回复
16
shizaigaole| | 2021-9-24 11:53 | 只看该作者
有freertos,为啥还要UCOS,
没必要嘛。

何况keil自身还带rtx。

无缝集成,都只要勾选选项,就可以了

使用特权

评论回复
17
jkl21| | 2021-10-5 16:40 | 只看该作者
UCOSIII占用多大的内存呢   

使用特权

评论回复
18
iyoum| | 2021-10-5 16:40 | 只看该作者
STM32CubeIDE?  

使用特权

评论回复
19
uytyu| | 2021-10-5 16:40 | 只看该作者
不是keil开发的吗   

使用特权

评论回复
20
myiclife| | 2021-10-5 16:40 | 只看该作者
ide不太习惯用这个的。   

使用特权

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

本版积分规则

68

主题

3426

帖子

1

粉丝