How to read or write peripheral registers

Revision as of 17:38, 18 May 2020 by Registered User


1. Installation

For reading and writing STM32MP1 registers, we will use Devmem tool. There are two ways for install it on your board:

  • If you have an internet access on your board through apt-get
  • Else through bitbake

1.1. With apt-get

Just enter the following commands:

 sudo apt-get update
 sudo apt-get install devmem2

1.2. With bitbake

Enter the following commands:

 bitbake devmem2
 echo 'IMAGE_INSTALL_append += "devmem2"' >> meta-st/meta-st-openstlinux/recipes-st/images/st-image-weston.bbappend
 bitbake st-image-Weston

Then you just have to flash the generated image on your board with CubeProgrammer.

2. Use of Devmem

To use Devmem, enter the following command:

 devmem2 [address] [type] [data]

Where:

  • [address] corresponds to the register address you want to read
  • [type] corresponds to the output value size you want (b, h, w or l, respectively byte, halfword, word or long). Assigning a type is not necessary if you only read the register and the default output will be a word.
  • [data] corresponds to the data value you want to set on the register, assigning a type is mandatory in this case . If you don't assign a data, it will only read the register.

3. Examples of Devmem use

3.1. UART4 Baudrate

The Baudrate is defined as the Clock frequency over the Usartdiv. The Clock frequency clock_uart4_k value is 64 000 000 Hz and the Usartdiv is approximatively equal to 115 108. So the UART4 Baudrate is equal to 556. These results are known and thanks to Devmem we will retrieve the Baudrate value by looking at STM32MP1 registers. On the STM32MP157 Reference Manual, we find out that the base address of UART4 is 0x4001 0000 and the Baudrate value is at the offset 0x0C.

 devmem2 0x40010000
0x22C

Which is equal to 556 in decimal.