STM32学习笔记 —— STM32CubeIDE+printf()和scanf()重定向+使能浮点

#include "stdio.h"

#ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)   
    #define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif

//HAL库
PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&huart3, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
  return ch;
}

GETCHAR_PROTOTYPE
{
  uint8_t  ch;
  HAL_UART_Receive(&huart3,(uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return  ch;
}

//寄存器
PUTCHAR_PROTOTYPE
{ 	
	while((USART3->ISR & UART_FLAG_TC) == RESET);
	USART3->TDR=(uint8_t)ch;      
	return ch;
}

GETCHAR_PROTOTYPE
{
	while((USART3->ISR & UART_FLAG_RXNE) == RESET);
	return (uint8_t)(USART3->RDR);
}

注意:printf()和scanf()都是用轮询方式,没有使用中断。调用scanf()在串口助手中输入数据时,必须以空格结束,然后点击发送,否则无法完成发送。

使用标准库(__use_no_semihosting)

#pragma import(__use_no_semihosting) 
//标准库需要的支持函数
struct __FILE 
{ 
    int handle; 
}; 
FILE __stdout;    
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x) 
{ 
    x = x; 
} 
int fputc(int ch, FILE *f)
{      
	while((USART3->ISR & UART_FLAG_TC) == RESET);
	USART3->TDR=(uint8_t)ch;      
    return ch;
}

把printf重新宏定义了一下,使用时候就可以使用自己的函数,不想开printf时候改掉宏定义就好了

#define log(...) printf(__VA_ARGS__)

重写printf

#include   
#include   

void  USART3_Printf (const  void *format, ...)  
{  
  static uint8_t Buff[100];
  va_list args;
  uint32_t Len;

  va_start(args, format);
  Len = vsnprintf((char *)Buff, 100, (char *)format, args);
  va_end(args);
  HAL_UART_Transmit(&huart3, (uint8_t *)Buff, Len, 1000);
}

使能浮点
STM32学习笔记 —— STM32CubeIDE+printf()和scanf()重定向+使能浮点_第1张图片
STM32学习笔记 —— STM32CubeIDE+printf()和scanf()重定向+使能浮点_第2张图片

你可能感兴趣的:(STM32学习笔记)