No edit summary
 
(Moves section about Arm GCC to the Arm main page.)
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[File:ARM_STM32F411.jpg | 100%]]
[[File:ARM_STM32F411.jpg | 100%]]
=== <br />Introduction ===
 
ARM is the dominant processor architecture in mobile and embedded devices. The CPU architectures are developed by [https://www.arm.com ARM Ltd.] and licensed by various hardware manufacturers for use in processor design. Plenty of ARM-based processor models are available on the market, ranging from special-purpose microcontrollers to generic computing with support for consumer operating systems. The price-performance ratio and broad availability makes ARM processors ideal for use in hobbyist electronics projects.
= Programming =
== Armv6-M Programming Model ==
The programming model used in Cortex-M processors with low power consumption. For example, Cortex-M0.
<br />
<br />
== Armv7-M Programming Model ==
This is the programming model used in Cortex-M processors with higher performance. For example, Cortex-M4.
<br />
<br />
=== History ===
 
The initial ARM processor architecture was developed in the mid-1980s by the British computer manufacturer Acorn Computers with the goal of creating an auxiliary processor for a business computer product. The acronym ARM stands for <u>A</u>corn <u>R</u>ISC <u>M</u>achine. ARM Ltd. was founded as a joint venture with the U.S. computer manufacturer Apple with the goal of developing an improved architecture that could be used for the main processor of a computer.
== CMSIS ==
<br />
Arm specifies a standard C interface for programming Cortex-M processors, the '''C'''ortex-'''M''' '''S'''tandard '''I'''nterface (CMSIS). The Arm licensees are strongly encouraged to provide the CMSIS functions as part of their microcontroller programming SDK. Third-party software libraries usually rely on CMSIS availability.
<br />
=== Intrinsic Functions ===
=== Cross-Compiling ===
{|
If your operating system is Ubuntu Linux, running on an x64/AMD64 processor, you need the following package to ''cross-compile'' code to run on ARM Cortex series processors:
|+ style="text-align:left" | Functions that generate instructions not provided by ISO/IEC C
<pre class="terminal">
! Instruction
sudo apt-get install gcc-arm-none-eabi
! CMSIS intrinsic function
</pre>
|-
| CPSIE I || void __enable_irq(void)
|-
| CPSID I || void __disable_irq(void)
|-
| ISB || void __ISB(void)
|-
| DSB || void __DSB(void)
|-
| DMB || void __DMB(void)
|-
| NOP || void __NOP(void)
|-
| REV || uint32_t __REV(uint32_t int value)
|-
| REV16 || uint32_t __REV16(uint32_t int value)
|-
| REVSH || uint32_t __REVSH(uint32_t int value)
|-
| SEV || void __SEV(void)
|-
| WFE || void __WFE(void)
|-
| WFI || void __WFI(void)
|}
 
{|
|+ style="text-align:left" | Functions for accessing special registers
! Register
! CMSIS read function
! CMSIS write function
|-
| PRIMASK || uint32_t __get_PRIMASK (void) || void __set_PRIMASK (uint32_t value)
|-
| CONTROL || uint32_t __get_CONTROL (void) || void __set_CONTROL (uint32_t value)
|-
| MSP || uint32_t __get_MSP (void) || void __set_MSP (uint32_t TopOfMainStack)
|-
| PSP || uint32_t __get_PSP (void) || void __set_PSP (uint32_t TopOfProcStack)
|}
 
<br />
<br />


=== Microcontrollers ===
 
= Processor Cores =
ARM's family of [https://www.arm.com/products/processors/cortex-m Cortex-M processors] (notably M0, M0+, M3, M4) are designed for use as energy-efficient microcontrollers, where M0+ is the cheapest and most efficient, and M4 is the fastest and most capable (offering DSP functions and a floating point unit).
ARM's family of [https://www.arm.com/products/processors/cortex-m Cortex-M processors] (notably M0, M0+, M3, M4) are designed for use as energy-efficient microcontrollers, where M0+ is the cheapest and most efficient, and M4 is the fastest and most capable (offering DSP functions and a floating point unit).
<br />
<br />
<br />
<br />
==== Reference Manuals ====
== Reference Manuals ==
* [https://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php CMSIS abstraction layer for programming Cortex-M processors]
* [https://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php CMSIS abstraction layer for programming Cortex-M processors]
===== Cortex-M0+ =====
== Cortex-M0+ ==
* [https://developer.arm.com/Processors/Cortex-M0+ Arm Cortex-M0+]
* [http://infocenter.arm.com/help/topic/com.arm.doc.dui0662b/index.html Generic User Guide]
* [http://infocenter.arm.com/help/topic/com.arm.doc.dui0662b/index.html Generic User Guide]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0419c/index.html ARMv6-M Architecture Reference Manual]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0419c/index.html ARMv6-M Architecture Reference Manual]
===== Cortex-M4 =====
== Cortex-M4 ==
* [https://developer.arm.com/Processors/Cortex-M4 Arm Cortex-M4]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/index.html Generic User Guide]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/index.html Generic User Guide]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403e.b/index.html ARMv7-M Architecture Reference Manual]
* [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403e.b/index.html ARMv7-M Architecture Reference Manual]
<br />
<br />
==== Instruction Sets ====
== Development Boards ==
Based on a diagram in Joseph Yiu's book [https://www.elsevier.com/books/the-definitive-guide-to-arm-cortex-m0-and-cortex-m0-processors/yiu/978-0-12-803277-0 The Definitive Guide to ARM Cortex-M0 and Cortex-M0+ Processors].
<br />
[[File:ARM_Cortex_M_Instruction_Sets.png]]
<br />
<br />
==== Development Boards ====
* [http://www.st.com/en/ecosystems/stm32-nucleo.html Nucleo] boards by STMicroelectronics, with STM32 processors
* [http://www.st.com/en/ecosystems/stm32-nucleo.html Nucleo] boards by STMicroelectronics, with STM32 processors
** Sold by: [https://www.digikey.com/products/en/development-boards-kits-programmers/evaluation-boards-embedded-mcu-dsp/786?k=nucleo&k=&pkeyword=nucleo&v=497&FV=ffe00312 DigiKey], [https://www.reichelt.de/index.html?ACTION=446;GROUPID=6667;SEARCH=nucleo Reichelt], [https://www.conrad.de/de/Search.html?search=nucleo%20board&sc.queryFromSuggest=true&searchType=SUGGEST&searchSource=SUGGEST_QUERY&category=%1FEntwicklungskits%1FEntwicklungskits%252C%2BEntwicklungssysteme Conrad], etc.
** Sold by: [https://www.digikey.com/products/en/development-boards-kits-programmers/evaluation-boards-embedded-mcu-dsp/786?k=nucleo&k=&pkeyword=nucleo&v=497&FV=ffe00312 DigiKey], [https://www.reichelt.de/index.html?ACTION=446;GROUPID=6667;SEARCH=nucleo Reichelt], [https://www.conrad.de/de/Search.html?search=nucleo%20board&sc.queryFromSuggest=true&searchType=SUGGEST&searchSource=SUGGEST_QUERY&category=%1FEntwicklungskits%1FEntwicklungskits%252C%2BEntwicklungssysteme Conrad], etc.
Line 42: Line 84:
<br />
<br />


==== Software Development Tools ====
== Software Development Tools ==
* [https://developer.mbed.org ARM mbed] platform with high-level API (not CMSIS), HAL library, Internet connectivity services, optional web IDE
* [[ARM Mbed]] framework that provides higher-level C++ API, with downloadable or web-based IDE.
* [https://launchpad.net/~team-gcc-arm-embedded/+archive/ubuntu/ppa GNU ARM Embedded Toolchain] for Ubuntu<br />or the [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads latest toolchain for all Linux distros, macOS, and Windows] directly from ARM Ltd.
* [https://launchpad.net/~team-gcc-arm-embedded/+archive/ubuntu/ppa GNU ARM Embedded Toolchain] for Ubuntu<br />or the [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads latest toolchain for all Linux distros, macOS, and Windows] directly from ARM Ltd.
* [https://gnu-mcu-eclipse.github.io/ GNU MCU Eclipse plugin] with good support for STM32
* [https://gnu-mcu-eclipse.github.io/ GNU MCU Eclipse plugin] with good support for STM32
Line 51: Line 93:
<br />
<br />


==== Tutorials ====
== Tutorials ==
* [[ARM Assembly]] programming
* [[Arm Cortex-M Assembly]] programming
* [[Programming STM32F411 | Programming the Cortex-M4 development board Nucleo-64 STM32F411]]
* [[Nucleo-64 | Programming the STM Nucleo-64 boards]]
* [[Programming STM32F042 | Programming the Cortex-M0 development board Nucleo-32 STM32F042]]
* [[Nucleo-32 | Programming the STM Nucleo-32 boards]]
* [[Programming ATSAME54 | Programming the Cortex-M4 development board SAM E54 Xplained Pro]]
* [[ARM Bootloader]]
* [[ARM Bootloader]]
* [http://www.ethernut.de/en/documents/arm-inline-asm.html ARM GCC Inline Assembler Cookbook] by Harald Kipp  
* [http://www.ethernut.de/en/documents/arm-inline-asm.html ARM GCC Inline Assembler Cookbook] by Harald Kipp  
* [http://www2.keil.com/mdk5/learn Collection of Cortex-M tutorials by Keil]
* [http://www2.keil.com/mdk5/learn Collection of Cortex-M tutorials by Keil]
* [https://sites.google.com/site/learningeclipsearm Programming STM32F103RET Cortex-M3 with GNU ARM Eclipse Plugin]
* [https://sites.google.com/site/learningeclipsearm Programming STM32F103RET Cortex-M3 with GNU ARM Eclipse Plugin]
<br />
<br />
=== ARM64 ===
<br />
<br />
<br />
<br />

Latest revision as of 2022-10-09T18:58:47

100%

Programming

Armv6-M Programming Model

The programming model used in Cortex-M processors with low power consumption. For example, Cortex-M0.

Armv7-M Programming Model

This is the programming model used in Cortex-M processors with higher performance. For example, Cortex-M4.

CMSIS

Arm specifies a standard C interface for programming Cortex-M processors, the Cortex-M Standard Interface (CMSIS). The Arm licensees are strongly encouraged to provide the CMSIS functions as part of their microcontroller programming SDK. Third-party software libraries usually rely on CMSIS availability.

Intrinsic Functions

Functions that generate instructions not provided by ISO/IEC C
Instruction CMSIS intrinsic function
CPSIE I void __enable_irq(void)
CPSID I void __disable_irq(void)
ISB void __ISB(void)
DSB void __DSB(void)
DMB void __DMB(void)
NOP void __NOP(void)
REV uint32_t __REV(uint32_t int value)
REV16 uint32_t __REV16(uint32_t int value)
REVSH uint32_t __REVSH(uint32_t int value)
SEV void __SEV(void)
WFE void __WFE(void)
WFI void __WFI(void)
Functions for accessing special registers
Register CMSIS read function CMSIS write function
PRIMASK uint32_t __get_PRIMASK (void) void __set_PRIMASK (uint32_t value)
CONTROL uint32_t __get_CONTROL (void) void __set_CONTROL (uint32_t value)
MSP uint32_t __get_MSP (void) void __set_MSP (uint32_t TopOfMainStack)
PSP uint32_t __get_PSP (void) void __set_PSP (uint32_t TopOfProcStack)



Processor Cores

ARM's family of Cortex-M processors (notably M0, M0+, M3, M4) are designed for use as energy-efficient microcontrollers, where M0+ is the cheapest and most efficient, and M4 is the fastest and most capable (offering DSP functions and a floating point unit).

Reference Manuals

Cortex-M0+

Cortex-M4


Development Boards


Software Development Tools


Tutorials




Debug data: