2014年1月17日金曜日

STM32F4のUARTでprintf

STM32F4DISCOVERYのUSART機能を使ってPCとシリアル通信するプログラムを作成しました。
stdioやらをインクルードして文字列をフォーマットするので通常のprintfと全く同じ引数の与え方で利用できます。
UART2を用いて通信するので関数名はprintf2にしました(適当感
利用前にprintf2_Initを呼んで初期化を行ってください。




#include "stm32f4_discovery.h"

void printf2(const char *format, ...);
void printf2_Init(int baudrate);

int main(void){
 printf2_Init(921600);
 printf2("Hello World\n\r");
 int counter=0;
 while(1){
  counter++;
  printf2("counter = %d\n\r",counter);
 }
}


void printf2_Init(int baudrate){
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使う機能にクロック供給
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
 GPIO_InitTypeDef GPIO_InitStructure;   //GPIOA_2の設定
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOA, &GPIO_InitStructure);   //設定適用
 GPIO_PinAFConfig(GPIOA , GPIO_PinSource2 , GPIO_AF_USART2); //オルタネィテブファンクションの設定

 USART_InitTypeDef USART_InitStructure;    //USART2の設定
 USART_StructInit(&USART_InitStructure);    //すべてデフォルトに設定
 USART_InitStructure.USART_BaudRate = baudrate;  //ボーレート設定
 USART_Init(USART2, &USART_InitStructure);   //設定適用

 USART_Cmd(USART2, ENABLE);   //USART2を有効化
}

void USART_putc(USART_TypeDef* USARTx,char c){
 while(!(USARTx->SR & 0x00000040)); //前回の送信が終わるまで待機
 USART_SendData(USART2,c);
}

void USART_puts(USART_TypeDef* USARTx,const char *s){
 int i;
 for(i=0;s[i]!=0;i++) USART_putc(USARTx,s[i]);
}

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void printf2(const char *format, ...) {
 va_list list;
 va_start(list, format);
 int len = vsnprintf(0, 0, format, list);
 char *s;
 s = (char *)malloc(len + 1);
 vsprintf(s, format, list);
 USART_puts(USART2,s);
 free(s);
 va_end(list);
 return;
}
動作結果


ボーレートは9600と921600でしか動作確認していないので、他の値で利用する場合はプリスケーラの設定などを変更しないと行けない可能性があります。
それと画像を見れば分かる通り、マイコンを起動して最初の1文字が何故か文字化けするんですよね・・・・
面倒くさいので実用上問題もないのでこのまま使おうかと思っていますが直し方分かる方いれば教えていだだけると嬉しいです

参考サイト
STM32F4 USART tutorial
花岡ちゃんに花束を

4 件のコメント :

質問などありましたらお気軽にどうぞ