打印
[应用相关]

基于V2库串口1 printf输出功能

[复制链接]
446|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Henryko|  楼主 | 2023-2-28 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过串口1来使用printf功能,则先需要初始化串口1,并且使能串口发送,然后再配置重映射函数才能正常工作。        串口的初始化包括gpio的初始化以及串口的初始化,串口1使用默认的IO,PA9/PA10。一般当IO作为外设输出的时候设置为复用推挽输出功能,输入的设置为浮空输入或者上下拉输入模式。
void usart1_printf(void)
{
        gpio_init_type gpio_init_struct;
       
        /*Enable the UART Clock*/
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);                //开启GPIOA的时钟
        crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);                //开启USART1的时钟
          
    gpio_default_para_init(&gpio_init_struct);
        /* Configure the UART1 TX pin */
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;        //较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;                                //推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;                                                                //复用
    gpio_init_struct.gpio_pins = GPIO_PINS_9;                                                                //pa9
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;                                                        //无上下拉
    gpio_init(GPIOA, &gpio_init_struct);
       
        usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);                        //串口1,115200波特率,8数据位,1停止位
    usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE);                //无硬件流操作
    usart_parity_selection_config(USART1,USART_PARITY_NONE);                                //无校验
    usart_transmitter_enable(USART1, TRUE);                                                                        //使能发送

        usart_enable(USART1, TRUE);                                                                                                //使能串口1

}
      要使用printf 则需要开启重映射功能以及把头文件“stdio.h”(这是标准库的输出函数)包含进来,后面直接使用printf函数,即可输出要输出的数据。
/* suport printf function, usemicrolib is unnecessary */
#if (__ARMCC_VERSION > 6000000)
  __asm (".global __use_no_semihosting\n\t");
  void _sys_exit(int x)
  {
    x = x;
  }
  /* __use_no_semihosting was requested, but _ttywrch was */
  void _ttywrch(int ch)
  {
    ch = ch;
  }
  FILE __stdout;
#else
#ifdef __CC_ARM
  #pragma import(__use_no_semihosting)
  struct __FILE
  {
    int handle;
  };
  FILE __stdout;
  void _sys_exit(int x)
  {
    x = x;
  }
#endif
#endif

#if defined ( __GNUC__ ) && !defined (__clang__)
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]  retargets the c library printf function to the usart.
* @param  none
* @retval none
*/
PUTCHAR_PROTOTYPE
{
  while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  usart_data_transmit(USART1, ch);
  return ch;
}
       需要修改其他串口来输出的时候,初始化硬件对应串口和IO后,修改下面这个函数里面的串口号即可,比如改成串口2。   

使用特权

评论回复
沙发
abotomson| | 2023-3-7 13:42 | 只看该作者
printf串口通信发送大量数据,这个怎么解决的

使用特权

评论回复
板凳
lihuami| | 2023-3-7 13:54 | 只看该作者
可以使用dma和printf联合使用的吗?

使用特权

评论回复
地板
eefas| | 2023-3-7 14:10 | 只看该作者
printf 如何重定位printf()的输出

使用特权

评论回复
5
要使用printf 则需要开启重映射功能以及把头文件“stdio.h”(这是标准库的输出函数)包含进来,后面直接使用printf函数,即可输出要输出的数据。 要开启重映射有两种方式:使用keil的microlib以及不使用microlib。

使用特权

评论回复
6
geraldbetty| | 2023-3-7 19:36 | 只看该作者
如何用printf函数打印串口输出数据

使用特权

评论回复
7
robertesth| | 2023-3-7 19:48 | 只看该作者
修改putchar函数的寄存器即可

使用特权

评论回复
8
uytyu| | 2023-3-7 19:53 | 只看该作者
串口重定向printf输出只有一个字符  

使用特权

评论回复
9
hilahope| | 2023-3-7 19:59 | 只看该作者
为什么用printf()函数会一直在这个死循环里出不去

使用特权

评论回复
10
mnynt121| | 2023-3-7 20:03 | 只看该作者
:工程属性中的Target项中的Code Generation 选择 UseMicroLIB。即可使用printf进行串口输出。

使用特权

评论回复
11
janewood| | 2023-3-7 20:15 | 只看该作者
在单片机中用printf通过串口输出需要对串口进行相应配置

使用特权

评论回复
12
mollylawrence| | 2023-3-7 20:21 | 只看该作者
用printf发送数据 怎么配置?

使用特权

评论回复
13
lihuami| | 2023-3-7 20:30 | 只看该作者
printf函数应该对应哪个串口

使用特权

评论回复
14
tifmill| | 2023-3-7 20:48 | 只看该作者
C语言中使用printf函数需要设置什么?

使用特权

评论回复
15
modesty3jonah| | 2023-3-7 21:05 | 只看该作者
串口使用printf函数总是不能成功发送数据

使用特权

评论回复
16
sdCAD| | 2023-3-7 21:18 | 只看该作者
怎么进行printf和scan的串口初始化操作?

使用特权

评论回复
17
中国龙芯CDX| | 2023-3-9 16:30 | 只看该作者
printf串口通信发送大量数据时,应该注意避免缓冲区溢出,否则会造成数据丢失。此外,应当根据实际情况使用合适的协议和校验方式来保证数据传输的正确性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

2341

帖子

0

粉丝