前言
学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。
示例详解
基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。
本示例所用的最小系统板原理图:
从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
系统时钟树
USB接口配置
USB设备配置(选择DFU)
引脚配置
中断配置(保持默认)
工程代码
在main.c中作如下修改:
给工程加入事先准备好的flash.c及flash.h 两个文件,在usbd_dfu_if.c中加入如下代码:
烧录默认代码,连上电脑可在电脑的设备管理器中可以看到人全学输入设备中可以看到stm Device in Dfu mode设备:
安装好ST在DFU软件(可从文中给定资料下载方法中下载,也可以自行去官网下载),安装过程就不讲了,下面直接讲使用,首先在安装文件夹下找到 DfuFileMgr.exe 运行它用于生成下载所用的 .dfu 文件,具体过程如下:
同样在安装文件夹下找到DfuSeDemo.exe,运行该工具,按下面图中所示步骤操作:
如下图便完成对指定flash(0x08004000)空间的数据编写,实现了基本的DFU功能,要想真正实现DFU功能,还需保证所升级的数据内容在指令的内存空间能被正确执行。
好了,本节内容就先到此,在此我们学习了USB DFU设备的基本使用情况,文中我们将芯片内部flash空间分成三个区,第一个是0-16k ,用于存放Bootloader代码,也就是本文工程代码,第二个是16-56k区间,用于存放app程序,也就是写进去的数据内容,第三个是56-64K区间,未定义其功能。本节主要讲如何用DFU接口,至于怎么编写APP程序,我们到后面章节再讲。
关键字:STM32 基础系列教程 USB_DFU
引用地址:
STM32 基础系列教程 28 - USB_DFU
推荐阅读最新更新时间:2024-11-12 12:39
STM32单片机的BOOT0和BOOT1应用原理
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂
[单片机]
STM32对码盘的正交信号处理
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。 下面是调试OK的代码: void Encoder_Configration(void) { GPIO_InitTypeDef GPIO_InitStruct
[单片机]
STM32 内核复位 与 系统复位 区别及程序实现
1 写在前面 某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。 例子:A系统通过一个IO控制B系统的电源,而这个IO置高时才开启B系统的电源。 正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。 这个时候如果使用常规的复位方式,就会复位IO,不符合要求。如果有一种方式只复位内核而不复位外设就好了。 接下来就介绍两种复位的实现方式。 2 关于复位 说到复位,我们都不会陌生,系统基本都有一个复位按键。 复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。 上面说的复位按键,也就是对应复
[单片机]
STM32 之位带操作
Cortex-M3 支持了位操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。 在 CM3 支持的位带中,有两个区中实现了位带。 其中一个是 SRAM 区的最低 1MB 范围, 0x20000000 ‐ 0x200FFFFF(SRAM 区中的最低 1MB); 第二个则是片内外设区的最低 1MB范围, 0x40000000 ‐ 0x400FFFFF(片上外设区中的最低 1MB)。 这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的 位带别名区 ,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 CM3 使用如下
[单片机]
【菜鸟入门】stm32 之 实时时钟
经过这么10天的瞎搞,我的库已经初具规模了,于是,不用每次都把所有的文件copy过去,直接在Option里面把path给加上就ok了。 RTC的时钟配置,RTC的时间寄存器是2个32位的寄存器,无非就是一个计数器,大概可以这样理解吧,我们先看看时钟吧 RTC的时钟可以从这3路来,我们需要PTCSEL寄存器来进行设置, 上面这个图是摘自李想老师的课件里面的,我觉得这个是做的相对好的! 位了保证RTC正常工作,我们需要在系统断电时,RTC不受影响,当然我们一般都需要接一个Battery,作为rtc的后备电源,这里设计到电源管理,我们先来看看电源管理里面关于rtc的 只要我们把第八位置1我们就可以对其进行正常供电,我
[单片机]
嵌入式stm32学习:DMA-存储到外设
bsp_usart_dma.h #ifndef __USART_DMA_H #define __USART_DMA_H #include stm32f4xx.h #include stdio.h //USART #define DEBUG_USART USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define DE
[单片机]
STM32 USART DMA未知长度的数据接收转发
今天终于实现了,未知长度的数据,串口1接收上位机的指令,串口2转发指令给模块,再接收模块数据通过串口2发送出去。整个串口的收发由DMA完成,运用串口总线空闲中断,这个真的是STM32的内部很好的一个东东,不消耗CPU资源。 憋了我两天了,日思夜想,主要因为我对整个的逻辑开始没认真分析。 程序参考部分http://www.amobbs.com/forum.php?mod=viewthread&tid=5486343&highlight=STM32%E5%AE%9E%E7%8E%B0USART%2BDMA%E6%8E%A5%E6%94%B6%E6%9C%AA%E7%9F%A5%E9%95%BF%E5%BA%A6%E7%9A%
[单片机]
STM32之八定时器中断
STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16 位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM3的通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: 1)16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间
[单片机]