ログ

見る価値ありません

Nucleo F446REでLチカと+α

参考

idken.net

yuki-sato.com

リファレンスマニュアル https://www.st.com/content/ccc/resource/technical/document/reference_manual/4d/ed/bc/89/b5/70/40/dc/DM00135183.pdf/files/DM00135183.pdf/jcr:content/translations/en.DM00135183.pdf

環境

Nucleo F446RE

arm-none-eabi-gcc (Arch Repository) 9.1.0

コード

上の ARMアセンブリでLチカ さんからコピペしてちょこっと変えただけ

 .text
    .global _start
    .code 16
    .syntax unified

    .equ STACK_TOP, 0x20020000
    .equ RCC_AHB1ENR, 0x40023830
    .equ GPIOA_MODER, 0x40020000
    .equ GPIOA_ODR, 0x40020014

_start:
    .org 0x00000000
    .word STACK_TOP
    .word init
    .type init, function

init:
    LDR r0, =RCC_AHB1ENR
    movw r1, #0x0001
    str r1, [r0]

    LDR r0, =GPIOA_MODER
    movw r1, #0x0400
    str r1, [r0]

toggle_led:
    LDR r0, =GPIOA_ODR
    ldr r1, [r0]
    eor r1, #0x0020
    str r1, [r0]

    LDR r0, =800000

wait_loop:
    subs r0, #1
    bne wait_loop

    b toggle_led

    .end

コンパイル(普通こういうのはmakefileでやるんだと思うけど)

#!/bin/bash

filename=$(echo $1 | sed -E 's/.[^.]*$//')

arm-none-eabi-as -mcpu=cortex-m4 -mthumb -o ${filename}.o $1
arm-none-eabi-ld -Ttext 0x08000000 -o ${filename}.elf ${filename}.o

#arm-none-eabi-objcopy -O binary ${filename}.elf ${filename}.hex
#arm-none-eabi-objcopy -O binary ${filename}.elf ${filename}.bin

基板上のボタンを押してる間だけLEDがつくようにした

 .text
    .global _start
    .code 16
    .syntax unified

    .equ STACK_TOP, 0x20020000
    .equ RCC_AHB1ENR, 0x40023830
    .equ GPIOA_MODER, 0x40020000
    .equ GPIOA_ODR, 0x40020014
    .equ RCC_AHB1ENR, 0x40023830
    .equ GPIOC_MODER, 0x40020800
    .equ GPIOC_IDR, 0x40020810

_start:
    .org 0x00000000
    .word STACK_TOP
    .word init
    .type init, function

init:
    LDR r0, =RCC_AHB1ENR
    movw r1, #0x0005 // GPIOA(=0x0001) | GPIOC(=0x0004)
    str r1, [r0]

    LDR r0, =GPIOA_MODER
    movw r1, #0x0400
    str r1, [r0]

    LDR r0, =GPIOC_MODER
    LDR r1, =#0x00000000
    str r1, [r0]

    LDR r0, =GPIOA_ODR
    ldr r1, [r0]

button:
    LDR r2, =GPIOC_IDR
    ldr r3, [r2]
    ands r3, #0x2000
    bne led_off

led_on:
    mov r1, #0x0020
    str r1, [r0]
    b button

led_off:
    mov r1, #0x0000
    str r1, [r0]
    b button

    .end

備忘録

  • 基板上の緑LEDのLD2はPA5ピン

  • 基板上の青いタクトスイッチのB1はPC13ピン

  • SRAMは0x20000000 ~ 0x20020000の128KiB

  • FLASHは0x08000000 ~ 0x08080000の512KiB

  • ニーモニックにsがつくとステータスフラグを更新する