コミックマーケット95
出すぞ
- JTAG
- SWD
抵抗つけろよとかそういう話,ARMの規格書とか参照 .
HALはタイマ使ってるので,RTOS使うなら別に一つ割当してやる話
LLAPIやっちゃう?
STM32 microcontroller debug toolboxより解説できそうな部分をいかに抜粋,この辺は書きたいなぁ
0割
一部のレジスタ設定してやればよい.
ハンドラに飛んでくれるようになる(はず)
Printfデバッグ
基本的にGCC(SW4STM32含む)ベース
基本的にint __io_putchar(int ch)
を定義してやることで解決
syscall.c
の有無,コンパイラにより追加で関数が必要になる.基本的に取り上げるのはGCCだけだけどね
#include "stdio.h" int __io_putchar(int ch){ HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 0xFFFF); return ch; }
syscall.cを使用しない場合には以下も追加
int _write(int file, char *ptr, int len){ int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++){ __io_putchar( *ptr++ ); } return len; }
UART
SWO/SWV
#include "stdio.h" int __io_putchar(int ch){ ITM_SendChar(ch); return(ch); }
syscall.cを使用しない場合には以下も追加
int _write(int file, char *ptr, int len){ int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++){ __io_putchar(*ptr++); } return len; }
semihosting
EclipseのWEBヘルプを参照
各ソフトウェアのバージョンを確認する,いまのところ最新入れとけば問題ない
DebugからReleaseへ
以下の事項に注意しよう
- ソフトウェアブレークポイント(BKPT)を取り除く
#ifdef DEBUG
などのステートメントを使う printf()
が最終製品がきちんと動く関数なのか確認する,semihostingやSWOはhardfaultを引き起こすので注意- コードの最適化レベルを確認する.
- 適切なFaultハンドラを実装する
- DBGMCUレジスタをデフォルトにリセットする.
stm32に限らないけど使ってみたtips,解説入れればまぁ許される?
5V↔3.3Vのレベル変換
抵抗2つとMOSFET1つでok
MOSFETにダイオードが入ってることがミソ
Vgs(th)が低電圧側の電源電圧より低いこと,Vdsが高電圧側の電源電圧より高いMOSFETを選んでやれば,任意のレベル変換ができる?
小信号用のFETを使えばいいと思うが,めちゃくちゃ高速な信号のレベル変換には適さないと思う,それが問題になるレベルであれば素直にバッファ回路を組んで上げるほうが確実