前言
要测试一下同事给的传感器模块, 想在一个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);
}