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
花岡ちゃんに花束を
参考になりました
返信削除Thanks for sharing
返信削除You're welcome!
削除excellent, Thank you.
返信削除