ARM Cortex-M3/M4 – Boot Sequence

Keywords: Embedded systems, ARM, Boot Sequence

The boot up Process of Embedded SoCs is a multi-step sequence where the on-chip system passes through several complex states before reaching user application code. The boot sequence of Embedded Micrcontrollers/SoCs is quite different from boot sequence of Desktop PCs. There are many Embedded SoCs architectures out there in the market. It is practically impossible to discuss each architecture in detail here. In this article we will deep dive in Embedded Microcontrollers boot up process in general and ARM Cortex-M in particular.

The whole boot up process is defined by both the underlying Hardware State Machine and Low level Software defined behavior. The Hardware mainly consists of CPU/Processor Core and Internal SoC Peripheral Units that controls what happens from the point the power is applied to SoC to the point where the Processor jumps to Reset Vector in Vector Table (Explained shortly). This is fixed for each architecture. On the other hand the low level Software defines what happens after jump to Reset Vector and before calling user defined main() function – Figure-1.

Figure-1: Inner view of STM32f429-Discovery

1. SoC Hardware, The big Picture

From very high level, the Embedded SoC chips only contain CPU Core/Processor Unit. The chip itself contains many additional hardware Digital Logic Units like GPIO, UART, EDMA that assists CPU with various on-chip functionalities and communicating with off-chip and outside world – Figure-2.

Figure-2: System on Chip (STM32f429-Discovery)

Apart from these on-chip peripherals there are additional Digital Logic Units that actually controls Hardware Level System functionalities/behavior. Let’s call this hardware Logic the FSM-Logic (Finite State Machine Logic) just for illustration purpose as shown in below figure.

Figure-3: System on Chip with FSM-Logic

1.1 FSM-Logic Tasks

  • Keep the CPU Unit in Reset state until it perform hardware defined actions.
  • Sample/Read Endianness (Big-endian, little-endian) Pin if available. This is very important as all further instructions/data is interpreted accordingly.
  • Sample/Read boot pins (if any). Modern Processor can boot from many source like internal/external RAM/ROM/Flash, Serial, and Network etc. These pins input defines the boot source and Location (in memory map).
  • Reset SoC internal Peripherals (UART, internal SRAM, I2C etc.)
  • Initialize CPU Core/Control Registers and other peripheral Registers to their default values.

1.2 Initial Hardware Level Bootstrapping

Initial Hardware Level Bootstrapping refers any memory transfer or system setup that is performed by on-chip Hardware before the CPU Core Unit Reset is released. FSM-Logic tasks mentioned above come under the category of initial bootstrapping. This is highly architecture dependent and may be optional in some cases. In this step of boot process:

  • Memory Contents MAY be transferred from some memory locations to internal Registers. e.g. In ARM Cortex-M profile Cores, apart from setting various registers to their default values, the contents from Memory Location 0x00000000 is copied to Stack Pointer Register (R13) and contents from Memory location 0x00000004 is copied to Program Counter (R15). At this point there are no copy instruction, yet this is performed by Internal Hardware.
  • Memory to Memory transfer i.e. like from internal/external ROM to internal/external RAM for faster execution. One example of such bootstrapping is TMS320C6713 Digital Signal Processor. TMS320C6713 internal EMIF on boot (while CPU is kept in RESET state) copies 1K byte of code from boot source (external ROM/Flash) to internal RAM (iRAM). This copy operation is performed by EMIF logic Unit while the CPU core remains in Reset State.
  • It may Copy Vector Table to RAM to reduce Interrupt Latency.

Till this point, the Registers have been set to their default values, internal Logic Units have been Reset, initial bootstrapping is done, all the settings that the CPU might expect have been done. NOW its time to transfer control to CPU so that the boot process is further proceeded by CPU itself. So the CPU Reset pin is released and control is handover to CPU.

2. Vector Table

Each Processor Architecture has pre-defined (default) Memory Locations where it jumps (execution instructions from that location forward) when associative event/Exception/Interrupt occurs i.e. Some memory locations or group of locations are reserved for each predefined event/Exception/Interrupt. These memory locations group are consecutive most of the time. These pre-defined Memory Locations are collectively called Vector table i.e. A table of memory locations to which different CPU-Event (Interrupts/Exceptions) vectors points. (Remember high school physics – vectors have direction, the concept is similar here).

The format of vector table is unique to the underlying architecture. For example in case of ARMv5 and later the Vector table consists of single 32-bit memory location per Exception/Interrupt. Other architecture like may have reserved certain number of memory location for each Exception/Interrupt. In the former case only the address of Exception/Interrupt Handler (function to handle the Exception/Interrupt) is placed with is copied automatically to Program Counter upon Exception/Interrupt. In the later case, Processor jumps to the Exception/Interrupt location and start executing the instructions from that location. No Address is copied to Program Counter. The example of later is TMS320C6713 DSP processor in which 8 words consecutive memory locations are reserved for each Exception/Interrupt. The user has to either to adjust the ISR within these locations are jump (via JUMP Instruction) to the ISR at other location.

This Vector table has pre-defined fixed locations for each architecture defined Interrupt/Event. If the vector table is relocated (if allowed) the CPU must be informed. The following figure shows ARM Cortex-M Vector table starting from 0x00000000 memory address.

Figure-4: ARM Cortex-M Vector Table

As an Example, when CPU Reset pin is released, this Event is called Reset Interrupt. i.e. Reset itself is a non maskable interrupt to CPU. Reset Vector is the entry in Vector table from where Processor starts execution immediately after system Reset – in other words Processor jumps to Reset Vector Memory Location once powered up. On case of ARM Cortex-M processors, the Reset Vector is located at memory location 0x00000004 by default. The content of this location are copied to PC (R15).

Once the CPU reaches to the Reset Exception/Interrupt; CPU is now ready to start executing instruction. This is the point where System hardware has completely boot up and system is ready to go through software defined actions.

3. Software Define Actions:

From Reset Exception/Interrupt onward till application code (In C, main () function) is totally User/Compiler/Development Environment Toolchain dependent. If you are actually coding from scratch right from Reset Vector (usually in Assembly) then the system is practically fully under your control. Large applications are often coded in higher level language like C as Assembly Code is hard to maintain in high scale applications.

Note: main () → is a C language Program entry point and requires C-environment to be ready i.e. Stack/Heap sections should be properly initialized, various segments (.data, .bss etc.) should be properly copied to RAM. So it means there need to be some code that should perform these initialization tasks and environment setup before main function is called. Here is what “Startup Code” comes into action. Think of this Startup Code as CRT0.o linked into C Programs that performs any initialization work before the main () function is called.

The code is usually organized as bellow.

Figure-5: Startup Code Integration with Application code

The Startup code is basically the one that actually does software level Initialization (stack/heap/data segments etc.) and after doing the necessary initialization calls the main() – Figure-6. Usually at Reset Vector, there is either a jump instruction to the entry point of this startup code or either the address of entry point is placed at Reset Vector.

Figure-6: Execution from Reset Vector to main()

The startup code is usually provided by the toolchain vendors. Followings are entry points of few vendors startup codes.

In ARM Cortex-M:

Reset_Handler –> __main –> __rt_entry –> __user_setup_stackheap() –> __rt_stackheap_init() …..–> main()

Note: __main is the entry point to ARM C-Library not the application code entry point.

In TI-C6000:

Reset_Vector –> _c_int00 –> (_TI_STACK_SIZE,__TI_STATIC_BASE, __TI_STACK_END)…. –> main()

Note: _c_int00 is the entry point to TI startup Routine.

4. Secondary Stage Bootloader:

Secondary stage bootloader is usually required in systems where you want your code or System needs your code (.text segment) to be in RAM and hardware initial bootstrap either only copies a certain amount of code in RAM or either does only the Hardware Registers initialization. In either case you need your whole/remaining code to be copied to RAM before the main () function is called. In that case you need to manually write code that actually copies the code into RAM memory.

Remember, this 2nd level bootloader code should be in the portion which is copied by 1st stage hardware bootstrapping. This is because System (under consideration) needs code to be in RAM memory for execution and if the 2nd stage bootloader is not in RAM memory, or not fully copied then it will not be able to load remaining application code into RAM.

Bootloader code is usually written in assembly. This is because it is one of the first piece of codes that are executed by the processor as a part of boot up process. At that point no stack or C-environment is ready to handle code written in high level language.

As an example, Texas Instruments TMS320C6713 Processor copies first 1Kbytes of memory into internal RAM as a part of hardware bootstrap process. If your code exceeds 1K bytes (which is usually the case) then you have to write a secondary bootloader code to copy remaining code into internal RAM memory.

NOTE: This is the case where your system requires the execution code (.text) to be in RAM. Some systems are fine with executing instructions from memory mapped non-volatile memories like NOR flash, EEPROM etc. This is called XIP (Execution in Place). In that case code is directly executed from Memory mapped permanent memory while the remaining sections/segments like .data, .bss are copied by startup code. In such scenarios you don’t need or worry about secondary bootloader.

In Simple Words:

If your system need secondary bootloader, the Software boot sequence becomes:

Reset_Handler –> startup Code –> Secondary Bootloader –> main ()

If your system doesn’t need secondary bootloader, the Software boot sequence becomes:

Reset_Handler –> startup Code –> main ()

By now ULTIMATELY the user defined main () function is called. From now onward what happens is purely user defined. The boot up process completes at this point.

Summary (Generalized):

  1. Power is applied to SoC, the internal SoC hardware (FSM-Logic) Resets internal Hardware Units, Set internal Registers to their default values.
  2. The CPU jumps to Reset Vector.
  3. At Reset Vector there is usually a jump instruction to Reset Handler (function that is called after Reset).
  4. The Reset Handler transfer control to startup code.
  5. The startup code, after doing the necessary initialization, transfer control to secondary stage bootloader (if required).
  6. The secondary stage bootloader, after loading the code into RAM memory, transfer control to user defined main () function.
  7. If secondary stage bootloader is not required, the startup code transfer control directly to user defined main () function.
  8. Now onward further control is based on user define code in main () function.

Summary (ARM Cortex-M):

  1. Power is applied to SoC, the internal SoC hardware (FSM-Logic) Resets internal Hardware Units, Set internal Registers to their default values.
  2. The Contents of Memory location 0x00000000 is copied to Main Stack Pointer – MSP (R13).
  3. The Contents of Memory Location 0x00000004 is copied to Program Counter – PC (R15). At memory location 0x00000004 the address of Reset Handler is placed by the programmer.
  4. The Reset Handler transfer control to startup code.
  5. The startup code, after doing the necessary initialization, call the user application main() function.
  6. Now onward further control is based on user define code in main () function.


[1] – ARM Cortex-M Info Center

92 thoughts on “ARM Cortex-M3/M4 – Boot Sequence”

  • Woah! I’m really enjoying the template/theme of this blog.
    It’s simple, yet effective. A lot of times it’s very hard to get that “perfect balance” between user friendliness and visual appeal.
    I must say you have done a excellent job with this. Also, the blog loads extremely quick for me on Opera.
    Superb Blog! 0mniartist asmr

  • Hi, Neat post. There’s a problem with your site in internet explorer, would
    test this? IE still is the marketplace leader and a good section of folks will leave out your excellent writing because of this
    problem. asmr 0mniartist

  • I wanted to thank you for this great read!! I definitely loved
    every little bit of it. I have got you bookmarked to check out new
    things you post… asmr 0mniartist

  • Thanks a lot for sharing this with all of us
    you actually know what you’re speaking about! Bookmarked.

    Please additionally talk over with my site =). We could have a
    hyperlink exchange arrangement between us

  • Hi there, I found your web site via Google even as looking for a related
    topic, your web site got here up, it appears good.
    I have bookmarked it in my google bookmarks.
    Hello there, simply became alert to your blog via Google,
    and found that it’s truly informative. I’m going to watch out for brussels.

    I’ll appreciate if you proceed this in future.
    Many folks might be benefited from your writing. Cheers!

  • Wonderful blog! I found it while browsing on Yahoo News.
    Do you have any tips on how to get listed in Yahoo News?
    I’ve been trying for a while but I never seem to get there!
    Thank you

  • Hi! Someone in my Facebook group shared this site with us so I came to take
    a look. I’m definitely loving the information. I’m book-marking and will be
    tweeting this to my followers! Fantastic blog and fantastic style and design.

  • Today, I went to the beach front with my kids. I found a sea shell and gave it to my 4 year old daughter and said
    “You can hear the ocean if you put this to your ear.” She
    placed the shell to her ear and screamed. There was a hermit crab inside and it pinched
    her ear. She never wants to go back! LoL I know this is totally off topic but
    I had to tell someone!

  • Hello there I am so delighted I found your website, I really found you by error, while I was browsing on Digg for
    something else, Anyhow I am here now and would just like to say many thanks for a remarkable post and a
    all round enjoyable blog (I also love the theme/design), I don’t have
    time to read it all at the moment but I have saved it and also
    added your RSS feeds, so when I have time I will be back
    to read a lot more, Please do keep up the superb job.

  • scoliosis
    I have to thank you for the efforts you have put in writing this site.

    I’m hoping to see the same high-grade content from you later
    on as well. In fact, your creative writing abilities has motivated me to get my own blog
    now 😉 scoliosis

  • Hello there! This post couldn’t be written much better! Going through this post reminds me of my previous roommate!
    He continually kept talking about this. I most certainly will forward this information to him.
    Fairly certain he’ll have a very good read. Many
    thanks for sharing!

  • Eu não tenho como saber se seria só comigo ou se talvez alguém encontrou algum
    problema com seu site. Parece que alguns dos textos escritos em seu conteúdo está aparecendo fora
    da tela. Pode outra pessoa por favor comentar para eu saber se isso está acontecendo só comigo.
    Isso pode ser um erro com meu navegador web, eu vi acontecer a mesma coisa com outro blog outro dia.

    Desde já agradeço!

  • It’s actually a nice and helpful piece of info.
    I am satisfied that you simply shared this useful information with us.
    Please stay us informed like this. Thank you
    for sharing.

  • Hi I am so happy I found your webpage, I really found you by accident, while I was searching on Yahoo
    for something else, Nonetheless I am here now and would just
    like to say thanks a lot for a remarkable post and a all round enjoyable blog (I also love the theme/design),
    I don’t have time to read through it all at the moment but
    I have book-marked it and also added in your RSS feeds, so when I have time I will be back to read a great deal more, Please do keep up the great work.

  • Como vai ? você imagina alguma maneira de como gerar dinheiro
    juntando o que você trata nesta página , com a psicologia ?
    Sei que a pergunta parece estranha , mas isso é um
    plano que tenho há anos e depois de ler seu blog a cabeça
    ficou a mil

  • Hi there would you mind sharing which blog platform you’re working with?

    I’m going to start my own blog soon but I’m having a hard time choosing between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your design and style seems different then most blogs and I’m looking for something unique.
    P.S Apologies for getting off-topic but I had to ask!

  • Hello, Neat post. There’s an issue with your website in web explorer, may check this?
    IE still is the marketplace leader and a huge part of other
    people will leave out your magnificent writing because of this problem.

  • Hey! Do you know if they make any plugins to help with SEO?
    I’m trying to get my blog to rank for some targeted
    keywords but I’m not seeing very good results. If you know of any please share.
    Appreciate it!

  • Their very own like you study my mind! You appear to appreciate a
    lot with this, like you designed the book in this or anything.
    I think that you could do with a few pics to push
    the information home a lttle little, but besides that, this is amazing blog.

    A first-rate read. Ill definitely be to return.

  • I have been exploring for a bit for any high-quality articles
    or blog posts in this sort of space . Exploring in Yahoo I eventually stumbled upon this site.
    Studying this information So i am glad to convey that I
    have an incredibly just right uncanny feeling I came upon exactly what I needed.
    I so much for sure will make sure to do not put out of your mind this web site and provides
    it a look regularly.

  • Superb blog you have here but I was curious about if you
    knew of any discussion boards that cover the same topics
    talked about here? I’d really love to be a part of online community where I can get feed-back from other experienced individuals that share the
    same interest. If you have any suggestions, please let me know.


  • Hey There. I found your weblog using msn. That is a very well written article.
    I’ll make sure to bookmark it and return to read extra of your helpful info.
    Thank you for the post. I’ll certainly comeback.

  • Нi superb website! Does running a blog such ass
    thіs ttake a lot oof work? I have veгy little understanding
    of programming but I was hoping to start my oԝn blog soon. Anyhow,
    if you have any idеas or techniques for new blog
    owners pleas share. I know this is off topic bbսt I simply nededed to ask.

  • Amazing things here. I’m very happy to look your article.

    Thanks so much and I’m looking forward to contact you.

    Will you kindly drop me a mail?

  • Attractive part of content. I simply stumbled upon your site and in accession capital to say that I
    get in fact enjoyed account your blog posts. Any way I will be
    subscribing for your feeds and even I fulfillment you get entry to consistently rapidly.

  • With havin so much content do you ever run into any issues of plagorism or
    copyright infringement? My blog has a lot of completely unique content I’ve either written myself or outsourced but it looks like a lot
    of it is popping it up all over the internet without my permission. Do you
    know any ways to help prevent content from being stolen? I’d really appreciate it.

  • I’m not sure exactly why but this site is loading extremely
    slow for me. Is anyone else having this problem
    or is it a issue on my end? I’ll check back later and see if the problem still

  • I was recommended this web site by my cousin. I’m not sure whether this post
    is written by him as nobody else know such detailed about my trouble.
    You’re amazing! Thanks!

  • Hello! This is my first visit to your blog! We are a group of volunteers and starting a new
    project in a community in the same niche. Your blog provided us useful information to work on.
    You have done a marvellous job!

  • We’re a gaggle of volunteers and starting a brand new scheme in our
    community. Your site offered us with useful information to work on. You’ve performed a formidable activity and
    our entire neighborhood will likely be thankful to you.

  • Usually I do not learn post on blogs, however I would like to say that this write-up very
    pressured me to take a look at and do it! Your writing
    taste has been surprised me. Thanks, very great post.

  • My brother recommended I might like this blog.
    He was entirely right. This post actually made my day. You can not imagine simply how
    much time I had spent for this info! Thanks!

  • Woah! I’m really loving the template/theme of this site. It’s simple,
    yet effective. A lot of times it’s tough to get
    that “perfect balance” between user friendliness
    and visual appeal. I must say you have done a awesome job with
    this. In addition, the blog loads extremely fast for me on Safari.
    Excellent Blog!

  • An outstanding share! I’ve just forwarded this onto a friend
    who has been conducting a little research on this.

    And he actually bought me dinner due to the fact that I found it for him…
    lol. So allow me to reword this…. Thank YOU for the meal!!
    But yeah, thanx for spending some time to discuss
    this matter here on your website.

  • I like the helpful info you provide in your articles. I’ll bookmark your weblog and check
    again here regularly. I’m quite sure I’ll learn many new stuff right here!
    Good luck for the next!

  • Its such as you read my mind! You appear to know so much approximately this, like you wrote the ebook in it
    or something. I feel that you could do with a few p.c.
    to pressure the message home a bit, however instead of that,
    this is excellent blog. A great read. I’ll certainly be back.

  • I’m extremely inspired along with your writing abilities and also with the format in your weblog.
    Is this a paid subject or did you customize it yourself?
    Anyway stay up the excellent high quality
    writing, it’s rare to peer a great weblog like this one these days..

  • you’re in reality a just right webmaster. The web site loading velocity is amazing.

    It sort of feels that you are doing any distinctive trick.

    Moreover, The contents are masterwork. you’ve performed a excellent task on this

  • Hi, I do think this is an excellent site. I stumbledupon it
    😉 I will return yet again since I book marked it.
    Money and freedom is the greatest way to change, may you be rich and continue to guide others.

  • Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog
    that automatically tweet my newest twitter updates. I’ve been looking for a plug-in like
    this for quite some time and was hoping maybe you would have some
    experience with something like this. Please let me know if you run into anything.
    I truly enjoy reading your blog and I look forward to your
    new updates.

  • Admiring the time and effort you put into your site and detailed information you present.
    It’s good to come across a blog every once in a while that isn’t the same
    unwanted rehashed information. Great read! I’ve bookmarked your site and I’m adding your RSS
    feeds to my Google account.

  • Hey there! I just wanted to ask if you ever have any problems with hackers?
    My last blog (wordpress) was hacked and I ended up losing many months of hard
    work due to no back up. Do you have any methods to prevent hackers?
    quest bars quest bars

  • เพิ่มเกมมากมายหลากประเภท พนันครบวงจร ufabet ยืนหนึ่ง สะสมไว้ตรงนี้เว็บเดียวเสียวครบจบทุกการพนัน อยากสู้ ลองของงัดสกิลโชว์สร้างกำไรเติบโตกอบโกยเอา ผ่านหลากจำพวกเกมเด็ด
    ยอดฮิต โดยเฉพาะสล็อตออนไลน์
    ตัวแม่เว็บหลักจำต้องปักหมุดสร้างแลนด์มาร์กไว้เลย ครบสล็อต ทุกแบบ คุณภาพคัดสรรเกรดพรีเมี่ยมมาเต็มพร้อมแสงสว่าง สี เสียง 2D HD มีหมดตามสไตล์ความชอบที่ตอบปัญหาผู้เล่นทุกกรุ๊ป

Leave a Reply

Your email address will not be published. Required fields are marked *