hi3861启动流程

hi3861是一款低功耗高性能的物联网芯片,广泛应用于物联网设备中。在了解hi3861的启动流程之前,首先需要了解hi3861的架构和基本原理。

hi3861架构

hi3861采用了双核架构,包括一个Cortex-M33内核和一个AI内核。Cortex-M33内核负责处理实时任务和低功耗操作,而AI内核主要用于处理复杂的算法和深度学习模型。

启动流程概述

hi3861的启动流程可以分为以下几个步骤:

  1. 复位和引导
  2. 初始化系统
  3. 加载应用程序
  4. 启动应用程序

接下来我们将逐步详细介绍这些步骤。

复位和引导

在hi3861上电或者复位时,首先会执行复位向量。复位向量是一段存储在芯片内部的指令,用于初始化芯片的各个模块和寄存器。复位向量通常会将芯片的状态和寄存器初始化为默认值,并跳转到引导程序。

引导程序是一段存储在外部闪存中的代码,用于初始化系统并加载应用程序。hi3861引导程序通常会通过读取闪存中的配置信息,初始化系统时钟、外设、内存等,并加载应用程序到指定的地址空间。

下面是启动过程中的相关代码示例:

// 复位向量
__attribute__((section(".reset_vector"))) void Reset_Handler(void)
{
  // 初始化芯片的各个模块和寄存器
  // ...

  // 跳转到引导程序
  Bootloader();
}

// 引导程序
__attribute__((section(".bootloader"))) void Bootloader(void)
{
  // 初始化系统时钟、外设、内存等
  // ...

  // 加载应用程序到指定的地址空间
  LoadApplication();

  // 启动应用程序
  StartApplication();
}

初始化系统

在引导程序中,需要初始化系统时钟、外设、内存等,以使系统正常工作。hi3861的系统初始化代码通常包括以下几个步骤:

  1. 初始化时钟:设置时钟源和频率,配置时钟分频器,使系统时钟正常工作。
  2. 初始化外设:使能需要使用的外设,并进行相应的配置,如UART、SPI、GPIO等。
  3. 初始化内存:配置内存控制器,使其正确映射内存地址空间。

下面是系统初始化的相关代码示例:

// 初始化时钟
void InitClock(void)
{
  // 设置时钟源和频率
  // ...
  
  // 配置时钟分频器
  // ...
  
  // 使系统时钟正常工作
  // ...
}

// 初始化外设
void InitPeripheral(void)
{
  // 使能需要使用的外设
  // ...
  
  // 进行相应的配置
  // ...
}

// 初始化内存
void InitMemory(void)
{
  // 配置内存控制器
  // ...
}

// 引导程序
void Bootloader(void)
{
  // 初始化时钟
  InitClock();
  
  // 初始化外设
  InitPeripheral();
  
  // 初始化内存
  InitMemory();
  
  // ...
}

加载应用程序

在系统初始化完成之后,需要从闪存中加载应用程序到指定的地址空间。hi3861的应用程序通常使用elf格式,可以由编译器生成。加载应用程序的过程需要读取闪存中的应用程序镜像,将其解析并拷贝到指定的地址空间。

具体的应用程序加载过程会根据具体的系统架构和需求而有所不同,可以通过调用相应的函数或者使用专门的加载器来实现。

下面是应用程序加载的相关代码示例:

// 加载应用程序
void LoadApplication(void)
{
  // 从闪存中读取应用程序镜像
  // ...
  
  // 解析应用程序镜像
  // ...
  
  // 拷