[应用相关] 基于V2库串口1 printf输出功能

[复制链接]
 楼主| Henryko 发表于 2023-2-28 10:02 | 显示全部楼层 |阅读模式
通过串口1来使用printf功能,则先需要初始化串口1,并且使能串口发送,然后再配置重映射函数才能正常工作。        串口的初始化包括gpio的初始化以及串口的初始化,串口1使用默认的IO,PA9/PA10。一般当IO作为外设输出的时候设置为复用推挽输出功能,输入的设置为浮空输入或者上下拉输入模式。
  1. void usart1_printf(void)
  2. {
  3.         gpio_init_type gpio_init_struct;
  4.        
  5.         /*Enable the UART Clock*/
  6.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);                //开启GPIOA的时钟
  7.         crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);                //开启USART1的时钟
  8.           
  9.     gpio_default_para_init(&gpio_init_struct);
  10.         /* Configure the UART1 TX pin */
  11.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;        //较大电流推动/吸入能力
  12.     gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;                                //推挽输出
  13.     gpio_init_struct.gpio_mode = GPIO_MODE_MUX;                                                                //复用
  14.     gpio_init_struct.gpio_pins = GPIO_PINS_9;                                                                //pa9
  15.     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;                                                        //无上下拉
  16.     gpio_init(GPIOA, &gpio_init_struct);
  17.        
  18.         usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);                        //串口1,115200波特率,8数据位,1停止位
  19.     usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE);                //无硬件流操作
  20.     usart_parity_selection_config(USART1,USART_PARITY_NONE);                                //无校验
  21.     usart_transmitter_enable(USART1, TRUE);                                                                        //使能发送

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

  23. }
      要使用printf 则需要开启重映射功能以及把头文件“stdio.h”(这是标准库的输出函数)包含进来,后面直接使用printf函数,即可输出要输出的数据。
  1. /* suport printf function, usemicrolib is unnecessary */
  2. #if (__ARMCC_VERSION > 6000000)
  3.   __asm (".global __use_no_semihosting\n\t");
  4.   void _sys_exit(int x)
  5.   {
  6.     x = x;
  7.   }
  8.   /* __use_no_semihosting was requested, but _ttywrch was */
  9.   void _ttywrch(int ch)
  10.   {
  11.     ch = ch;
  12.   }
  13.   FILE __stdout;
  14. #else
  15. #ifdef __CC_ARM
  16.   #pragma import(__use_no_semihosting)
  17.   struct __FILE
  18.   {
  19.     int handle;
  20.   };
  21.   FILE __stdout;
  22.   void _sys_exit(int x)
  23.   {
  24.     x = x;
  25.   }
  26. #endif
  27. #endif

  28. #if defined ( __GNUC__ ) && !defined (__clang__)
  29.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  30. #else
  31.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  32. #endif

  33. /**
  34. * [url=home.php?mod=space&uid=247401]@brief[/url]  retargets the c library printf function to the usart.
  35. * @param  none
  36. * @retval none
  37. */
  38. PUTCHAR_PROTOTYPE
  39. {
  40.   while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  41.   usart_data_transmit(USART1, ch);
  42.   return ch;
  43. }
       需要修改其他串口来输出的时候,初始化硬件对应串口和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()的输出
小小蚂蚁举千斤 发表于 2023-3-7 16:05 | 显示全部楼层
要使用printf 则需要开启重映射功能以及把头文件“stdio.h”(这是标准库的输出函数)包含进来,后面直接使用printf函数,即可输出要输出的数据。 要开启重映射有两种方式:使用keil的microlib以及不使用microlib。
geraldbetty 发表于 2023-3-7 19:36 | 显示全部楼层
如何用printf函数打印串口输出数据
robertesth 发表于 2023-3-7 19:48 | 显示全部楼层
修改putchar函数的寄存器即可
uytyu 发表于 2023-3-7 19:53 | 显示全部楼层
串口重定向printf输出只有一个字符  
hilahope 发表于 2023-3-7 19:59 | 显示全部楼层
为什么用printf()函数会一直在这个死循环里出不去
mnynt121 发表于 2023-3-7 20:03 | 显示全部楼层
:工程属性中的Target项中的Code Generation 选择 UseMicroLIB。即可使用printf进行串口输出。
janewood 发表于 2023-3-7 20:15 | 显示全部楼层
在单片机中用printf通过串口输出需要对串口进行相应配置
mollylawrence 发表于 2023-3-7 20:21 | 显示全部楼层
用printf发送数据 怎么配置?
lihuami 发表于 2023-3-7 20:30 | 显示全部楼层
printf函数应该对应哪个串口
tifmill 发表于 2023-3-7 20:48 | 显示全部楼层
C语言中使用printf函数需要设置什么?
modesty3jonah 发表于 2023-3-7 21:05 | 显示全部楼层
串口使用printf函数总是不能成功发送数据
sdCAD 发表于 2023-3-7 21:18 | 显示全部楼层
怎么进行printf和scan的串口初始化操作?
中国龙芯CDX 发表于 2023-3-9 16:30 | 显示全部楼层
printf串口通信发送大量数据时,应该注意避免缓冲区溢出,否则会造成数据丢失。此外,应当根据实际情况使用合适的协议和校验方式来保证数据传输的正确性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

2411

帖子

0

粉丝
快速回复 返回顶部 返回列表