「UART_1」の編集履歴(バックアップ)一覧はこちら
「UART_1」(2012/04/23 (月) 22:32:56) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*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"); //ターミナルに文字列表示
#image(HelloWorldViaUART1.png,title=ターミナル)
***メモ
USARTのボーレートの計算にはCPUクロックの周波数が必要。USART1は72MHzが供給できるが、他のUSARTには36MHzまでしか供給できない。
ボーレートの設定値には小数も使用できる。
**プログラムZIP
&link(割り込み無しシリアル送信){http://www34.atwiki.jp/phktech_tips/pub/mini-demo_UART1_TX_simple.zip}
*FIFO付き送信(割り込み使用)
*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"); //ターミナルに文字列表示
#image(HelloWorldViaUART1.png,title=ターミナル)
こんな感じ。
***メモ
USARTのボーレートの計算にはCPUクロックの周波数が必要。USART1は72MHzが供給できるが、他のUSARTには36MHzまでしか供給できない。
ボーレートの設定値には小数も使用できる。
**プログラムZIP
&link(割り込み無しシリアル送信){http://www34.atwiki.jp/phktech_tips/pub/mini-demo_UART1_TX_simple.zip}
*FIFO付き送信(割り込み使用)