UBOOT 的 lowlevel_init.S,代码分析,底层分析,底层初始化

正点原子嵌入式linux驱动开发——U-boot启动流程详解 正点原子linux驱动开发的学习笔记,这一篇是uboot的源码解读,来学习uboot的启动详细流程 阅读详情
作者:chenzhufly(空灵)     发表于2008/03/17       email:chenzhufly@126.com
转载请注明出处---谢谢

这个文件主要是设置系统时钟,初始化flash,以及SDRAM。。。

../u-boot-1.3.1/cpu/arm920t/at91rm9200/lowlevel_init.S
#include <config.h>
#include <version.h>

//CONFIG_SKIP_LOWLEVEL_INIT定义见../u-boot-1.3.1/include/configs/at91rm9200dk.h
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
/*
 * some parameters for the board
 *
 * This is based on rm9200dk.cfg for the BDI2000 from ABATRON which in
 * turn is based on the boot.bin code from ATMEL
 *
 */

//flash相关寄存器
/* flash */
#define MC_PUIA        0xFFFFFF10
#define MC_PUP        0xFFFFFF50
#define MC_PUER        0xFFFFFF54
#define MC_ASR        0xFFFFFF04
#define MC_AASR        0xFFFFFF08
#define EBI_CFGR    0xFFFFFF64
#define SMC2_CSR    0xFFFFFF70

//系统时钟相关寄存器
/* clocks */
#define PLLAR        0xFFFFFC28
#define PLLBR        0xFFFFFC2C
#define MCKR        0xFFFFFC30

#define AT91C_BASE_CKGR 0xFFFFFC20
#define CKGR_MOR 0

//sdram相关寄存器
/* sdram */
#define PIOC_ASR    0xFFFFF870
#define PIOC_BSR    0xFFFFF874
#define PIOC_PDR    0xFFFFF804
#define EBI_CSA        0xFFFFFF60
#define SDRC_CR        0xFFFFFF98
#define SDRC_MR        0xFFFFFF90
#define SDRC_TR        0xFFFFFF94


_MTEXT_BASE:
#undef START_FROM_MEM//从flash,还是从sdram启动, 这里定义从sdram启动
#ifdef START_FROM_MEM
    .word    TEXT_BASE-PHYS_FLASH_1
#else
    .word    TEXT_BASE//TEXT_BASE在../u-boot-1.3.1/board/at91rm9200dk/config.mk
#endif

.globl lowlevel_init
lowlevel_init:
    /* Get the CKGR Base Address */
    ldr     r1, =AT91C_BASE_CKGR //初始化系统时钟
    /* Main oscillator Enable register */
#ifdef CFG_USE_MAIN_OSCILLATOR
    ldr     r0, =0x0000FF01        /* Enable main oscillator,  OSCOUNT = 0xFF */
#else
    ldr     r0, =0x0000FF00        /* Disable main oscillator, OSCOUNT = 0xFF */
#endif
    str     r0, [r1, #CKGR_MOR]


    /* Add loop to compensate Main Oscillator startup time */
    ldr     r0, =0x00000010//这个地方相当与一段延时,保证系统时钟设置正常
LoopOsc:
    subs    r0, r0, #1
    bhi     LoopOsc

    /* memory control configuration *///初始化flash
    /* this isn't very elegant, but     what the heck */
    ldr    r0, =SMRDATA  //将标号SMRDATA所标识的地址写入r0

    ldr    r1, _MTEXT_BASE  //将标号_MTEXT_BASE处的数据写入r1

    sub    r0, r0, r1   //得到相对起始地址    我总觉得这个地方有些问题,可很多人认为没有问题。。。。有待深究,是不是我多了呢?
    add    r2, r0, #80  //得到相对结束地址
0:
    /* the address */ 

    //不仔细的看,你还真发现不了这个地方的妙处,哈哈,想法挺好。。。。

    //需要配合下面的表一起看,估计你就能明白了。
    ldr    r1, [r0], #4  //R1 ← [R0] , R0 ← R0 + 4  
    /* the value */
    ldr    r3, [r0], #4
    str    r3, [r1]
    cmp    r2, r0
    bne    0b


    /* delay - this is all done by guess */
    ldr    r0, =0x00010000
1:
    subs    r0, r0, #1
    bhi    1b


    ldr    r0, =SMRDATA1//初始化sdram
    ldr    r1, _MTEXT_BASE
    sub    r0, r0, r1
    add    r2, r0, #176
2:
    /* the address */
    ldr    r1, [r0], #4
    /* the value */
    ldr    r3, [r0], #4
    str    r3, [r1]
    cmp    r2, r0
    bne    2b

    /* switch from FastBus to Asynchronous clock mode */

    //结合datasheet看,有详细的描述
    mrc    p15, 0, r0, c1, c0, 0  //将读出的数据放到r0中
    orr    r0, r0, #0xC0000000    @ set bit 31 (iA) and 30 (nF)

   //主要是设置C1,异步模式;C0是只读的
    mcr    p15, 0, r0, c1, c0, 0

    /* everything is fine now */
    mov    pc, lr

    .ltorg


SMRDATA:
    .word MC_PUIA
    .word MC_PUIA_VAL//../u-boot-1.3.1/include/configs/at91rm9200dk.h有定义
    .word MC_PUP
    .word MC_PUP_VAL
    .word MC_PUER
    .word MC_PUER_VAL
    .word MC_ASR
    .word MC_ASR_VAL
    .word MC_AASR
    .word MC_AASR_VAL
    .word EBI_CFGR
    .word EBI_CFGR_VAL
    .word SMC2_CSR
    .word SMC2_CSR_VAL
    .word PLLAR
    .word PLLAR_VAL
    .word PLLBR
    .word PLLBR_VAL
    .word MCKR
    .word MCKR_VAL
    /* SMRDATA is 80 bytes long */
    /* here there's a delay of 100 */
SMRDATA1:
    .word PIOC_ASR
    .word PIOC_ASR_VAL
    .word PIOC_BSR
    .word PIOC_BSR_VAL
    .word PIOC_PDR
    .word PIOC_PDR_VAL
    .word EBI_CSA
    .word EBI_CSA_VAL
    .word SDRC_CR
    .word SDRC_CR_VAL
    .word SDRC_MR
    .word SDRC_MR_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRC_MR
    .word SDRC_MR_VAL1
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRC_MR
    .word SDRC_MR_VAL2
    .word SDRAM1
    .word SDRAM_VAL
    .word SDRC_TR
    .word SDRC_TR_VAL
    .word SDRAM
    .word SDRAM_VAL
    .word SDRC_MR
    .word SDRC_MR_VAL3
    .word SDRAM
    .word SDRAM_VAL
    /* SMRDATA1 is 176 bytes long */
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

 

//------------------这有另一篇文章:-----------------------------

来自:http://blog.youkuaiyun.com/sunrock/archive/2008/03/27/2223562.aspx

 

本文主要分析与U-Boot启动过程相关的汇编代码lowlevel_init.S,目标平台以PXA270为例。
文件位于board/myboard/lowlevel_init.S,主要执行内存相关的初始化

  • 把链接寄存器LR(即R14)的值转存到寄存器R10中,以便lowlevel_init完成后恢复执行
.globl lowlevel_init
lowlevel_init:
    mov      r10, lr 
  • 按顺序初始化GPIO寄存器: GPSR GPCR GRER GFER GPDR GAFR PSSR
/* Set up GPIO pins first */
   ldr      r0,   =GPSR0
   ldr      r1,   =CFG_GPSR0_VAL
   str      r1,   [r0]
   .....
  • 初始化内存控制器
/* Initlialize Memory Controller */
   @ skip memory init if we're run in ram(must be a JTAG run)
   mov r0, pc
   ldr r1, =0xa0000000
   and r0, r0, r1    /* 把当前PC寄存器的值与0xa0000000逻辑与*/
   cmp r0, r1        /* 如果结果等于0xa0000000,说明uboot是从RAM启动的 */
   beq mem_init_done    /* 那么就需要跳过RAM初始化, 直接跳转到mem_init_done执行 */

/* 具体的初始化操作与目标板有很大相关性,下面以我的PXA270开发板为例 */

mem_init:
   @ get memory controller base address
   ldr     r1,  =MEMC_BASE    /* 内存控制器基地址 */
  • 初始化内存控制器 Step 1

@****************************************************************************
@  Step 1
@
  
   @ Step 1a
    /* Initlialize Static Memory Control register */
    /*  初始化MSCx寄存器需要设置 */
    /* RBUFFx —— Return Data Buffer vs. Streaming Behavior */
    /* RRRx —— ROM/SRAM Recovery Time */
    /* RDNx —— ROM Delay Next Access */
    /* RDFx —— The ROM Delay First Access */
    /* RBWx —— ROM Bus Width */
    /* RTx —— ROM Type */
   @ write msc0, read back to ensure data latches
   ldr     r2,   =CFG_MSC0_VAL
   str     r2,   [r1, #MSC0_OFFSET]
   ldr     r2,   [r1, #MSC0_OFFSET]    /* Ensure that the new value has been accepted and programmed */
   ......

   @ Step 1b
    /* 配置PCMCIA和CF需要设置下面这些寄存器 */
   @ MECR —— Expansion Memory (PC Card/CompactFlash) Bus Configuration register 
   @ MCMEMx —— PC Card Interface Common Memory Space Socket 0/1 Timing Configuration register
   @ MCATTx —— PC Card Interface Attribute Space Socket 0/1 Timing Configuration register
   @ MCIOx —— PC Card Interface I/O Space Socket 0/1 Timing Configuration register

   @ Step 1c
   @ fly-by-dma is defeatured on this part
   @ write flycnfg —— Fly-by DMA DVAL<1:0> polarities
   @ldr     r2,  =CFG_FLYCNFG_VAL
   @str     r2,  [r1, #FLYCNFG_OFFSET]

   @ Step 1d
   @ fetch platform value of mdcnfg —— SDRAM Configuration register
   @
   ldr     r2,  =CFG_MDCNFG_VAL

   @ disable all sdram banks
   @
   bic     r2,  r2,  #(MDCNFG_DE0 | MDCNFG_DE1)
   bic     r2,  r2,  #(MDCNFG_DE2 | MDCNFG_DE3)
   str r2, [r1, #MDCNFG_OFFSET]

   @ Step 1e
   @ write MDREFR —— SDRAM Refresh Control register
   ldr r3, = CFG_MDREFR_VAL
   ldr r2, = 0xFFF    /* DRI mask */
   and r3, r3, r2
   ldr r4, [r1, #MDREFR_OFFSET]    /* reset value */
   bic r4, r4, r2    /* clear DRI field  —— SDRAM Refresh Interval for All Partitions */
   orr r4, r4, r3
   orr r4, r4, #MDREFR_K0RUN    /* SDCLK0 Run Control/Status */
   bic r4, r4, #MDREFR_K0DB2    /* SDCLK0 Divide by 2 Control/Status */
   bic r4, r4, #MDREFR_K0DB4    /* SDCLK0 Divide by 4 Control/Status */
   bic r4, r4, #MDREFR_K2FREE   /* SDCLK<2> Free-Running Control */
   bic r4, r4, #MDREFR_K1FREE
   bic r4, r4, #MDREFR_K0FREE
   orr r4, r4, #MDREFR_SLFRSH  /* SDRAM Self-Refresh Control/Status, Self-refresh enabled */
   /* write back MDREFR */
   str r4, [r1, #MDREFR_OFFSET]
  • 初始化内存控制器 Step 2
   @ Step 2
   @ Configure synchronus flash memory
  • 初始化内存控制器 Step 3
   @ Step 3
   @ Configure SDRAM
   ldr r2, =CFG_MDREFR_VAL
   bic r2, #MDREFR_APD    /* SDRAM/Synchronous Static Memory Auto-Power-Down Enable */
   str r2, [r1, #MDREFR_OFFSET]
   ldr r3, [r1, #MDREFR_OFFSET]        @ read back to make sure write action completed

  • 初始化内存控制器 Step 4
   @ Step 4
   @ write initial value of mdcnfg, w/o enabling sdram banks
   @
   ldr r2, =CFG_MDCNFG_VAL
   bic r2,  r2,  #(MDCNFG_DE0 | MDCNFG_DE1)
   bic r2,  r2,  #(MDCNFG_DE2 | MDCNFG_DE3)
   str r2, [r1, #MDCNFG_OFFSET]

   @ldr r2, = CFG_MDREFR_VAL
   @str r2, [r1, #MDREFR_OFFSET]
  • 初始化内存控制器 Step 5
   @ Step 5
   @ pause for 200 uSecs
   @
   ldr r3, =OSCR       @ reset the OS Timer Count to zero
   mov r2, #0
   str r2, [r3]
   ldr r4, =0x300            @ really 0x2E1 is about 200usec, so 0x300 should be plenty ——3.25MHz clock
1:
   ldr r2, [r3]    /* r2读OS Timer Count*/
   cmp r4, r2    /* 比较OS Timer Count和r4 */
   bgt 1b        /* 如果时间没到就循环 */
  • 初始化内存控制器 Step 6
   @ Step 6
   @ Disable XScale Data Cache
   mov    r0, #0x78                @turn everything off
   mcr    p15, 0, r0, c1, c0, 0      @(caches off, MMU off, etc.)    /* 设置协处理器P15 */
  • 初始化内存控制器 Step 7 - 11
   @ Step 7
   @ Access memory *not yet enabled* for CBR refresh cycles (8) *NOTE: hardware reset only
   @ - CBR is generated for all banks

   ldr     r2, =CFG_DRAM_BASE
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]
   str     r2, [r2]

   @ Step 8
   @ Enable data cache

   @ Step 9
   @ Enable SDRAM

   @fetch current mdcnfg value
   ldr     r3,  [r1, #MDCNFG_OFFSET]
   orr     r3,  r3,  #MDCNFG_DE0    /* enable sdram bank0 */

   @write back mdcnfg, enabling the sdram bank(s)
   str     r3,  [r1, #MDCNFG_OFFSET]

   @ Step 10
   @ write mdmrs —— SDRAM Mode Register Set Configuration Register
   @
   ldr     r2,  =CFG_MDMRS_VAL
   str     r2,  [r1, #MDMRS_OFFSET]

   @ Step 11
   @ Enable MDREFR[APD] optionally
   ldr r2, =CFG_MDREFR_VAL
   str r2, [r1, #MDREFR_OFFSET]
  • Done Memory Init
mem_init_done:

   @********************************************************************
   @ Disable (mask) all interrupts at the interrupt controller
   @

   @ clear the interrupt level register (use IRQ, not FIQ)
   @
   mov     r1, #0
   ldr     r2,  =ICLR
   str     r1,  [r2]

   @ Set interrupt mask register
   @
   ldr     r1,  =CFG_ICMR_VAL    /* set ICMR = 0, no interrupts enabled */
   ldr     r2,  =ICMR
   str     r1,  [r2]

   @ ********************************************************************
   @ Disable the peripheral clocks, and set the core clock
   @

    @ Turn Off ALL on-chip peripheral clocks for re-configuration
    @
    ldr     r1,  =CKEN    /*clock enable register */
    mov     r2,  #0
    str     r2,  [r1]

   @ set core clocks
   @
   ldr     r1,  =CCCR    /* core clock configuration register */
   ldr     r2,  [r1, #0]
   ldr r3, =(CCCR_L_MASK | CCCR_2N_MASK)
   bic r2, r2, r3
   /* Run-Mode-to-Oscillator Ratio (L) creates the nominal run mode frequency by multiplying the 13-MHz processor oscillator by L. */
   /* Turbo-Mode-to-Run-Mode Ratio (N) creates the nominal turbo-mode frequency by multiplying the run-mode frequency by N. */
   /* core freq: Normal 208MHz, Turbo 312MHz */
   ldr r3, =(16 | 3<<7)    /* Turbo-Mode-to-Run-Mode Ratio, N = 3/2 */
   orr r2, r2, r3              /*  Run-Mode-to-Oscillator Ratio = 16*13 MHz,  */
   str     r2,  [r1]

#ifdef ENABLE32KHZ
   @ enable the 32Khz oscillator for RTC and PowerManager
   @
   ldr     r1,  =OSCC    /* oscillator configuration register */
   mov     r2,  #OSCC_OON    /* 32.768kHz OON (write-once only bit) */
   str     r2,  [r1]

   @ NOTE:  spin here until OSCC.OOK get set,
   @        meaning the PLL has settled.
   @
60:
   ldr     r2, [r1]
   ands    r2, r2, #1    /* r2 = r2 & 0x1, 取出最低位数据 */
   beq     60b
#endif

    @ Turn on needed clocks
    @
   ldr     r1,  =CKEN
   ldr     r2,  =CFG_CKEN_VAL
   str     r2,  [r1]
  • lowlevel_init完成

   mov   pc, r10    /* 恢复链接寄存器的值到PC,返回start.S调用lowlevel_init处继续执行 */

@ End lowlevel_init

uboot:源码分析-启动第一阶段-lowlevel_init 检查复位状态、IO恢复、关看门狗、开发板供电锁存、时钟初始化、DDR初始化、串口初始化并打印’O’、tzpc初始化、打印’K’。其中值得关注的:关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK" 阅读详情

相关推荐

Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

U-Boot 属于两阶段的Bootloader,第一阶段的文件为arch/arm/cpu/armv7 /start.S 和 board//lowlevel_init.S,前者是平台相关的,后者是开发板相关的。 uboot启动流程分析如下: 第一阶段: a -- 设置cpu工作模式为SVC模式 b -- 关闭中断,mmu,cache v -- 关看门狗 d -- 初始化内存,串口 e

知秋一叶 1万+

[uboot] (第五章)uboot流程——uboot启动流程

uboot启动流程

ooonebook的博客 1万+

(7)uboot详解——初始化SDRAM

(7)uboot详解——初始化SDRAM 在开始这篇文章之前,我们先回顾一下(1)uboot详解——板子刚上电时都干了些什么,不管板子是从nandflash启动还是从norflash启动,它的开始代码都不是在SDRAM中运行的,要么在stepping stone中运行,要么在norflash中运行,但是stepping stone的4k片上内存显然是不够的,而且norflash可读不可写的特

奔跑的路 1万+

u-boot第一阶段start.s分析:lowlevel_init部分

u-boot一般分为两个阶段: 第一阶段:硬件相关初始化、初始化内存芯片为bootloader做好准备、复制bootloader到RAM空间中、设置好栈方便调用C语言、跳转到C代码入口。这个部分是汇编语言部分,只是为调用C语言做好准备。 第二阶段:初始化该阶段需要使用到的硬件设备、检测内存映射(MMU)、u-boot命令格式、为内核设置启动参数。这个部分就是C语言部分了。 以下是...

zi_yang的博客 746

【Uboot】Uboot启动流程分析

第 68 行,调用 bootz_start 函数,该函数用于支持 zImage 镜像的启动,定义在文件 cmd/bootz.c 中,设置 images 的 ep 成员变量,也就是系统镜像的入口点,使用 bootz 命令启动系 统的时候就会设置系统在 DRAM 中的存储位置,调用 bootz_setup 函数,此函数会判断当前的系统镜像文件是否为 Linux 的镜像 文件,并且会打印出镜像相关信息bootz_start 主要用于初始化 images 的相关成员变量。此时会进行一些初始化工作。

qq_69923281的博客 2344

2022版u-boot启动分析笔记之一(start.S与lowlevel_init.S)

分析2022版U-Boot的启动过程Stage1,包括start.S和lowlevel.S的分析。

weixin_42408707的博客 1080

u-boot sdram调试为什么要skip_lowlevel_init的一点看法

<br />(s3c2440,  fl2440)<br />在sdram调试U-BOOT是要跳过初始化代码,为什么sdram调试的时候不能再初始化一遍呢?<br />个人认为,初始化代码是一部分是初始化sdram映射,显然初始化sdram的代码不能在sdram中运行,只能在4k stone里运行。

D的专栏 1538

双向全桥隔离DC-DC变换器(DAB)的调制优化与挑战解析

本文深入解析了双向全桥隔离DC-DC变换器(DAB)的核心调制技术及其面临的挑战。文章从基础的相移调制(SPS)入手,逐步探讨了扩展相移(EPS)、双重相移(DPS)等进阶策略,并重点分析了电流优化与零电压开通(ZVS)等硬核优化技巧。针对DAB在实际应用中存在的建模困难、多模块并联及数字实现等挑战,提供了实用的应对策略与设计思路,旨在帮助工程师在性能、复杂度与成本之间找到最佳平衡。

weixin_29271053的博客 571

uboot启动——lowlevel_init函数详解

1

weixin_42031299的博客 1762

力扣(Leetcode)第1题:两数之和(C语言版本)

题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6

qq_39855356的博客 3305

revit二次开发环境搭建(2024版)(小白友好)

revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程

m0_56961251的博客 1420

Uboot源码超详细分析(1)

硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置堆栈跳转到第二阶段代码入口初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核Uboot启动第一阶段流程如下:​u-boot编译完成后,根目录下会生成一个链接脚本u-boot.lds,在u-boot中因为有汇编阶段参与,整个程序的入口取决于链接脚本中 ENTRY 声明的地方。因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。

weixin_64581379的博客 2951

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 611

uboot启动流程(3)之lowlevel_init 函数详解

函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义,内容如下: lowlevel_init.S 代码段 14 #include <asm-offsets.h> 15 #include <config.h> 16 #include <linux/linkage.h> 17 18 E...

qq_34591581的博客 2453

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 820

安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案

本文主要介绍了安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案,希望能对使用Windows WSL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

uboot启动流程-涉及lowlevel_init汇编函数

uboot启动流程涉及函数lowlevel_init 函数

wojiaxiaohuang2014的博客 1466

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

该系统的核心是基于STM32F103RCT6微控制器,这是一种高性能、低功耗的嵌入式处理器,适用于各种复杂的控制和数据处理任务。系统利用先进的传感器技术,如光电传感器PulseSensor模块来准确测量人体脉搏血氧饱和度及心率(PPG),同时采用AD8232生物电信号采集模块捕捉并处理人体的心电图信号(ECG),从而全面反映用户的心脏活动状态。

1万+

2015.10uboot移植笔记 (三、低级初始化lowlevel_init)

上一篇,把start.S分析了一遍,这一篇只要分析lowlevel_init这个函数 这个函数有点长,采取分开分析,一点一点的看,不着急,哈哈哈 .globl lowlevel_init lowlevel_init: /* lr是连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址二是当异常发生时, LR中保存的值等于异常发生...

酱油师兄的博客 2207

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1375

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Uboot 2015 代码解析3 start.S lowlevel_init.S

简介 start.S主要做了 1.使CPU进入SVC模式,禁用中断。 2.初始化cp15协处理器,暂时关闭MMU,ICACHE。 3.跳转到lowlevel_init.S。 4.最后跳转到_main(位于arch/arm/lib/crt0.S) lowlevel_init.S主要做了 1.设置sp临时堆栈。 2.做最基础的时钟初始化(平台相关)。 3.跳转回start.S...

持续学习和分享感兴趣的技术 738

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

UBOOT学习【三】-Uboot启动流程第1阶段

主要流程:部分硬件初始化->加载完整的uboot到RAM->跳转到第2阶段入口开始执行。

weixin_62941746的博客 904

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

一、uboot分析(三)——uboot内部程序流程分析

但是 board_init_f 并没有初始化所有的外设,还需要做一些后续工作,这些后续工作就是由函数 board_init_r 来完成的,board_init_r 函数定义在文件 common/board_r.c中,这里不再对代码深究。函数 board_init_f_alloc_reserve 主要是留出早期的 malloc 内存区域和 gd 内存区域。接下来,跳转到board_init_f_alloc_reserve这个函数执行,这个函数定义在:/common/init/board_init.c。

weixin_42744482的博客 851

UBOOT之start.s分析

/********************设置处理器模式****************************************/ reset: /*  * set the cpu to SVC32 mode  */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr,r0

GameIT 2941

S5PV210-uboot解析(二)-start.S解析-lowlevel_init函数分析

lowlevel_init函数分析 lowlevel_init函数是uboot启动阶段调用的第一个函数,主要功能就是初始化S5PV210的各个硬件部分。 #include  #include    #include  #include "smdkc110_val.h" 包含头文件,主要是s5pc110.h文件,里面包含了板子的硬件寄存器的地址。 lo

ldzq_sue的博客 903
上一篇: 如何让vc保存文件更快,cfile cstdiofile 写文件
下一篇: Nand 的几个名词:oob,bbt,ecc
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值