STM工程模板 - F103 + SPL + ucosii

前言

要測試一下同事給的傳感器模塊, 想在一個F1固件庫 + ucosii的模板上作試驗,發現沒囤現成的工程。
整理一個以後用。
F1的固件庫模板以前已經囤了 STM32F10x_StdPeriph_Template
ucosii的模板在F407上做過 stm32f407固件庫移植ucosii_v2.92.07

在STM32F10x_StdPeriph_Template加上stm32f407固件庫移植ucosii_v2.92.07中的ucos文件夾, 然後修改啓動文件\startup_arm\startup_stm32f10x_hd_vl.s中的 PendSV_Handler => OS_CPU_PendSVHandler, SysTick_Handler => OS_CPU_SysTickHandler, 就移植完了.

測試代碼和stm32f407固件庫移植ucosii_v2.92.07一樣, 能用。
在 \my_STM32F10x_StdPeriph_Template\user\stm32f10x_it.c 中的異常函數中加入斷言, 方便調試。

改好的模板工程

my_stm32f1_SPL_ucosii_template_2020_0413_1351.zip

測試代碼

// @file main.c

#include <main.h>

/*
選擇芯片後就不需要在option->c/c++中再定義類似STM32F103_HD的東西了
因爲選擇芯片時已經加進去了。而且當你的定義和你選擇的芯片不同時,會報錯:
..\..\Libraries\CMSIS\stm32f10x.h(298): error: #67: expected a "}"
 ADC1_2_IRQn = 18,
*/

#define TASK_PRIO_FOR_TEST	10
#define TASK_STK_SIZE_FOR_TEST 256
OS_STK TASK_STK_FOR_TEST[TASK_STK_SIZE_FOR_TEST];
void task_proc_for_test(void* arg);

int fputc(int ch, FILE *f) {
  return ITM_SendChar(ch); // ITM_SendChar declare on core_cm4.h
}

void assert_failed(uint8_t* file, uint32_t line)
{
  printf("assert_failed(%s, %d)\n", file, line);
}

void my_assert_failed(const char* psz_reason, uint8_t* file, uint32_t line)
{
  printf("my_assert_failed(%s, %s, %d)\n", psz_reason, file, line);
}

void my_init()
{
  RCC_ClocksTypeDef RCC_Clocks;
  
  RCC_GetClocksFreq(&RCC_Clocks); // 必須調用RCC_GetClocksFreq(), 才能載入前面修改過的時鐘參數
  printf("RCC_Clocks.SYSCLK_Frequency = %d\n", RCC_Clocks.SYSCLK_Frequency); // RCC_Clocks.SYSCLK_Frequency = 72000000
  printf("RCC_Clocks.HCLK_Frequency = %d\n", RCC_Clocks.HCLK_Frequency); // RCC_Clocks.HCLK_Frequency = 72000000
  printf("RCC_Clocks.PCLK1_Frequency = %d\n", RCC_Clocks.PCLK1_Frequency); // RCC_Clocks.PCLK1_Frequency = 36000000
  printf("RCC_Clocks.PCLK2_Frequency = %d\n", RCC_Clocks.PCLK2_Frequency); // RCC_Clocks.PCLK2_Frequency = 72000000
  printf("RCC_Clocks.ADCCLK_Frequency = %d\n", RCC_Clocks.ADCCLK_Frequency); // RCC_Clocks.ADCCLK_Frequency = 36000000
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); // @note ls 72000000(72MHZ) / 1000(微秒) = 1ms 發生一次tick
  
  printf("<< my_init()\n");
}

void app_run()
{
  OS_CPU_SR  cpu_sr = 0; // for OS_ENTER_CRITICAL()/OS_EXIT_CRITICAL()
  INT8U rc = 0;
  
  OSInit();
  
  OS_ENTER_CRITICAL(); // os_cpu.h
  
  rc = OSTaskCreate(task_proc_for_test, (void*)0, (OS_STK*)&TASK_STK_FOR_TEST[TASK_STK_SIZE_FOR_TEST - 1], TASK_PRIO_FOR_TEST);
  if (OS_ERR_NONE != rc) {
    printf("err : OSTaskCreate(task_proc_for_test), rc = %d\n", rc);
  }
  
  OS_EXIT_CRITICAL();
  
  OSStart();
}

int main(void)
{
  // 選的MCU是STM32F103ZE, 要修改啓動文件 \startup_arm\startup_stm32f10x_hd_vl.s
  
  printf(">> main\n"); // test ITM message print to MDK debug window
  MY_ASSERT(true, "test MY_ASSERT(true, x)");
  MY_ASSERT(false, "test MY_ASSERT(false, x)"); // 只有條件爲假, 纔會命中斷言函數
  
  my_init();
  app_run();
  
  return EXIT_SUCCESS;
}

void task_proc_for_test(void* arg)
{
  int i_loop_cnt = 0;

  do {
    printf("i_loop_cnt = %d\n", ++i_loop_cnt);
    if (60 == i_loop_cnt) {
      i_loop_cnt = 0; // 用來和計算機上的時鐘比對,看延時準不準
      // 這個延時很準(和計算機上的一分鐘比對過了)
    }
    
    OSTimeDlyHMSM(0, 0, 1, 0);
  } while (1);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章