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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值