int fputc(int ch, FILE *f) {
usart_data_transmit(EVAL_COM0,ch);//EVAL_COM0即为usrat0
while(usart_flag_get(EVAL_COM0, USART_FLAG_TBE) == RESET);
return ch;
}
在IAR8版本中用此fputc代码即可,而如果是IAR9就要用_write代码。此代码放在main外便可以,不过还需要在main函数内写usart初始化函数gd_eval_com_init(),该函数在eval.h文件里有;
EVAL_COM0是usart0,这个在eval.h文件里有写,该文件是各种硬件接口定义文件。
#include "gd32f4xx.h"
#include "main.h"
#include "system_config.h"
#include "laser_distance.h"
#include "gd32f450i_eval.h"//提供所有外设接口,比如usrat0
#include <stdio.h>
int main(void)
{
uint32_t AHB = rcu_clock_freq_get(CK_AHB);
uint32_t APB2 = rcu_clock_freq_get(CK_APB2);
uint32_t APB1 = rcu_clock_freq_get(CK_APB1);
System_Init();
LED_Init();
gd_eval_com_init(EVAL_COM0);
printf("GD32F405 Laser Distance Measurement\r\n");
printf("Timer Frequency: %.1f MHz\r\n", TIMER_FREQUENCY / 1000000.0f);
printf("Fiber Index: %.3f\r\n", FIBER_INDEX);
printf("Ready for measurement...\r\n\r\n");
while (1)
{
Start_Measurement();
uint32_t timeout = 0;
while (measure_state == MEASURE_WAITING_FOR_LASER ||
measure_state == MEASURE_WAITING_FOR_ECHO)
{
timeout++;
if (timeout > MEASUREMENT_TIMEOUT)
{
measure_state = MEASURE_TIMEOUT;
break;
}
}
if (measure_state == MEASURE_COMPLETED)
{
float dist = Get_Distance();
Print_Distance(dist);
}
// else
// {
// printf("Measurement timeout!\r\n");
// }
//
// for (volatile uint32_t i = 0; i < 1000000; i++);
}
}
// 重定向printf到串口
int fputc(int ch, FILE *f) {
usart_data_transmit(EVAL_COM0,ch);//EVAL_COM0即为usrat0
while(usart_flag_get(EVAL_COM0, USART_FLAG_TBE) == RESET);
return ch;
}