微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口调试功能的添加

串口调试功能的添加

时间:10-02 整理:3721RD 点击:
本文的关键词:串口调试(硬件连接+波特率太高产生误码)
在完成了简单的LED的控制程序之后,基于串口调试的需要,于是,准备就项目的设计添加一个串口的调试的功能。
在NUCLEO的引脚上,我选择USART3来实现串口的功能。(PS:USART和UART的区别:前面一个是后面一个的升级版,可以实现同步的通信,但是基于在使用的过程大多数应用都是使用的异步的通信方式,这边我也没有深入的去理解两种通信方式的区别)。


这边我还是想说一下的就是使用STM32CUBEMX,真的会给编程工作带来很大的方便。
在这个工程的建立的程做一下说明:
创建一个新的工程:
C:\Users\Administrator\AppData\Local\YNote\data\qq998B8BD07BE35DB89AADD6F3A8A8FE5A\c4ecf2d12c4747cf9f788d891abd97df\clipboard.png
根据上图,选择对应芯片。
首先:根据需要使能对应的串口,这样就会在MCU的引脚上,看到对应的串口的引脚被点亮。这样引脚就算已经被选择,并且设置为串口的输入输出的模式。


C:\Users\Administrator\AppData\Local\YNote\data\qq998B8BD07BE35DB89AADD6F3A8A8FE5A\a10ab2605f07449cab578927c748bebb\clipboard.png
根据上图,设置为异步的通信方式。
接下来就是时钟电路的设置,这边根据我们的时钟输入是从外部的时钟信号的输入,并且是一个8MHZ左右的信号,因此选择HSE的外部输入,并且在LSE的信号是,电路上加载了32Khz的晶振信号。


C:\Users\Administrator\AppData\Local\YNote\data\qq998B8BD07BE35DB89AADD6F3A8A8FE5A\1f13bd64b1c14d0abc83804ec762d46a\clipboard.png
另外要知道的就是USART的时钟是在,APB2,先进的外设总线的接口上,因此就可以完成时钟电路的设置。
C:\Users\Administrator\AppData\Local\YNote\data\qq998B8BD07BE35DB89AADD6F3A8A8FE5A\4d073d65b2664d1fac99ce05fe66acb8\clipboard.png
时钟电路的设置完成以后就是进行USART的引脚的基本的设置,设置波特率,奇偶校验等位置,因为没有使用过中断,硬件流控制等功能,因此先不使用这些功能,就可以完成基本的设置工作,保存以后,就可以生成我们需要的完成了基本的配置的工程模板。


接下来的一个操作,对printf这个函数的一个从定向的工作,这样使得数据能够输出到我们需要的串口上,完成以后,在主函数的适当的位置上添加上对应的代码就可以在PC端,查看串口的输出的结构,这个我是为了在调试过程中,使用串口而准备的。
网上找到的函数:
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

这边要说明的一个重点就是硬件上的连接:也是因为自己在之前没有去使用过这功能,因此在硬件的连接上,遇到了一些很白痴的问题,在此做一个说明,希望如果有相同的人可以理解,并且避免这个错误,如果有不当的地方,也希望大家能够指出,共同进步!
电脑的COM口也就是我们常常理解的串口的概念,是标准的RS232的接口,内部应该是通过一些连接转换成了USB的接口,因此在使用的时候,我们要使用外部的连接设备将USB口转换成可以适合通讯的串口。
这边要说明的一点就是,就串口输出的电平来说也是有很多种的,有RS232,TTL,R485三种常见的电平的结构,只有在对应匹配的电平的类型下,两个设备之间的连接才能够正常的建立,才能够完成通信的工作。
接下来分析我们的工作的环境,就STM32来说,它的引脚是兼容COMS电平,和RS232电平。我原本理解的是这个是CMOS的电平的输出,就是高电平是3.3V左右,而低电平就是0了。这样的电平的特点,是能够兼容TTL的电平。因此,要通过一个外部链接设备,将USB接口转换成TTL电平,这样和串口连接以后才能够完成通信。

这边还出现的一个问题就是,在波特率的设置上,设置为115200的波特率的时候,和PC机的通信之间会出现乱码,在下调波特率为57600或者较低的一些数值之后,乱码的问题就得到了解决。百度上有看的说是和时钟的晶振有关系,在高波特率的情况下,会使得偏差变大,产生误码,这才产生了乱码的问题。


试用报告标题需要注意一下  以【NUCLEO-F412ZG试用体验】为前缀

了解

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

网站地图

Top