单片机虚拟串口无法被识别,这个方法学到了
解决 STM32H750 USB 虚拟串口无法被识别
大家好,我是一哥,之前有同学私信我,USB串口老是无法识别,本文就是介绍这个情况的。
现象
板子和电脑联调的时候发现,USB线插入板子以后电脑不识别虚拟串口,通过禁用设备再启用,能够正常工作。也能够按一下复位键才能识别。
以前似乎没有这个问题,但记不清详细情况了。
电路
D+通过一.5K电阻上拉, 调试时整个板子通过与电脑连接的USB口供电, 即插上USB线才初始供电。
查找
由于通过禁用,启用能正常工作,于是有了上一篇文章
python–禁用、启用串口设备。
后来发现,如上操作之后,有时候依然不能正常工作,表现为设备管理器中该设备为未识别的设备,于是判断是板子上出了问题。
换板子发现,故障反复,所以排除硬件问题。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得口令一哥///
开发 STM32 的时候,须要串口、调试器等等外接设备来方便调试,可是对于我来说,那一大堆的线实在不够优雅。而通过 USB-DFU 下载程序、USB 虚拟串口打印信息,则只有一根 USB 即可搞定,非常简洁。
可是今天在用 CubeMX 开发 STM32H750VBT 的时候,USB 总是没法被识别。经过了一阵的探索,终于找得到了问题的理由——时钟配置。在此记录一下。
首先我先在网上查找了有关的资料,一般来说,STM32 USB 虚拟串口没法被识别可能有两种情况:
堆栈设置太小,USB 没法完成初始化,在 CubeMX 上设置大一点。
电脑端运用了 USB 分线器,把 USB 直接连接到电脑上。
两种方法我都尝试了,没效。其次我就初始思考,是不是由于 STM32H750 的时钟主频太高了(400MHz),导致时钟出错?其次我就把主频设置为了 100MHz,欸?结果能够了,终于被识别到了。但是把主频设置为 200MHz 就又不行了。可是我用 H7 不就是为了高主频吗?低主频还有什么意义?
进一步我猜想,USB 外设时钟有一个最高限速,说不定只有把 USB 外设时钟限制好就能够了。果真,在网上浏览有关信息的时候看到一篇文章,提到了 USB 时钟频次应该设置为 48MHz,我也才知道了原来 CubeMX 中 STM32H750 还能设置 USB 外设的时钟。
在 Clock Configuration 中配置 USB Clock Mux 为 RC48 ,能够获得精确的 48MHz,否则在其他频次时 USB 初始化会发生错误。
这一点在《STM32H750 Reference Manual》中 P2619 也有说明 ,即 USB OTG 的接收到的时钟应为 48MHz。
在USB设备连上主机以后, 主机检测到D+或D-上的电平变化, 识别出有设备接入。于是开始与从设备的握手过程。
但是我板子上的片上外设比较多,CubeMX生成USB的初始化代码又放在比较靠后的位置,造成USB初始化还未完成,主机已经等待超时,造成握手失败。
将初始化代码前移以后,即可正常工作。
CubeMX生成的代码有坑,不是一次两次了,甚至HAL库自带的初始化代码不能驱动硬件我也遇到过,平常心,问题解决就好
需要学习单片机的朋友 ,做毕业设计的同学,参加竞赛,关注我们,口令一哥,与导师一起学习成长,共同进步,还有更多资料领取。
说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~
-END-
*本文系网络转载,版权归原作者所有,如有侵权请联系删除
学习STM32单片机,绕不开的串口
刚开始学单片机的你,是不是会因用程序把LED点亮而感到高兴,会因用程序把数码管点亮而感到高兴。这是好事,这也是想继续学习下去的动力。
但是数据相关的实验是学习单片机和STM32的一道坎,此时就需要用好本文要说的串口这个调试工具。
串口通信介绍
关于串口通信的介绍,也可以点击阅读之前发的一篇文章。
STM32串口通信基本原理
串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式......这种太过理论了,看似懂了,但又不懂。还是用我笔者自己的话来说吧。
串口通信就是可以把程序在单片机或者STM32芯片中运行的结果发送到电脑的一种通信方式。
如何使用串口通讯,你需要知道的几个重要的知识点:
波特率,数据传输的速度,如上图设置为9600,那么程序中也要设置为9600
硬件连接,接收、发送交叉连接,如上图TxD->RxD,RxD->TxD
停止位
奇偶校验
硬件数据流
其中,后3项一般不需要改变。
学会串口通信能做什么
学过C语言的人都知道,程序开发需要不断调试不断验证。很多的语言编程软件都有很完整的程序调试功能。使用起来很方便。而我们的开发虽然也是用C语言,但我们的程序最终运行的环境不是在我们的开平台而是在真正的硬件系统中运行。这时想要查看程序的运行过程或者结果就不像编程软件那么方便了。
想要解决这个问题,我们这时就可以借助串口通信来把我们需要知道的结果又或者是程序运行的关键步骤发送到电脑上,我们就知道程序在硬件系统中运行是否出现问题。51单片机可以用串口来调试,STM32可以用串口来调试,Linux开发板也是使用串口来调试。
当你学会串口通信时,你可以开始玩WIFI模块、GSM模块、蓝牙模块、GPS模块、以及各种使用串口通信的传感器等等。有能力你还可以编写上位机软件通过串口通信来控制设备。
串口通信需要什么
如果你只有STM32核心板,那么你还需要一个串口转USB模块和一个串口数据接收软件还有几根杜邦线就可以了。
如果你的是比较完整的一款开发板的话,一般都已经带有串口转USB模块,这样使用起来就更简单了。聪明的你是不是发现还缺少了点什么,对。没错因为还缺少了最重要的程序。想要使用串口通信当然还需要写串口通信的程序。
下文就教你如何去用,而不是写。
串口实验
关于串口的实验,之前录过一个基于HAL库来实现的视频,可以点击查看。
STM32打印数据到串口助手
而下文中的实验基于标准库实现的,与HAL相比思路是一样的。
在做一个实验时,最好把这个实验分割成几个关键的步骤,这样做的好处就是可以清晰的知道自己需要做什么,以及做完了哪些。还有哪些还没做。
下面把串口实验分成几个关键的步骤:1)串口通信使用到的GPIO引脚配置 STM32F103系列的芯片一般都有三个串口以上,用来调试使用的串口一般都是使用USART1。其他的串口配置都是一样的。
下面这段就是串口配置的程序:
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.10
串口使用的的GPIO口是PA9和PA10,所以只需配置这两个IO口的输入输出模式就可以了。
2)串口主要参数设置(直接看程序)
USART_InitTypeDef USART_InitStructure;//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据格式,8位USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
串口参数配置无非就是配置串口的波特率、数据格式、停止位、奇偶校验、硬件流、收发模式。除了波特率需要改变其他的参数都不需要管。直接复制拿来用。
3)串口中断配置 串口如果使用中断接收,那么就需要配置串口的中断参数,配置项无非就是配置那个的中断源和中断的优先级。
NVIC_InitTypeDef NVIC_InitStructure;//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
4)串口使能 就是你需要什么时候开始使用串口功能,就是一句原有的函数。
USART_Cmd(USART1, ENABLE); //使能串口1
5)编写串口中断处理函数 使用库函数开发,所有的中断函数都是已经存在的,只是中断函数里面没有处理任何事情而已。中断函数如下:
完整的串口中断函数:
void USART1_IRQHandler(void){int Res=0; //定义一个变量用来接收串口数据集if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 USART_SendData(USART1,Res ); //把接收到的数据通过串口1发送出去 }}
串口数据的接收和发送的函数都是库函数提供的,想用时只需找到它直接拿来用就可以了。
6)实验现象
把程序编译烧写到STM32然后用串口转USB模块连接到电脑,在串口调试工具设置好波特率,打开串口。正常的话,那发送什么到STM32单片机,串口工具上就会收到什么。
总结
以上就完成了一个最简单的串口实验。
本文章主要是说明串口的重要性,用来调试程序很方便。
~END~
文章转载,侵删!
相关问答
51 单片机 烧录检测 不到串口 ?烧录时检测不到串口有以下几种可能性:1、下载模块没有加载驱动程序。2、下载工具软件没有选对串口号。3、下载模块损坏。为了保证成功下载,还需要注意引脚...
单片机 在电脑上无法识别怎么处理 接口是USB的-ZOL问答而单片机不属于通用设备,所以,您必须安装对应的设备驱动才能识别。1.一般单片机都是用并口或串口连接的,USB的程序控制不如它们,这也是现在USB横行却始终无法完...
没有 单片机 可以安装 串口 驱动吗单片机本身是一种微型计算机,不具备安装驱动的功能。串口驱动是为电脑或其他设备提供与串口通信的能力的软件驱动程序。单片机可以与计算机或其他设备通过串口...
为什么新唐N76E003 单片机 用 串口 烧录不了?我以前写过一篇博客专门研究过。这是地址。http://blog.mangolovecarrot.net/2018/10/24/51/下面是转帖过来的。可以和STC单片机一样使用串口下载吗?答:...
单片机 怎么识别 串口 发送过来的数据?我们知道发送数据的时候有起始位和停止位,接受是不是也有起始位?设置好单片机的工作方式,单片机会自动识别接收到数据的起始位和停止位,你取走的是除掉了起始位和停止位后,真正的数据,而发送时的起始位和停止位也是由单片机...
单片机 的 串口 ,怎样与电脑 串口 联接?-ZOL问答一般单片机由于供电的原因,通常都是TTL的UART电平讯号,需要经过转换IC来提升电平(RS-232),电脑通常都是RS-232的讯号,因此直接把转换后的RS-232跟电脑的RS-232来...
单片机 哪个脚是 串口 ?单片机串行接口简称:串口,是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器...
【在线等】51 单片机 烧写程序时,总是提醒“ 串口 已被其他程序打开或 串口 不存在”怎么办?首先,烧录的时候要确保51单片机为开机状态,51需要转换为机器语言烧录,如果你那块有下载器可以试一试这种原始的方法,不行的话再检查串口和所用串口是否一致,...
【 单片机 的问题】“ 串口 ”和“串行接口”是一回事吗 - 懂得口语中的“串口”多数情况下是指RS232/TTL电平的UART接口,有时候也用来指计算机的COM口(RS232电平的UART接口)。“串行接口”这个概念就广泛的多了,...
单片机 的 串口 电平都是TTL的吗?可以这样认为。SPI、I2C、UART等从单片机输出的都可以认为是TTL电平,对于UART,外接max232等做完RS232接口时,232电平不是TTL。可以这样认为。SPI、I2C、UAR.....