微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > F103 printf 串口调试程序到F4平台的移植

F103 printf 串口调试程序到F4平台的移植

时间:10-02 整理:3721RD 点击:

F103 printf串口打印程序移植到F4


  我在使用F103做开发的时候,一直都是通过串口输出调试信息的,拿到板子之后,我想的第一件事就是把串口这一部分的功能实现,要不然没有办法进行下一步的开发。

  首先还是工程的配置,这次的工程配置和之间的差不多,流程都是一样的,只是在开始的Pinout配置时将USART3配置成异步模式即Asynchronous




  时钟我按F103的习惯配置成了72MHZ ,其他的都一样了。

    我先查看了一下硬石写的HAL库的串口的实现



  然后是F103平台的Printf代码的实现

  1. #if 1
  2. #pragma import(__use_no_semihosting)
  3. struct __FILE
  4. {
  5.         int handle;
  6.         /* Whatever you require here. If the only file you are using is */
  7.         /* standard output using printf() for debugging, no file handling */
  8.         /* is required. */
  9. };
  10. /* FILE is typedef d in stdio.h. */
  11. FILE __stdout;      
  12. _sys_exit(int x)
  13. {
  14.         x = x;
  15. }
  16. int fputc(int ch, FILE *f)
  17. {      
  18.         while((USART1->SR&0X40)==0);
  19.         USART1->DR = (u8) ch;      
  20.         return ch;
  21. }
  22. #endif

复制代码


      发现这两者的差距不是很大,只是具体到硬件的时候,由于平台的不同代码不太一样,我综合了一下,就改出了自己的程序


  1. #if 1
  2. #pragma import(__use_no_semihosting)            

  3. struct __FILE
  4. {
  5.         int handle;
  6.         /* Whatever you require here. If the only file you are using is */
  7.         /* standard output using printf() for debugging, no file handling */
  8.         /* is required. */
  9. };
  10. /* FILE is typedef?ˉ d in stdio.h. */
  11. FILE __stdout;      

  12. void _sys_exit(int x)
  13. {
  14.         x = x;
  15. }

  16. int fputc(int ch, FILE *f)
  17. {      
  18.         HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff);
  19.         return ch;
  20. }
  21. int fgetc(FILE *f)
  22. {   
  23.         uint8_t ch = 0;  
  24.         HAL_UART_Receive(&huart3,&ch, 1, 0xffff);
  25.         return ch;
  26. }
  27. #endif

复制代码

  当然还要在usart.h的文件中加上这一句

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

复制代码


这样在主函数中调用printf就可以通过串口输出到电脑上了。



完整工程文件http://pan.baidu.com/s/1dFzaXmL

感谢分享

我想问一下,用串口3的话是不是要自己去连USB转成串口的线?

我试用的这个板子不用再单独连,只要连上数据线安好驱动就可以直接读串口了;如果是别的板子,应该就要连线了。

补教程持续更新更新地址http://pan.baidu.com/s/1i5fpuOP

为什么可以呢?我用的也是这个板子啊,串口3不是PC5和PB10吗?可以通过串口通信吗?你用的是STLINK的接口,还是用的是另外一个USB接口?


板子上串口3的默认配置是和STLink连着的,我就是用的STLINK,你的电脑不好使可能是驱动的问题也可能是虚拟串口的问题。
你连上STLINK之后看一下设备管理器,如果显示有COM设备,那就说明驱动没问题,要是没有你就去我上面发的百度云里找到驱动安装上;
要是驱动没问题的话,就是虚拟串口的问题了,那个STLINK的虚拟串口挺不稳定的,每次都要重新插拔数据线,还要重新选择、关闭和打开串口。

我 自己的问题,我没有看到PD8,9端口是连接到STLINK上了,还自己去用了其他的串口去用。
今天才熟练到一点,串口3在许多的I/O都有对应的复用功能,正确的操作应该是先选择对应的IO,将其选择为串口功能,再去使能时钟,这样就能确定对应串口的复用功能是在我们选择的端口上使用的了!

其实先使能时钟,再改IO口也一样;你把另一个IO口设置为串口的功能了,那个串口默认的那个IO口就自己关闭了。

谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top