LSI Jiu-Jitsu

電子工作とブラジリアン柔術

STM32で遊ぶ (4) - printf表示

SW4STM32でARMのセミホスティング機能を使ってprintf表示が行えるようにします。


プロジェクトの「Properties」からリンカのオプションに下記を追加します。

-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon

f:id:mohran:20200306124628j:plain


srcディレクトリ内の syscalls.c を削除するか、.c をリネームしてコンパイル対象から外します。
f:id:mohran:20200306124935j:plain


main関数の外と中に下記のコードを加えると使用できるようになります。

#include <stdio.h>

void __auto_semihosting(void) __attribute__((alias("main")));
extern void initialise_monitor_handles(void);

int main(void){
  initialise_monitor_handles();
}


RCCレジスタのリード値を表示して試してみました。

#include <stdio.h>
#include "stm32f4xx.h"

void __auto_semihosting(void) __attribute__((alias("main")));
extern void initialise_monitor_handles(void);

int main(void){
  volatile unsigned int *addr;
  initialise_monitor_handles();

  for(int i=0; i<=0x94; i+=4){
    addr = (volatile unsigned int *)(RCC_BASE + i);
    printf("0x%08lx : 0x%08x\n", RCC_BASE + i, *addr);
  }

  return(0);
}


デバッガの設定で「Startup」タブに下記を追加してからデバッグを開始します。

monitor arm semihosting enable

f:id:mohran:20200306125136j:plain


実行後「Console」に赤文字で表示されれば成功です。
f:id:mohran:20200306125146j:plain

[参考記事]