UART_1


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

UARTでパソコンと通信する

これができなきゃデバッグできん。
かのマイコン野郎は言いました。"タイマ割り込みとシリアル通信ができればそのマイコンは制覇したのも同然"と。

ハードウエア準備

UART1を使って通信する。
PA10がUSART1_RX/PA9がUSART1_TX。
電圧レベルを変換するためADM3202を介してUSBシリアルケーブルと接続。

割り込みを使わずに送信だけしてみる

追加プログラム

//UART1にクロックを供給
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);	//オルタネート出力を使う場合はここにもクロック供給の設定が必要
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);	//USART1クロック
//PA13,15を出力ポートにする
//PA9をオルタネート出力(USART1_TX)にする
GPIOA->CRH = (((uint32_t)0x03) << 28 ) | (((uint32_t)0x03) << 20 ) | (((uint32_t)0x0B) << 4);

//UARTの設定
//UE(USART ENABLE ON B13)/TE(送信イネーブル B3) ON / RE(受信イネーブル B2)ON
USART1->CR1 = _BV(13)|_BV(3)|_BV(2);

//ボーレート設定
USART1->BRR = (468<<4) | 12;	//9600bps 計算式はデータシート参照

//データ送信
USART1->DR = 'A';

ちゃんと関数にする
//一文字出力
void Serial_Write(uint8_t d){
	//TXEが1になるまで待機
	//TXEが1になる条件:DRの値が転送された=新たにデータを書いてもOK
	while((USART1->SR & _BV(7)) == 0);
	
	//データライト
	USART1->DR = d;
}

//文字列出力
void Serial_Puts(char *str){
	while(*str){
		Serial_Write(*str);
		str++;
	}
}


Serial_Puts("Hello STM32 World!\n"); //ターミナルに文字列表示
こんな感じ。


メモ

USARTのボーレートの計算にはCPUクロックの周波数が必要。USART1は72MHzが供給できるが、他のUSARTには36MHzまでしか供給できない。
ボーレートの設定値には小数も使用できる。

プログラムZIP


FIFO付き送信(割り込み使用)

添付ファイル