途中、sprintf()を使ったところで、_sbrkがないよというリンカエラーが発生した。
google先生に聞いたところ、通常はsyscalls.cで定義されている関数らしい。
syscalls.cはねむいさんのサンプルプロジェクトに同梱されていたので、使わせてもらう。
そのまま使うと、putch()とgetch()がないよと言われる。取り合えず今のところは標準入出力をそのま使わないので、syscalls.cの上のほうで中身のない、空の関数宣言してエラーを回避する。
UARTのような、特定機能(alternate function)を使う場合の手順は以下のようにする。
- 特定機能が割り当てられているGPIOのクロックを有効化する
- 特定機能のクロックを有効化する
- GPIOの設定をする(特定機能モードにする)
- 特定機能の設定をする
- デバイスの端子を特定機能に割り当てる
※ところで、今回alternate functionを特定機能と呼んだけれど、分かりやすい和訳は何だろう?直訳すると代替機能、ニュアンス的には周辺機能。プルチプレクサと同じことなんだろうけれど。
取り合えず動いたプロジェクトをこちら(stm32f4_uart01.zip)に保管します。
ソースコードは以下。
#include "stm32f4xx.h"
#include "uart.h"
void uart2_init(int baudrate){
/* structure to initialize GPIO */
GPIO_InitTypeDef GPIO_InitStructure;
// --------------------------------------------------
// Port A 設定(UART2 入出力) ここから
//GPIOAとUSART2にクロック供給
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//GPIOAのPIN2を出力に設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIOAのPIN2をオルタネィテブファンクションのUSART2に割り当て
GPIO_PinAFConfig(GPIOA , GPIO_PinSource2 , GPIO_AF_USART2);
//USART初期化用構造体を作る
USART_InitTypeDef USART_InitStructure;
//USART2を9600bps,8bit,ストップビット1,パリティなし,フロー制御なし,送受信有効に設定
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
//USART2を有効化
USART_Cmd(USART2, ENABLE);
// Port A 設定(UART2 入出力) ここまで
// --------------------------------------------------
}
void USART_putc(USART_TypeDef* USARTx,char c){
while(!(USARTx->SR & 0x00000040)); //前回の送信が終わるまで待機
USART_SendData(USARTx,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
#include
#include
void uart2_printf(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;
}
0 件のコメント:
コメントを投稿