hi3861启动流程
hi3861是一款低功耗高性能的物联网芯片,广泛应用于物联网设备中。在了解hi3861的启动流程之前,首先需要了解hi3861的架构和基本原理。
hi3861架构
hi3861采用了双核架构,包括一个Cortex-M33内核和一个AI内核。Cortex-M33内核负责处理实时任务和低功耗操作,而AI内核主要用于处理复杂的算法和深度学习模型。
启动流程概述
hi3861的启动流程可以分为以下几个步骤:
- 复位和引导
- 初始化系统
- 加载应用程序
- 启动应用程序
接下来我们将逐步详细介绍这些步骤。
复位和引导
在hi3861上电或者复位时,首先会执行复位向量。复位向量是一段存储在芯片内部的指令,用于初始化芯片的各个模块和寄存器。复位向量通常会将芯片的状态和寄存器初始化为默认值,并跳转到引导程序。
引导程序是一段存储在外部闪存中的代码,用于初始化系统并加载应用程序。hi3861引导程序通常会通过读取闪存中的配置信息,初始化系统时钟、外设、内存等,并加载应用程序到指定的地址空间。
下面是启动过程中的相关代码示例:
// 复位向量
__attribute__((section(".reset_vector"))) void Reset_Handler(void)
{
// 初始化芯片的各个模块和寄存器
// ...
// 跳转到引导程序
Bootloader();
}
// 引导程序
__attribute__((section(".bootloader"))) void Bootloader(void)
{
// 初始化系统时钟、外设、内存等
// ...
// 加载应用程序到指定的地址空间
LoadApplication();
// 启动应用程序
StartApplication();
}
初始化系统
在引导程序中,需要初始化系统时钟、外设、内存等,以使系统正常工作。hi3861的系统初始化代码通常包括以下几个步骤:
- 初始化时钟:设置时钟源和频率,配置时钟分频器,使系统时钟正常工作。
- 初始化外设:使能需要使用的外设,并进行相应的配置,如UART、SPI、GPIO等。
- 初始化内存:配置内存控制器,使其正确映射内存地址空间。
下面是系统初始化的相关代码示例:
// 初始化时钟
void InitClock(void)
{
// 设置时钟源和频率
// ...
// 配置时钟分频器
// ...
// 使系统时钟正常工作
// ...
}
// 初始化外设
void InitPeripheral(void)
{
// 使能需要使用的外设
// ...
// 进行相应的配置
// ...
}
// 初始化内存
void InitMemory(void)
{
// 配置内存控制器
// ...
}
// 引导程序
void Bootloader(void)
{
// 初始化时钟
InitClock();
// 初始化外设
InitPeripheral();
// 初始化内存
InitMemory();
// ...
}
加载应用程序
在系统初始化完成之后,需要从闪存中加载应用程序到指定的地址空间。hi3861的应用程序通常使用elf格式,可以由编译器生成。加载应用程序的过程需要读取闪存中的应用程序镜像,将其解析并拷贝到指定的地址空间。
具体的应用程序加载过程会根据具体的系统架构和需求而有所不同,可以通过调用相应的函数或者使用专门的加载器来实现。
下面是应用程序加载的相关代码示例:
// 加载应用程序
void LoadApplication(void)
{
// 从闪存中读取应用程序镜像
// ...
// 解析应用程序镜像
// ...
// 拷