本帖最后由 lemonhub 于 2024-5-22 10:06 编辑
极海APM32F411V Tiny开发板评测07 嵌入式框架Zorb Framework移植 Zorb Framework Zorb Framework是一个轻量级的嵌入式框架,搭建目的是为在不能运行Linux的芯片上快速开发应用,不用反复造轮子。 Zorb Framework的初步设计功能有 1、时间系统功能zf_time 2、环形缓冲区功能zf_buffer 3、列表功能zf_list 4、状态机功能zf_fsm 5、事件功能zf_event 6、定时器功能zf_timer 7、任务功能zf_task 前6个功能,就可以实现纯事件驱动的程序,基本可以满足中小型嵌入式应用程序开发的需求。加上任务功能,是为了满足部分程序对实时性要求较高的需求。当然,也可以将前6个功能裁剪出来,然后运行在现有的嵌入式系统上面,这样子也可以满足实时性的需求。 一、移植前的准备1. 准备目标硬件(开发板/芯片/模组)Zorb Framework支持ARM Cortex M3/M4的内核的芯片的移植。本教程将使用立创开发板极海APM32F411V Tiny开发板进行示例移植,其他 ARM Cortex M3/M4系列开发板和芯片移植方法类似。 调试ARM Cortex M核还需要仿真器,如果您的开发板或者芯片模组没有板载仿真器,就需要连接外置的仿真器,如J-Link、DAPLink之类的。 2.准备编译器环境本移植指南针对的是Keil编译器,所以我们移植内核前需要先安装Keil编译器,能编译ARM Cortex M核的Keil编译器现在也叫MDK。 下载地址为:https://www.keil.com/demo/eval/arm.htm 3. 准备芯片对应的裸机工程移植Zorb Framework基础内核需要您提前准备一个芯片对应的裸机工程,裸机工程包含基本的芯片启动文件、基础配置(时钟、主频等)、以及串口1和systick,其中串口1提供调试打印功能,systick提供系统时间计数功能。
4. 准备Zorb Framework的源码Zorb Framework的源码已经开源,github仓库地址 https://github.com/54zorb/Zorb-Framework 二、移植打开keil工程,开始添加Zorb Framework的内核代码。 1. 添加Zorb Framework源代码文件2. 添加Zorb Framework头文件目录3. 系统滴答计数器 中断相关配置这样Zorb Framework源码就全部添加完毕了。 三、测试移植结果1. 添加app_test测试代码2. 编写测试代码main.c
- /**
- *****************************************************************************
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * [url=home.php?mod=space&uid=187600]@author[/url] CoderEnd
- * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
- * [url=home.php?mod=space&uid=212281]@date[/url] 2024-05-21
- * [url=home.php?mod=space&uid=247401]@brief[/url] 主程序的实现
- *****************************************************************************
- * @history
- * 1.嵌入式框架Zorb Framework
- https://www.cnblogs.com/54zorb/p/9277802.html
- *****************************************************************************
- **/
- #include "main.h"
- #include "zf_includes.h"
- /******************************************************************************
- * 描述 :SystemTick初始化
- * 参数 :无
- * 返回 :无
- ******************************************************************************/
- void SystemTick_init(void)
- {
- if (SysTick_Config(SystemCoreClock / 1000)) /* 1ms */
- {
- ZF_DEBUG(LOG_E, "systemtick init error\r\n");
- while(1);
- }
- }
- /**
- * @brief board_hardware_init
- * @param none
- * @retval none
- **/
- static void board_hardware_init(void)
- {
- SystemTick_init(); //系统时基初始化
- APM_LEDInit(LED2); //LED2初始化
- APM_LEDInit(LED3); //LED3初始化
- USART1_Init(115200); //UART1初始化
- }
- int main()
- {
- board_hardware_init();
- ZF_DEBUG(LOG_D,"Hardware_Init [ok] \r\n");
- ZF_DEBUG(LOG_D,"apm32f411tiny board testing 2024-05-21 \r\n");
- ZF_DEBUG(LOG_D,"gapm32f411tiny board zf-framework [ok]\r\n");
- ZF_DEBUG(LOG_D, "init time used:%dms\r\n", ZF_SYSTIME_MS());
- ZF_DEBUG(LOG_D, "zorb framework run\r\n");
-
- //测试 app_test 需要打开main.h 中的宏定义
- #if USE_APP_BUFFER
- App_Buffer_init();
- App_Buffer_process();
- #endif
-
- #if USE_APP_LIST
- App_List_init();
- App_List_process();
- #endif
-
- #if USE_APP_FSM
- App_Fsm_init();
- App_Fsm_process();
- #endif
-
- #if USE_APP_EVENT
- App_Event_init();
- App_Event_process();
- #endif
-
- #if USE_APP_TIMER
- App_Timer_init();
- App_Timer_process();
- #endif
-
- #if USE_APP_TASK
- App_Task_init();
- #endif
-
- while(1)
- {
- APM_LEDOn(LED2);
- ZF_DELAY_MS(500);
- ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
- ZF_DEBUG(LOG_D, "drv_bsp_led2 on [ok] \r\n");
- APM_LEDOff(LED2);
- ZF_DELAY_MS(500);
- ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
- ZF_DEBUG(LOG_D, "drv_bsp_led2 off [ok] \r\n");
- APM_LEDOn(LED3);
- ZF_DELAY_MS(1000);
- ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
- ZF_DEBUG(LOG_D, "drv_bsp_led3 on [ok] \r\n");
- APM_LEDOff(LED3);
- ZF_DELAY_MS(1000);
- ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
- ZF_DEBUG(LOG_D, "drv_bsp_led3 off [ok] \r\n");
- }
-
- }
main.h
- #ifndef __MAIN_H
- #define __MAIN_H
- //--------------------------------------------------------------------------------------------------
- // C库函数调用头文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- #include <stdint.h>
- #include <stdbool.h>
- #include <string.h>
- #include <stdarg.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- //--------------------------------------------------------------------------------------------------
- // 数据类型重定义 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- /**************************************************************************************************
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned long uint32_t;
- typedef unsigned long long int uint64_t;
- typedef signed char int8_t;
- typedef signed short int16_t;
- typedef signed long int32_t;
- typedef long long int int64_t;
- C语言数据类型
- 整型(int)、单精度浮点型(float)
- 双精度浮点型(double)、字符型(char)
- 整型(int)类型又划分了
- long int(也可以直接写为long) 、long long int(可以直接写为long long) 、short int(可以直接写为short)
- 指针类型:void *;
- 空类型:void;
- 构造类型:数组、结构体(strtuct)、共用体类型(union)、枚举类型(enum);
- 1字节(Byte) = 8位(bit) 1Byte=8bi
- ******************************************************************************************************/
- //--------------------------------------------------------------------------------------------------
- // APM32库文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- #include "apm32f4xx.h"
- #include "apm32f4xx_int.h"
- #include "apm32f4xx_gpio.h"
- #include "apm32f4xx_rcm.h"
- #include "apm32f4xx_usart.h"
- //--------------------------------------------------------------------------------------------------
- // 中间件驱动文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- #include "log_printf.h"
- //--------------------------------------------------------------------------------------------------
- // Drv_Drivers文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- //--------------------------------------------------------------------------------------------------
- // BSP_Drivers文件 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- #include "bsp_delay.h"
- #include "bsp_led.h"
- #include "bsp_usart.h"
- //--------------------------------------------------------------------------------------------------
- // 自定义函数声明 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- //--------------------------------------------------------------------------------------------------
- #include "app_zf_buffer.h"
- #include "app_zf_list.h"
- #include "app_zf_fsm.h"
- #include "app_zf_event.h"
- #include "app_zf_timer.h"
- #include "app_zf_task.h"
- #define USE_APP_BUFFER 0
- #define USE_APP_LIST 0
- #define USE_APP_FSM 0
- #define USE_APP_EVENT 0
- #define USE_APP_TIMER 0
- #define USE_APP_TASK 0
- #endif
3. 编译下载观察效果
|