你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0学习手册——多串口同时使用printf输出

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。

新建工程
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE

20200718203500751.png


20200718203520493.png


2、 设置时钟树,HCLK=64MHz

20200718203629892.png


3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX

USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1

20200718204428382.png


4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1

20200718204945809.png


5、 项目管理填好信息。生成代码"GENERATE CODE"

20200718205222483.png


2020071820534722.png


6、使用MDK打开工程,debug选项中勾上“Reset and Run”

代码部分
1、usart.h中添加如下代码

  1. #include <stdarg.h>

  2. /* USER CODE BEGIN Prototypes */

  3. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
  4. void USART3_printf(char *fmt,...);
  5. void USART2_printf(char *fmt,...);

  6. /* USER CODE END Prototypes */
复制代码

2、usart.c添加如下代码

  1. /* USER CODE BEGIN 0 */

  2. #include <stdio.h>
  3. #include <string.h>
  4. #ifdef __GNUC__
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  6.      set to 'Yes') calls __io_putchar() */
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  8. #else
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  10. #endif /* __GNUC__ */
  11. /**
  12.   * @brief  Retargets the C library printf function to the USART.
  13.   * @param  None
  14.   * @retval None
  15.   */
  16. PUTCHAR_PROTOTYPE
  17. {
  18.   /* Place your implementation of fputc here */
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  21.   return ch;
  22. }

  23. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节
  24. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区

  25. //usart4的printf()
  26. void USART4_printf(char *fmt,...)
  27. {
  28.   uint32_t i,length;
  29.   va_list ap;
  30.   va_start(ap,fmt);
  31.   vsprintf(usart_txBuff,fmt,ap);
  32.   va_end(ap);
  33.   length=strlen((const char*)usart_txBuff);
  34.   while((USART4->ISR&0x40)==0);
  35.   for(i=0;i<length;i++)
  36.   {
  37.     USART4->TDR=usart_txBuff<i>;
  38.     </i>while((USART4->ISR&0x40)==0);
  39.   }
  40. }

  41. //usart3的printf()
  42. void USART3_printf(char *fmt,...)
  43. {
  44.   uint32_t i,length;
  45.   va_list ap;
  46.   va_start(ap,fmt);
  47.   vsprintf(usart_txBuff,fmt,ap);
  48.   va_end(ap);
  49.   length=strlen((const char*)usart_txBuff);
  50.   while((USART3->ISR&0x40)==0);
  51.   for(i=0;i<length;i++)
  52.   {
  53.     USART3->TDR=usart_txBuff;
  54.     while((USART3->ISR&0x40)==0);
  55.   }
  56. }

  57. //usart2的printf()
  58. void USART2_printf(char *fmt,...)
  59. {
  60.   uint32_t i,length;
  61.   va_list ap;
  62.   va_start(ap,fmt);
  63.   vsprintf(usart_txBuff,fmt,ap);
  64.   va_end(ap);
  65.   length=strlen((const char*)usart_txBuff);
  66.   while((USART2->ISR&0x40)==0);
  67.   for(i=0;i<length;i++)
  68.   {
  69.     USART2->TDR=usart_txBuff;
  70.     while((USART2->ISR&0x40)==0);
  71.   }
  72. }

  73. /* USER CODE END 0 */
复制代码

3、main.c中添加如下代码

/
  1. * USER CODE BEGIN Includes */
  2. #include <stdio.h>
  3. /* USER CODE END Includes */

  4. int main(void)
  5. {
  6.   while (1)
  7.   {
  8.     /* USER CODE END WHILE */

  9.     /* USER CODE BEGIN 3 */
  10.                 HAL_Delay(1000);
  11.                
  12.     USART4_printf("This is the signal from serial port 4.\r\n");
  13.     USART3_printf("This is the signal from serial port 3.\r\n");
  14.     USART2_printf("This is the signal from serial port 2.\r\n");
  15.     printf("This is the signal from serial port 1.\r\n");  
  16.   }
  17.   /* USER CODE END 3 */
  18. }
复制代码

4、最后编译,烧录固件,串口输出如图



20200718211759162.png
收藏 评论1 发布时间:2021-11-8 17:09

举报

1个回答
落花又见流水 回答时间:2021-11-9 17:01:37

学习学习

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版