F103 printf 串口调试程序到F4平台的移植
F103 printf串口打印程序移植到F4
我在使用F103做开发的时候,一直都是通过串口输出调试信息的,拿到板子之后,我想的第一件事就是把串口这一部分的功能实现,要不然没有办法进行下一步的开发。
首先还是工程的配置,这次的工程配置和之间的差不多,流程都是一样的,只是在开始的Pinout配置时将USART3配置成异步模式即Asynchronous
时钟我按F103的习惯配置成了72MHZ ,其他的都一样了。
我先查看了一下硬石写的HAL库的串口的实现
然后是F103平台的Printf代码的实现
- #if 1
- #pragma import(__use_no_semihosting)
- struct __FILE
- {
- int handle;
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- };
- /* FILE is typedef d in stdio.h. */
- FILE __stdout;
- _sys_exit(int x)
- {
- x = x;
- }
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);
- USART1->DR = (u8) ch;
- return ch;
- }
- #endif
发现这两者的差距不是很大,只是具体到硬件的时候,由于平台的不同代码不太一样,我综合了一下,就改出了自己的程序
- #if 1
- #pragma import(__use_no_semihosting)
- struct __FILE
- {
- int handle;
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- };
- /* FILE is typedef?ˉ d in stdio.h. */
- FILE __stdout;
- void _sys_exit(int x)
- {
- x = x;
- }
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
- int fgetc(FILE *f)
- {
- uint8_t ch = 0;
- HAL_UART_Receive(&huart3,&ch, 1, 0xffff);
- return ch;
- }
- #endif
当然还要在usart.h的文件中加上这一句
- /* USER CODE BEGIN Includes */
- #include "stdio.h"
- /* 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口就自己关闭了。
谢谢