STM32F4全速USB虚拟串口VCP程序裁剪教程
奋斗STM32开发板Tiny NRF24L01转USB虚拟串口例程手册
奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验NRF24L01+转 USB 虚拟串口实验实验平台:奋斗版STM32开发板Tiny 实验内容:板子通过USB加电后,先向串口1输出一串测试数据,然后USB被PC识 别出来,虚拟出一个串口号给这个USB设备,此时可以通过在PC端的串口助手类 软件选择该串口号。
进入串口软件界面,可以通过软件无线收发一帧长度最长 为32字节的数据。
该例程可以和V3及MINI板的NRF24L01 UCGUI例程配合使用。
预先需要掌握的知识 2.4G通信模块NRF24L01 1. 产品特性2.4GHz 全球开放ISM 频段,最大0dBm 发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9 1.9~3.6V 低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125 频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等, NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口, 便于使用低成本单片机。
便于开发:由于链路层完全集成在模块上,非常便于开发。
自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC 检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM 间距接口,便于嵌入式应用2.基本电气特性淘宝店铺:1奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验3. 引脚定义:4.工作方式NRF2401有工作模式有四种: 收发模式 配置模式 空闲模式 关机模式 工作模式由CE 和寄存器内部PWR_UP、PRIM_RX 共同控制,见下表:淘宝店铺:2奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验4.1 收发模式收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种,收发模式由器件配置字决定,具体 配置将在器件配置部分详细介绍。
stm32f042usb编程 -回复
stm32f042usb编程-回复开发板介绍:STM32F042是STMicroelectronics的一款基于ARM Cortex-M0内核的32位微控制器。
它集成了多种功能,适用于各种应用领域,包括消费电子、工业控制和汽车电子等。
为什么选择STM32F042:首先,STM32F042具有出色的性能和低功耗特性,能够满足各种应用的需求。
其次,它拥有丰富的外设,包括多个串口、定时器、ADC和USB功能等,可以满足不同应用的要求。
此外,ST 公司还提供了强大的软件开发环境和丰富的开发工具,使得开发者能够更加便捷地进行开发。
USB编程介绍:USB(Universal Serial Bus)是一种常见的用于连接计算机和外围设备的接口标准。
在STM32F042中,USB功能使得开发者能够实现与计算机的通信,从而实现不同应用的交互功能。
通过USB编程,我们可以实现从主机到设备的数据传输、设备的配置和控制等功能。
步骤一:环境准备在开始USB编程之前,我们需要准备好相应的开发环境。
首先,我们需要安装Keil MDK软件,该软件是一款专为ARM Cortex-M微控制器设计的集成开发环境。
其次,我们需要安装ST的CubeMX软件,它提供了图形化界面,使得配置和生成代码更加方便。
最后,我们需要准备一个STM32F042开发板,并连接到电脑上。
步骤二:配置CubeMX打开CubeMX软件,选择STM32F042微控制器,并设置相应的时钟和外设配置。
在外设配置中,我们需要使能USB功能,并选择相应的USB 类型。
在这个例子中,我们选择的是USB CDC(虚拟串口)类型。
步骤三:生成代码在配置完毕后,点击生成代码按钮,CubeMX将会自动为我们生成所需的初始化代码。
这些代码将包含USB相关的初始化和处理函数,以及其他必要的功能代码。
将这些代码导入到Keil MDK中进行进一步的开发。
步骤四:编写主机代码在Keil MDK中,我们需要编写主机端的代码,以实现与设备的通信功能。
奋斗STM32开发板Tiny NRF24L01转USB虚拟串口例程手册
奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验NRF24L01+转 USB 虚拟串口实验实验平台:奋斗版STM32开发板Tiny 实验内容:板子通过USB加电后,先向串口1输出一串测试数据,然后USB被PC识 别出来,虚拟出一个串口号给这个USB设备,此时可以通过在PC端的串口助手类 软件选择该串口号。
进入串口软件界面,可以通过软件无线收发一帧长度最长 为32字节的数据。
该例程可以和V3及MINI板的NRF24L01 UCGUI例程配合使用。
预先需要掌握的知识 2.4G通信模块NRF24L01 1. 产品特性2.4GHz 全球开放ISM 频段,最大0dBm 发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9 1.9~3.6V 低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125 频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等, NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口, 便于使用低成本单片机。
便于开发:由于链路层完全集成在模块上,非常便于开发。
自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC 检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM 间距接口,便于嵌入式应用2.基本电气特性淘宝店铺:1奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验3. 引脚定义:4.工作方式NRF2401有工作模式有四种: 收发模式 配置模式 空闲模式 关机模式 工作模式由CE 和寄存器内部PWR_UP、PRIM_RX 共同控制,见下表:淘宝店铺:2奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验4.1 收发模式收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种,收发模式由器件配置字决定,具体 配置将在器件配置部分详细介绍。
利用STM32CUBE创建一个虚拟串口
利用STM32CUBE创建一个虚拟串口由于现在的PC机大多都没有串口了,但PC机上的很多应用程序却使用串口,为了让PC机与STM32处理器进行通信,可以让STM32处理器,以串行方式与外界进行通信,再用CH340等芯片,实现USB转串口的功能,实现虚拟串口。
不过这样做需要额外的芯片和相关电路,不很理想。
利用STM32处理器自身的USB功能,就可以实现虚拟串口。
由于USB是一个很复杂的东西,所对应的代码很多,如果采用操作寄存器或标准库的方式,都要编写很多代码,也容易出错,而采用STM32CUBE就方便多了。
首先要利用STM32CUBE,选择芯片,比如芯片型号为STM32F103ZET6,如下图所示:然后在Pinout选项页中,先选择“RCC”项,按下图设置:再选择“USB”选项,按下图设置:这一步的最后再选择“USB_DEBICE”,按下图设置:下面要设置时钟,进入“Clock Configuration”选项页,按下图设置:请注意:上图的设置必须保障给USB模块的时钟信号是精准的48MHz,不允许有偏差。
然后进行工程设置,点击菜单项“Porject→Settings...”,这时将弹出一个对话框窗口如下:在该对话框窗口上,输入工程名、工程存放的文件夹、所用的开发工具之后,点击“OK”按键,关闭该对话框。
最后点击菜单项“Porject→Generate Code”,生成工程。
本人用的开发工具是IAR,打开该工程,如下图所示:这个工程已经包含了不少文件,建立了基本的程序框架和初始化代码,只要进一步添加应用程序代码就可以了。
下面将围绕虚拟串口进一步编写程序:在这个工程中,有一个“usbd_cdc_if.c”文件,进行USB虚拟串口进行数据的发送和接收时,首先要在usbd_cdc_if.c文件中修改“APP_RX_DATA_SIZE”、“APP_TX_DATA_SIZE”两个宏,它们用于数据的接收和发送缓冲区的大小;然后要声明一个结构体(并初始化),其代码如下:USBD_CDC_LineCodingTypeDef LineCoding = { 115200, /*baud rate*/ 0x00,/*stop bits - 1*/ 0x00, /*parity - none*/ 0x08, /*nb. of bits 8*/ };这段代码用于指示串口的基本设置。
stm32f042usb编程 -回复
stm32f042usb编程-回复stm32f042是一款由意法半导体(STMicroelectronics)公司推出的32位ARM Cortex-M0微控制器,专门用于USB通信应用的开发。
本文将从基础知识开始,一步一步回答有关stm32f042usb编程的问题,旨在帮助读者了解如何使用stm32f042进行USB通信的开发。
首先,我们需要了解一些基础知识。
USB(Universal Serial Bus)是一种用于连接计算机与外部设备的通用接口标准,它能够提供高速、可靠的数据传输。
stm32f042具有内置的USB硬件,可支持USB设备和USB主机功能。
对于USB设备通信开发,stm32f042可以作为USB设备,与主机进行通信。
一、开发环境搭建1. 在PC上安装Keil MDK开发工具。
Keil MDK是一种基于ARM Cortex-M处理器的嵌入式软件开发环境,提供了丰富的开发工具和库函数。
2. 在Keil MDK中创建一个新的工程,并选择stm32f042芯片型号。
3. 配置工程的编译选项和链接选项,使之与stm32f042芯片匹配。
4. 编写应用程序代码,实现USB设备通信功能。
二、USB设备初始化1. 在应用程序的主函数中,调用USB设备初始化函数。
该函数会初始化USB硬件并配置相关寄存器。
2. 配置USB设备的功能描述符。
功能描述符是一组数据结构,用于描述设备所支持的功能和特性。
3. 配置USB设备的端点。
端点是USB通信的基本单位,用于发送和接收数据。
4. 启动USB设备。
使能USB硬件,并设置USB设备状态为“已连接”。
三、USB设备事件处理1. 在应用程序中,通过中断或轮询方式检测USB设备事件的发生。
2. 根据事件类型,执行相应的处理函数。
例如,当检测到USB设备启动事件时,执行设备初始化函数。
3. 在处理函数中,根据具体的应用需求,执行相应的操作。
例如,当检测到USB设备接收到数据时,执行数据处理函数。
STM32CubeF4使用入门
UM1730STM32CubeF4使用入门山西大学电子信息工程系王晓峰Wangxiaofeng@引言STMCube是由意法半导体原创倡议,旨在通过减少开发负担,时间和费用来为开发者提供轻松的开发体验。
STMCube覆盖了STM32全系列。
STM32Cube版本1.x包括:1、STM32CubeMX,一个图形软件配置工具,允许通过图形化向导来生成C初始化代码。
2、一个广泛的嵌入式软件平台,按照产品系列提供(例如STM32CubeF4对应STM32F4系列)。
此平台包括STM32Cube HAL(一个STM32的硬件抽象层,确保STM32之间最大的可移植性),再加上配套的中间件(RTOS,USB,TCP/IP和图形)。
所有嵌入式软件组件都提供完整的例程。
本用户手册描述了如何开始使用STM32CubeF4固件包。
第一部分,描述了STM32CubeF4固件包的主要特性,STMCube的首创倡议。
第二部分和第三部分提供了一个STM32CubeF4架构概览和固件包结构。
1STM32CubeF4主要特性STM32CubeF4集合了所有开发STM32F4应用嵌入式软件组件。
依照STMCube倡议,这些组件具有高度的可移植性,不止在STM32F4系列中,也包括所有STM32系列。
STM32CubeF4高度兼容STM32CubeMX,STM32CubeMX允许用户生成初始化代码。
包内包括一个底层硬件抽象层(HAL),HAL覆盖了微控制器硬件,集成了广泛的例程,可运行在意法半导体的开发板上。
为了用户便利,硬件抽象层为开源BSD许可协议。
STM32CubeF4包含了一套中间件组件,带有对应的例程。
它们具有非常自由的许可证条款:1、CMSIS-RTOS贯彻了FreeRTOS的开源解决方案2、TCP/IP协议栈基于开源的LwIP解决方案3、FAT文件系统基于开源的FatFs解决方案,支持NAND闪存访问4、完整的USB主从设备协议栈支持。
STM32的USB虚拟串口设计
STM32的USB虚拟串口设计题目, 基于STM32的USB虚拟串口学院,专业,姓名,学号,指导老师,完成时间, 2014年5月19 日河南城建学院本科毕业设计(论文) 中文摘要摘要USB接口由于支持热插拔和标准统一等特点得到了广泛应用,越来越多的电脑设备开始采用USB接口进行数据的传输,而如何在不改变现有应用软件的情况下,将设备移植到USB接口成为人们研究的热门。
论文以USB通信设备类中的抽象控制模型为基础,研究了通信设备类及实现虚拟设备的原理,设计并实现了基于通信设备类的虚拟串口驱动程序。
论文研究设计了基于通信设备类的虚拟串口驱动程序的结构和实现方案,程序主要由通信命令转换和数据传输两部分构成,通信命令转换符合通信设备类中抽象控制模型的规范,数据传输部分对现有虚拟串口的实现技术进行了改进。
论文的主要工作如下:1) 研究了USB协议的请求和传输模式,分析了通信设备类实现虚拟设备的方案。
2) 给出了一种符合通信设备类中抽象控制模型的虚拟串口实现方案。
该方案提供了一种基于通信设备类开发虚拟设备的模板,对设计中的诸多问题进行了详细的说明,并改进了虚拟串口驱动程序中数据的处理流程。
3) 将改进后的数据处理流程应用于虚拟串口的实现中,生成了一种基于通信设备类的稳定、高速的虚拟串口。
最后,在串口测试软件下对虚拟串口驱动程序进行了测试,达到了预期目标。
关键字: 通讯设备类;枚举过程;虚拟串口程序;抽象控制模型河南城建学院本科毕业设计(论文) 英文摘要AbstractUSB interface supports plug and play which has unified standards, so it has a wide range of applications. More and more computer device use USB interface to transfer data, so how to make many old deaves to support USB interface without changing current application is becoming the hot field.USB Communication Device Class and it's abstract control model are studied, principles of Communication Device Class and implementation techniques of abstract device are also analyzed in the thesis. On the basis of this, design and implementation of virtual serial port driver based on Communication Device Class are given.The overall structure and implementation scheme of virtual serial port driver based onCDC are designed. The virtual serial port driver is made up of two parts which are communication command transfer module and data transmission module. The communication command transfer module satisfiesthe specification of abstract control model, and the data transfer part improves the technique of current virtual serial port. The main works in the thesis are as follows:1) The request and transfer model for USB protocol are studied, and the implementation techniques of virtual serial port are analyzed.2) The implementation scheme of virtual serial port driver that satisfy abstract control mode in CDC is graven. A new template for the development of virtual serial port basedon CDC is broughtout, and it describes some issues for the virtual serial port driver in details, at the same time, the processing steps for virtual serial port driver is improved. 3) The improved data processing steps for virtual serial port driver is applied in the implementation of ritual serial port driver, and a stable, high-speed virtual serial portis made. At last, the testfor the virtual serial port driveon ActiveSync is given, and thetest result show that it's function is achieved the requirement goals.Keywords: Communication Device Class ;Enumeration Process;Virtual Serial Port Driver ;Abstract Control Model1河南城建学院本科毕业设计(论文) 英文摘要目录摘要...................................................................... .................................. 错误~未定义书签。
STM32开发入门教程
STM32 开发入门教程(一) 开发环境建立及其应用入门准备:我们常用的STM32 开发编译环境为Keil 公司的MDK (Microcontroller Development Kit) 和IAR 公司的EWARM.在这里我们提供了比较稳定的新版本编译软件下载: MDK4.10限于篇幅, 在我们的教程里面将先以MDK 下的一个例子来介绍如何使用MDK 进行嵌入式应用开发.MDK 安装与配置:基于MDK 下的开发中基本的过程:(1) 创建工程;(2) 配置工程;(3) 用C/C++ 或者汇编语言编写源文件;(4) 编译目标应用程序(5) 修改源程序中的错误(6) 测试链接应用程序----------------------------------------------------------------(1) 创建一个工程:在uVision 3 主界面中选择"Project" -> "New uVision Project" 菜单项, 打开一个标准对话框选择好你电脑中的保存目录后, 输入一个你的工程名字后点确认.我们的工程中建了一个名字叫"NewProject" 的工程.从设备库中选择目标芯片, 我们的MINI-STM32 开发板使用的是STM32F103V8T6, 因此选中STMicrocontroller 下对应的芯片:ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 64kB Flash, 20kB SRAM,PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock,Nested Interrupt Controller, Power Saving Modes, JTAG and SWD,3 Synch. 16-bit Timers with Input Capture, Output Compare and PWM,16-bit 6-ch Advanced Timer, 2 16-bit Watchdog Timers, SysTick Timer,2 SPI, 2 I2C,3 USART, USB 2.0 Full Speed Interface, CAN 2.0B Active,2 12-bit 16-ch A/D Converter, Fast I/O Ports选择完芯片型号后会提示是否在目标工程中加入 CPU 的相关的启动代码, 如下图所示. 启动代码是用来初始化目标设备的配置, 完成运行的系统初始化工作, 因此我们选择 "是" , 这会使系统的启动代码编写工作量大大减少.----------------------------------------------------------------(2) 配置工程:选择菜单中 "Project" -> "Option for Target" 或者选择快捷菜单中的图标:因为 MINI-STM32 开发板上使用的就是 8M 的晶振且是使用的片内的 RAM 和 ROM 因此"taget" 下我们都可以使用默认的配置;在"Output"菜单下我们需要选中 "Creat Hex File" 来生成编译好的工程代码, 此工程可以通过仿真器或者串口 ISP 烧录进开发板中.注: ISP 烧录过程我们将在入门教程二中给大家介绍."Listing" "User" 菜单中我们保持默认即可."C/C++" 菜单为我们常用的菜单, 这里简单的介绍下他们的具体功能:PreProcesser Symbols 中的 Define, Undefine 菜单表示是工程的宏定义中的变量, 我们将在今后的教程中详细介绍这个功能.Optimization 为优化选项, Level0 为不优化, 这种模式最适合调试, 因为不会优化掉代码, 基本每个用到的变量都可以打断点. Level3 为优化等级最高, 最适合生产过程中下载到芯片中的代码.Include Path 为工程中的包含路径, 一般需将 .h 文件或者库文件的地址配置进去."Asm" 和 "Link" 将在今后的高级教程中介绍."Debug" 为我们调试使用的配置选项, "Use Simulator" 为使用软件仿真. 这里根据大家手里的仿真器来选择配置环境.如果你使用的是 Ulink, 那么就选择 "Ulink Cotex Debug", 如果你选择的是 JLINK, 那么就选择 " Cotex M3 Jlink", 如果你使用的是 ST 公司出的简易仿真器 ST-Link , 那么你就选择 "ST-Link Debug".注意: 右边当中的选项 "Run to main{}" 选项如果勾上就表示仿真时进入了就会进入到main 函数, 如果没有选上就会进入初始地址, 你需要自己打断点运行到你的主程序 main 处.当插上仿真器后选择上面右图中的 Setting 后会跳出一个仿真器的配置菜单. 左边会自动识别出你的仿真器的信息.如下图为 ULINK2 的信息:对于 SWJ 选项为三线制调试, 将在后面的高级教程中介绍.右下方有两个选项:"Verify Code Download" : 表示下载后校验数据"Download to flash": 表示当仿真的时候先将目标代码下载到 Flash 中.Trace 菜单为跟踪配置, 可以实时的将一些变量使用曲线的形式实时表示出来, 我们将在今后的高级教程中介绍这一项功能.注意: 市面上目前的盗版 Ulink2 不支持这项功能, 正版的支持, Jlink 也不支持这项功能."Flash Download" 菜单用来配置使用仿真器程序下载的配置选项, 大家务必选择好和你芯片配套的选项. 如果你是使用的别人模板下修改为你的工程, 这个选项请注意一下, 如果不正确将不能将你的代码下载到芯片中.配置好 "Debug" 后, 那么 "Utilities" 可以不用配置.如果你使用的是仿真器仿真, 在你已经正确得将目标板和仿真器建立了物理连接后, 请选择正确的仿真器进行配置.(二) ISP 在线下载程序ISP:in system programming简介:ISP: 用写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统;应用场合: 1,ISP 程序升级需要到现场解决,不过好一点的是不必拆机器了;ISP的实现一般需要很少的外部电路辅助实现,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
VCP例程用于数据传输时丢失数据的处理
VCP 例程用于数据传输时丢失数据的处理问题: 问题:ST 的 USB 固件库 某客户工程师在其产品的设计中,使用了 STM32F205VET6。
据其工程师讲述:他使用 STM32F205VET6 中的 VCP 例程来实现虚拟串口的功能,但是他发现虚拟串口一次输出的数据(从串口到上位机)如果 超过 2Kbytes 就会造成数据丢失,只输出尾部的 2Kbytes。
客户工程师检查代码发现 USB 的 FIFO 大小 由宏定义 APP_RX_DATA_SIZE 决定,而 APP_RX_DATA_SIZE 的大小刚好为 2Kbytes。
所以他认为此 FIFO 设计太小而造成的,于是他将 FIFO 的大小改成 5Kbyte,不过修改后并不能解决问题。
调研: 调研:1. 打开“STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library (UM1021)” 库里边的 VCP 例程,位于“...\STM32_USB-HostDevice_Lib_V2.1.0\Project\USB_Device_Examples\VCP”中。
对其进行测试,并没有出现所说的问 题,APP_RX_DATA_SIZE 的大小仍然为 2Kbytes,不管传输的数据是 2Kbytes 还是 5Kbytes 甚至是 25Kbytes,完全没有问题。
2. 了解客户程序 UART 所设置的波特率,为 115200,与原 VCP 例程一致。
USB 采用的是 Full Speed, 全速 USB 总线的帧周期为 1ms。
3. 在 usbd_conf.h 中可以看到 APP_RX_DATA_SIZE 的定义在这里,为 2048,它定义了 APP_Rx_Buffer 的大小。
APP_Rx_Buffer 其实是一个循环缓冲区,APP_Rx_ptr_in 指明了其数据进来的位置,当 USART 接收到数据时,将数据存储于 APP_Rx_ptr_in 指定的位置;APP_Rx_ptr_out 指明其数据取出 的位置,当 USB 到 FIFO 中取出数据时,起始地址由 APP_Rx_ptr_out 决定。
STM32F4 UCOS开发手册
6
UCOS 开发手册
ALIENTEK 探索者 UCOSII/III 开发教程
4、将所有文件添加到工程中 我们前面只是将所有的文件添加到工程目录的文件夹里面,还没有将这些文件真正的添加 到工程中,我们在工程分组中建立三个分组:UCOSII-CORE、UCOSII-PORT 和 UCOSII-CONFIG。 建立完成后如图 1.2.5 所示。
图 1.2.6 添加完成后的工程
7
STM32F4 UCOS 开发手册
图 1.2.3 CONFIG 文件夹内容 4、向 PORT 文件夹中添加文件 我们需要向 PORT 文件夹中添加 5 个文件:os_cpu.h、os_cpu_a.asm、os_cpu_c.c、os_dbg.c 和 os_dgb_r.c。这五个文件可以从本实验的 PORT 文件夹中拷贝到自己的 PORT 文件夹中,拷 贝完成后如图 1.2.4 所示。
图 1.1.2 UCOS II 源码文件。
4
STM32F4 UCOS 开发手册
ALIENTEK 探索者 UCOSII/III 开发教程
图 1.1.2 中 Doc 文件夹下面是一些关于 UCOS II 的文档,Source 文件夹就是 UCOS II 的源 码。
1.2 UCOS II 移植
1) 向工程中添加相应文件 1、建立相应文件夹 我们在工程目录下新建 UCOSII 文件夹,并在 UCOSII 文件夹另外中新建三个文件夹: CONFIG、CORE 和 PORT,如图 1.2.1 所示。
图 1.2.1 新建 UCOSII 文件夹及其内部文件夹 2、向 CORE 文件夹中添加文件 在 CORE 文件夹中我们添加 UCOSII 源码,我们打开 UCOSII 源码的 Source 文件夹,里面 一共有 14 个文件,除了 os_cfg_r.h 和 os_dbg_r.c 这两个文件外我们将其他的文件都复制到我们 工程中 UCOSII 文件夹下的 CORE 文件中,如图 1.2.2 所示。
stm32教程
stm32教程
以下是一份 STM32 的基础教程,无标题且文中没有重复的文字。
STM32 是一系列由意法半导体(STMicroelectronics)公司推
出的 32 位单片机系列产品。
它基于 ARM Cortex-M 内核,提
供了强大的计算能力和丰富的外设功能。
本教程将介绍如何开始使用 STM32,并带领你逐步了解其基
本使用方法。
首先,你需要准备以下材料:
1. 一块 STM32 开发板
2. 一根 USB 数据线
3. 一台计算机
接下来,我们将逐步进行以下步骤:
1. 安装 STM32 相关软件开发工具,如 Keil MDK 或者
STM32Cube IDE。
2. 连接开发板和计算机,使用 USB 数据线将它们连接起来。
3. 打开开发工具,并创建一个新的工程。
4. 设置工程的参数,包括选择正确的目标芯片型号和调试接口。
5. 在工程中编写并调试代码,以实现你想要的功能。
在编写代码的过程中,你可以调用 STM32 提供的丰富的函数
库,如 GPIO 控制、串口通信、定时器和中断等。
这些函数库
可以帮助你更快速地实现你的应用需求。
在实际应用中,你可以根据具体需求,使用外部传感器、执行器等硬件组件。
通过 STM32 的外设功能,你可以方便地与这
些硬件组件进行通信和控制。
总结起来,STM32 是一款功能强大的 32 位单片机,它的灵活
性和丰富的外设功能使得它成为了嵌入式系统开发的理想选择。
通过本教程,你将能够快速上手 STM32 开发,并能够独立完
成自己的项目。
USB-CDC虚拟串口(VCP)收发数据
USB-CDC虚拟串口(VCP)收发数据用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。
此功能方便用来作为程序的调试输出到电脑查看。
所用函数描述:(1)USB接口CDC发送数据CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)Buf: 传输的数据指针Len: 传输数据的长度(2)USB接口CDC接收数据CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)Buf: 接收的数据指针,不需处理Len: 接收数据的长度,需要处理示例:(1)打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。
/* USER CODE BEGIN PRIVATE_DEFINES *//* Define size for the receive and transmit buffer over CDC *//* It's up to user to redefine and/or remove those define */#define APP_RX_DATA_SIZE 64 //修改接收数据长度#define APP_TX_DATA_SIZE 64 //修改发送数据长度/* USER CODE END PRIVATE_DEFINES *//* USER CODE BEGIN PRIVATE_VARIABLES *//* Create buffer for reception and transmission *//* It's up to user to redefine and/or remove those define *//* Received Data over USB are stored in this buffer */uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];/* Send Data over USB CDC are stored in this buffer */uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];uint8_t DataLen; //定义接收数据长度变量/* USER CODE END PRIVATE_VARIABLES */(2)修改CDC_Receive_FS ()函数,添加接收数据长度的赋值:static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改!!!return (USBD_OK);/* USER CODE END 6 */}(3)修改main.c文件,先声明外部变量/* USER CODE BEGIN PV */extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量extern uint8_t DataLen; //声明接收数据长度外部变量/* USER CODE END PV */(4)编辑主循环函数,当按下按键时,发送HelloWorld到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64./* USER CODE BEGIN WHILE */uint8_t MyTxData[12] = "HelloWorld\n"; //定义字符串while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键{while(CDC_Transmit_FS(MyTxData, 12)); //发送字符串到电脑HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯HAL_Delay(20);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键 }if(DataLen > 0) //判断是否接收到数据{while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去DataLen = 0; //清除数据长度标记}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。
STM32的USB例程修改步骤
STM32的USB例程修改步骤STM32的USB例程修改步骤以下是将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。
一、usb_desc.c文件根据你程序使用的通信方式修改。
usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC 接口描述符(主要用于实现USB转串口)等。
具体方法可以下载个“电脑圈圈”使用D12编写的例子。
二、Usb_conf.h 文件:1、修改需要处理那些中断CNTR_CTRM处理数据正确传输后控制,比如说响应主机CNTR_DOVRM/* DMA OVeR/underrun Mask */CNTR_ERRM/* ERRor Mask */CNTR_WKUPM 0/* WaKe UP Mask */CNTR_SUSPM/* SUSPend Mask */CNTR_RESETM主要处理USB复位后进行一些初始化任务CNTR_SOFM/* Start Of Frame Mask */CNTR_ESOFM/* Expected Start Of Frame Mask */如:usb_conf.h中的#define IMR_MSK (CNTR_CTRM |CNTR_SOFM | CNTR_RESETM )是决定USB_CNTR寄存器中的那个USB相关中断启动还是屏蔽。
2、根据需要增加端点缓存地址,要根据缓存区的地址修改,防止数据重叠如下为根据每个缓冲区的大小为64字节修改:#define ENDP1_TXADDR (0xC0)#define ENDP1_RXADDR (0xD0)#define ENDP2_TXADDR (0x100)#define ENDP2_RXADDR (0x140)#define ENDP3_TXADDR (0x180)#define ENDP3_RXADDR(0x1C0)3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。
芯达STM32入门系列教程之十四《STM32的USB下载调试》
STM32入门系列教程STM32的USB下载调试Revision 0.01( 2010-08-12) ST官方实际上提供了两种下载方式:串口ISP与USB下载。
之前讲述了串口ISP的下载调试(类似单片机一样),还有一种就是USB方式。
通俗地说,我们可以使用USB接口来下载和调试程序。
熟悉USB的朋友马上反应过来,USB和串口一样,都是串行传送数据。
是的,这两种方式下载,数据的传输方式都是串行,因此速度不可能太快。
事实上,真正的开发,不可能靠ISP来调试。
都是使用JLINK + MDK或者IAR来调试的。
有条件的同学可以购买jlink仿真器。
说了很多闲话,下面开始进入正题。
要进行USB下载,我们需要事先准备的工作如下:1、DfuSe安装软件2、USB下载固件(hex文件)以上这两个均可在芯达stm32光盘中找到。
在光盘的软件工具目录下,可以找到DfuSe_Demo_V2.2.1_Setup.exe;该软件是为了进行USB下载提供一个操作的界面。
USB的固件HEX文件——STM32_USB.hex,可以在目录“芯达STM32出厂HEX文件”中找到。
1. Dfuse软件的安装安装的过程,建议大家不要看一下本教程的一个步骤,安装一下,再看一下教程,再安装。
如此效率比较低。
建议先把教程浏览一遍,人的瞬间记忆能力,在这里足够用了。
遇到没有印象的,再回过头来看教程。
OK,双击DfuSe_Demo_V2.2.1_Setup.exe图标,双击后,会进入如下界面:等待几秒钟,即可进入如下界面:点击下一步NEXT,进入下一界面:此时,选择是否接收协议授权等信息,可暂且不管,直接YES,进入下一界面:此界面最熟悉不过,一般软件都会有,直接Next,进入下一界面:这里需要做一个说明,笔者默认把该软件安装在C盘,如果你想安装在别的盘符,直接点击Browse…,跳出对话框选择即可。
建议默认放在C盘。
以防后续步骤出错。
然后Next。
stm32f4 串口波特率计算
stm32f4 串口波特率计算摘要:1.介绍STM32F4 单片机串口通信基本概念2.讲解STM32F4 单片机中串口波特率计算方法3.分析STM32F4 单片机中串口波特率相关寄存器4.实例说明如何设置STM32F4 单片机的串口波特率5.总结STM32F4 单片机串口波特率计算注意事项正文:一、介绍STM32F4 单片机串口通信基本概念串口通信是一种在电子设备之间传输数据的通信方式,通常用于电子设备之间的数据传输和控制。
STM32F4 单片机是一种高性能的微控制器,具有丰富的外设接口,其中包括串口(USART)接口。
通过串口接口,STM32F4 单片机可以与其他电子设备进行通信。
二、讲解STM32F4 单片机中串口波特率计算方法串口通信中的波特率是指每秒钟传输的字节数,它是衡量通信速度的一个重要参数。
在STM32F4 单片机中,串口波特率的计算方法如下:波特率= 1 / (16 * 波特率系数)其中,波特率系数是一个16 位的值,存放在STM32F4 单片机的usartbrr 寄存器中。
usartbrr 寄存器的有效位数为16 位,前4 位用于存放小数部分,后12 位用于存放整数部分。
三、分析STM32F4 单片机中串口波特率相关寄存器在STM32F4 单片机中,设置串口波特率的寄存器只有一个,即usartbrr 寄存器。
usartbrr 寄存器的结构如下:- 位[15:12]:这些位用于存放波特率系数的小数部分,总共有4 位,可以表示2 的4 次方即16 种不同的值。
- 位[11:0]:这些位用于存放波特率系数的整数部分,总共有12 位,可以表示2 的12 次方即4096 种不同的值。
四、实例说明如何设置STM32F4 单片机的串口波特率以一个实际的例子来说明如何设置STM32F4 单片机的串口波特率。
假设我们需要设置串口波特率为9600,那么我们需要计算波特率系数。
根据上面的公式,可以得到:波特率系数= 1 / (16 * 9600) = 0x0005接下来,我们将波特率系数0x0005 存储到usartbrr 寄存器的相应位中。
STM32MCU串口使用编程步骤
STM32MCU串口使用编程步骤2023-5-10CamusLu串行口是MCU开发过程中的常用部件,下面是使用USART1时编程的步骤;1、首先要配置系统时钟和使能外设时钟:void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);}2、然后需要在I/O口配置函数GPIO_Configuration()中对USART1设置void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;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}3、要在串口初始化函数USART_Config()中添加如下程序:void USART_Config(USART_TypeDef* USARTx,uint32_t BaudRate){USART_ART_BaudRate = BaudRate;//速率9600bpsUSART_ART_WordLength = USART_WordLength_8b;//数据位8位USART_ART_StopBits = USART_StopBits_1;//停止位1位USART_ART_Parity = USART_Parity_No;//无校验位USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式/* Configure USART1 */USART_Init(USARTx, &USART_InitStructure);//将配置好的参数设置到串口USARTx中去/* Enable USART1 Receive and Transmit interrupts */USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //使能接收中断USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);//使能发送缓冲空中断/* Enable the USART1 */USART_Cmd(USARTx, ENABLE);}4、在中断源配置函数中设值串口1中断的优先级void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;设置串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&NVIC_InitStructure);}5、设计发送固定长度数据包函数void USART_OUTCOMMAND(USART_TypeDef* USARTx, uint8_t *Data,unsigned char length){char i=0;USART_GetFlagStatus(USARTx, USART_FLAG_TC);//为了使得第一个字符能被成功发送while(i<length){USART_SendData(USARTx, Data[i]);while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);i++;}}6、再添加USART1的中断服务程序该中断程序是串口接收与发送中断的共用接口程序,如果串口的发送不使用中断最好将串口初始化程序中的USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);//使能发送缓冲空中断这条指令去掉,这样串口发送就不会进入中断,如果这一条没有去掉,服务程序中if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止发送缓冲器空中断,这两条指令必不可少,不然这条程序一直会处于串口发送标志位被使能状态。
STM32F4全速USB虚拟串口VCP程序裁剪教程
这样以后,USB 接收的数据就可以在 app.c 中使用了,这里的接收的数据长度是 根据接收的数据不断清 0,并赋值的,所以可以根据 Rx_Length 大于 0,判断是 否有新的数Байду номын сангаас接收。
进一步下向下读程序,是打开了 USART2 的接收中断,通过 USART2 的接收中断接 收数据,并通过 VCP_DataTx(0,0)进行了数据处理,如下图 usbd_cdc_vcp.c 的 第 366 行到 379 行。
下面主要看看 VCP_DataTx(0,0)是怎么处理的,如下图所示是 usbd_cdc_vcp.c 的第 208 行到 228 行。是将通过 USART2 的中断接收的数据放进 APP_RxBuffer[] 中,这里的数组最大长度是 2048。
(4)主机在成功获取到一个数据包的设备描述符后并且确认无错误后,返回一 个 0 长度的状态数据包给设备。 (5)主机再对设备复位一下,接下来进入到设置地址阶段。 (6)USB 主机发出一个设置地址的请求,地址包含在建立包中。 (7)USB 设备在收到地址后,返回 0 长度的状态包。 (8)主机收到 0 长度的状态包之后,返回一个 ACK。 (9)设备在收到这个 ACK 之后,就可以启用新的地址了。 USB 一直进中断的原因:主机每 1ms 就给设备发送一个 sof,3ms 没反应主机就 挂起。所以一直进中断属于正常现象。
4>C/C++预定义: USE_STDPERIPH_DRIVER,STM32F4XX,USE_STM324xG_EVAL,USE_USB_OTG_FS 5>打开 USB_conf.h 文件,把 #define VBUS_SENSING_ENABLED 封掉,如果我们 不用 VBUS(PA9)。 否则不用封掉。 6>编译,下载,复位板子,并安装虚拟串口驱动(ST 官网上有),上面的步骤完 成后,计算机中的虚拟串口出来。如果不出来很可能是 D+和 D-的连线问题,请 检查下是否需要连接 ESD 和去耦电容。
USB-CDC虚拟串口(VCP)收发数据
USB-CDC虚拟串口(VCP)收发数据USB-CDC虚拟串口(VCP)收发数据用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。
此功能方便用来作为程序的调试输出到电脑查看。
所用函数描述:(1)USB接口CDC发送数据CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)Buf: 传输的数据指针Len: 传输数据的长度(2)USB接口CDC接收数据CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)Buf: 接收的数据指针,不需处理Len: 接收数据的长度,需要处理示例:(1)打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。
/* USER CODE BEGIN PRIVATE_DEFINES *//* Define size for the receive and transmit buffer over CDC */ /* It's up to user to redefine and/or remove those define */ #define APP_RX_DATA_SIZE 64 //修改接收数据长度#define APP_TX_DATA_SIZE 64 //修改发送数据长度/* USER CODE END PRIVATE_DEFINES *//* USER CODE BEGIN PRIVATE_VARIABLES *//* Create buffer for reception and transmission *//* It's up to user to redefine and/or remove those define */ /* Received Data over USB are stored in this buffer */uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];/* Send Data over USB CDC are stored in this buffer */uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];uint8_t DataLen; //定义接收数据长度变量/* USER CODE END PRIVATE_VARIABLES */(2)修改CDC_Receive_FS ()函数,添加接收数据长度的赋值:static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改return (USBD_OK);/* USER CODE END 6 */}(3)修改main.c文件,先声明外部变量/* USER CODE BEGIN PV */extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量extern uint8_t DataLen; //声明接收数据长度外部变量/* USER CODE END PV */(4)编辑主循环函数,当按下按键时,发送HelloWorld到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64./* USER CODE BEGIN WHILE */uint8_t MyTxData[12] = "HelloWorld\n"; //定义字符串while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键{while(CDC_Transmit_FS(MyTxData, 12)); //发送字符串到电脑HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯HAL_Delay(20);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键 }if(DataLen > 0) //判断是否接收到数据{while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去DataLen = 0; //清除数据长度标记}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。
STM32F4xx FPU的设置
#define __CMSIS_GENERIC
/* disable NVIC and Systick functions */
#if defined (ARM_MATH_CM4) #include "core_cm4.h"
中。通过对 256 点三角函数表的查询和插值算法得到任意角度的精确函数值,这就比“原装”的 sin()、cos()
快多了。
当然有些例外的是开发函数 sqrt(),在 arm_math.h 中是这么定义的:
static __INLINE arm_status arm_sqrt_f32(float32_t in, float32_t *pOut)
1.编译控制选项:虽然 STM32F4XX 固件库的例程之 system_stm32f4XXX.c 文件中添加了对应的代 码,但给用户评估使用的 STM32F4-Discovery 例程中却没有,因此 MDK4.23 编写浮点运算程序时,虽然 编译器正确产生了 V 指令来进行浮点运算,但是因为 system_stm32f4XXX.c 文件没有启用 FPU,因此 CPU 执行时只认为是遇到非法指令而跳转到 HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生, 必须要在 system_init()函数里面添加如下代码: /* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整理以上的信息,我们就不难理解以上函数牵扯的功能是,USART2 中断接收的 数据放在 APP_RxBuffer[]中,而又通过 APP_RxBuffer[]发送的 USB 上位机上。
下面继续阅读 usbd_cdc_vcp.c 中的程序,如下图所示是 usbd_cdc_vcp.c 源文件 的第 245 行到 256 行,功能是将 BUF 中的数据通过 USART2 发送到主机 PC。
(4)主机在成功获取到一个数据包的设备描述符后并且确认无错误后,返回一 个 0 长度的状态数据包给设备。 (5)主机再对设备复位一下,接下来进入到设置地址阶段。 (6)USB 主机发出一个设置地址的请求,地址包含在建立包中。 (7)USB 设备在收到地址后,返回 0 长度的状态包。 (8)主机收到 0 长度的状态包之后,返回一个 ACK。 (9)设备在收到这个 ACK 之后,就可以启用新的地址了。 USB 一直进中断的原因:主机每 1ms 就给设备发送一个 sof,3ms 没反应主机就 挂起。所以一直进中断属于正常现象。
上面的 APP_RxBuffer[]是定义的全局变量,这个全局变量到底是干什么的呢, 我们进一步发现 APP_RxBuffer[]在 usbd_cdc_vcp.c 源文件中亦有出现。在 usbd_cdc_vcp.c 源文件中第 624 行到 661 行,阅读这个函数,知道这个函数主 要是将 APP_RxBuffer[]中的数据发送到主机的 IN 端点(关于端点概念不理解的 建议阅读 USB2.0 英文协议)
这样以后,USB 接收的数据就可以在 app.c 中使用了,这里的接收的数据长度是 根据接收的数据不断清 0,并赋值的,所以可以根据 Rx_Length 大于 0,判断是 否有新的数据接收。
2. 如何区分全速设备和高速设备
USB 如何区分低速、全速和高速设备:对于全速和高速设备,上拉电阻是接在 D+ 上;而低速设备则是上拉电阻接在 D-上。
3. USB 枚举过程
(1)USB 主机检测到 USB 设备插入后,对设备复位。 (2)USB 主机对设备发送获取设备描述符的标准请求。 (3)设备收到该请求后,在数据过程将设备描述符返回给主机。
7. STM32F4 的 USB 虚拟串口 Demo 裁剪
下面讲解下如何裁剪 Demo 程序达到如下框图所示功能,就是收发数据都是通过 USB 口。这里主要讲解上位机下发的数据,下位机收到后立马转发到上位机。
想只用 USB,就要把 UART 的中断接收语句 void EVAL_COM_IRQHandler(void)禁 止掉,在 usbd_cdc_vcp.c 文件的最后
进一步下向下读程序,是打开了 USART2 的接收中断,通过 USART2 的接收中断接 收数据,并通过 VCP_DataTx(0,0)进行了数据处理,如下图 usbd_cdc_vcp.c 的 第 366 行到 379 行。
下面主要看看 VCP_DataTx(0,0)是怎么处理的,如下图所示是 usbd_cdc_vcp.c 的第 208 行到 228 行。是将通过 USART2 的中断接收的数据放进 APP_RxBuffer[] 中,这里的数组最大长度是 2048。
以及在 app.c 中声明,
同时修改 usbd_cdc_vcp.c 中 static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)函数,将 Buf 中的数据放入定义的全局数组变量 Rx_Buffer[]中, 并将长度 Len 赋值给全局变量 Rx_Length。
7>记得将 Demo 程序的优化等级改成 None,避免跟踪调试时乱跳。
6. STM32F4 的 USB 虚拟串口 Demo 解析
官方例程用 IAR 打开如上图所示,这里主要关注下 app.c 源文件、stm32fxxx_it.c 源文件、usbd_cdc_vcp.c 源文件和 usbd_cdc_core.c 源文件。 1>App.c 源文件有 main 函数,main 函数主要是 USBD_Init()语句,是对(1)语句里。 2>初始化后,USB 的枚举及传输数据都是在 stm32fxxx_it.c 的中断中发起的。 枚举是在中断和底层驱动及内核中完成的,这里不用管,也不需要改动。 3>对于数据的传输是我们关心的是在 usbd_cdc_vcp.c 中,阅读例程,我们可以 发现,USBD_Init()语句初始化时初始化了两个串口:COM1 和 EVAL_COM1,如下 图 usbd_cdc_vcp.c 的第 106 行到 109 行;其中 COM1 是虚拟出来的串口,即 USART0, 而 EVAL_COM1 是真实存在的 USART2,挂载在 APB1 总线上,详见 stm32f407xx 数 据手册。
而 BUF 数据的来源是哪里呢,我们通过查找是通过 APP_FOPS 结构体和 VCP_fops 结构体衔接在一起的,所以下面的程序来源就 usbd_cdc_vcp.c 源文件中第 69 行到 76 行,关于 VCP_fops 的定义。
以及 usbd_cdc_core.c 的 136 行,将 VCP_fops 和 APP_FOPS 联系到一起,下面 APP_FOPS 都干了些什么?
基于 STM32_USB-Host-Device_Lib_V2.1.0 或 V2.2.0 官方 DEMO 例程的 STM32F4 全速 USB 虚拟串口 VCP 程序裁剪
教程
1. 概述
本文档是基于 STM32_USB-Host-Device_Lib_V2.1.0 官方库中 Device 下 STM32F4 全速 VCP 裁剪的,主要是利用 STM32F4 已有资源,代替 UART 串口,用于和上位 机进行通信,理论最大通信速率是 64*19*8b/1ms=950kbps,这里的 64 是 1 个包 数据量 64 个字节,19 是一帧最大是 19 个包,8 是一个字节 8 位,1ms 是一帧的 时间,详见 USB2.0 英文协议。如果想开发更高速模式下的通信,可以考虑使用 高速模式下的 VCP 通信,本文档也可以作为参考。 以下是列举的准备工作: 1>下载 STM32_USB-Host-Device_Lib_V2.1.0 官方库,同时去 ST 官方下载 UM1021 关于本例程的说明文档。可以在 ST 官方下载,找不到的也可以去 STMCU 论坛搜 索。 2>本文档的图片是基于 IAR6.4 开发环境进行截图。 3>下载 USB2.0 英文协议。需要了解 USB 的枚举,以及 USB 的工作机制,对每次 发起通信都是由主机轮询开始的有清晰的认识,并重点看一下批量传输。有条件 的可以借用 USB480 协议分析仪。 4>阅读 STM32F4 数据手册中关于 USB 的一些寄存器的介绍。
其中在 usbd_cdc_core.c 的 671 到 689 行利用到了 APP_FOPS,通过联系上下文 可 以 知 道 这 个 函 数 是 通 过 usb 的 out 端 点 接 收 主 机 发 来 的 数 据 放 在 USB_Rx_Buffer 中,其中 USB_Rx_Cnt 就是存放在 USB_Rx_Buffer 的数据长度。 因为 VCP_fops 和 APP_FOPS 联系到一起,所以就不难理解上面的 BUF 就是 USB 通过 OUT 端口接收的数据。
4>C/C++预定义: USE_STDPERIPH_DRIVER,STM32F4XX,USE_STM324xG_EVAL,USE_USB_OTG_FS 5>打开 USB_conf.h 文件,把 #define VBUS_SENSING_ENABLED 封掉,如果我们 不用 VBUS(PA9)。 否则不用封掉。 6>编译,下载,复位板子,并安装虚拟串口驱动(ST 官网上有),上面的步骤完 成后,计算机中的虚拟串口出来。如果不出来很可能是 D+和 D-的连线问题,请 检查下是否需要连接 ESD 和去耦电容。
4. STM32F4 的 USB 的中断作用
STM32 的 USB 模块可以产生三种中断:USB 唤醒中断、USB 高优先级中断和 USB 低优先级中断,在 STM32 的参考手册中没有详细说明这三种中断对应哪些事件, 现说明如下: 1)USB 唤醒中断:在中断向量表中的位置是 42。这个中断在 USB 设备从暂停模 式唤醒时产生,唤醒事件由 USB_ISTR 寄存器的 WKUP 位标识。 2)USB 高优先级中断:在中断向量表中的位置是 19。这个中断仅由 USB 同步 (Isochronous)模式传输或双缓冲块(Bulk)传输模式下的正确传输事件产生,正 确传输事件由 USB_ISTR 寄存器的 CTR 位标识。 3)USB 低优先级中断:在中断向量表中的位置是 20。这个中断由所有其它的 USB 事件产生,例如正确传输(不包括同步模式和双缓冲块模式)、USB 复位等,事件 标志位在 USB_ISTR 寄存器中。 在 STM32 的 USB 开发包的例子中包含了上述中断的处理,例如在 USB 扬声器的例 子中,CTR_HP 函数处理 USB 高优先级中断;在所有例子中都有 USB_Istr()函数 处理 USB 低优先级中断。
5. STM32F4 的 USB 虚拟串口 Demo 的使用
1>下载 STM32 的官方例程:STM32_USB-Host-Device_Lib_V2.1.0 2>开发板自己准备,要求 PA11,PA12 连接 D+,D-,PA9 是否连接 VBUS 都可以 3>打开例程: STM32_USB-Host-Device_Lib_V2.1.0\Project\USB_Device_Examples\VCP\EWAR M 里的工程配置 cpu 为 stm32F407IG,
首先了解下 USB 的接收缓冲区,USB_Rx_Buffer[CDC_DATA_MAX_PACKET_SIZE]这 里的 CDC_DATA_MAX_PACKET_SIZE=64,也即是一个包最大的接收量。 再次了解下 APP_Rx_Buffer[APP_RX_DATA_SIZE]的 FIFO 环形缓冲区,这 里,APP_RX_DATA_SIZE=2048,即 2KB 字节,主要用于上发数据: