天天看點

使用STM32CubeIDE生成工程并移植UCOSIII

生成工程

生成工程的過程跟用STM32CubeMX是一樣的,配置好後點選code generation,即可生成新的工程,生成的工程如下圖所示。

使用STM32CubeIDE生成工程并移植UCOSIII

移植UCOSIII

1、到Micrium官網下載下傳ucos源碼程式(MDK版)

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

1.1、進入主界面點選 Downloads

使用STM32CubeIDE生成工程并移植UCOSIII

1.2 選擇晶片

我用的STM32F407,是以選擇F4系列的晶片

使用STM32CubeIDE生成工程并移植UCOSIII

1.3下載下傳源碼

因為我的工程是用STM32CubeIDE生成的,在新彈出網頁的最下方,下載下傳的

使用STM32CubeIDE生成工程并移植UCOSIII

在該源碼檔案中,有一個Micrium的檔案夾,裡面是移植需要用到的程式源碼,還有一個PDF檔案,這個檔案裡面詳細說明了移植步驟。

使用STM32CubeIDE生成工程并移植UCOSIII

2、在工程中移植源碼

2.1

2.1.1首先我們把Micrium檔案夾放到之前生生成的工程目錄下,然後回到工程中重新整理目錄,就可以看到該檔案了
使用STM32CubeIDE生成工程并移植UCOSIII
使用STM32CubeIDE生成工程并移植UCOSIII
2.1.2 選中Micrium檔案夾後,右擊,選擇 Resource Configurations > Exclude from build…,在彈出的對話框中,取消選中Debug 和Release選項。
使用STM32CubeIDE生成工程并移植UCOSIII
2.1.3 設定相關檔案的包含路徑

因為我用的是UC/OS III,是以選擇的是UC/OS III的相關檔案,如果是UC/OSII的話,操作時類似的,其實具體的檔案路徑,在上面提到的官方的PDF檔案中都有詳細的介紹。

使用STM32CubeIDE生成工程并移植UCOSIII
使用STM32CubeIDE生成工程并移植UCOSIII
使用STM32CubeIDE生成工程并移植UCOSIII

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 */
           

相關定義

/* 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 */
           

初始化

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 */
}
           

重新定義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;
}
           

建立開始任務

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);
	}
}
           
2.2.2 修改啟動檔案
使用STM32CubeIDE生成工程并移植UCOSIII

這就改完了,我寫的是一個蜂鳴器的任務,可以正常工作。

繼續閱讀