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.
返信削除