OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 八度空间

STM32 DFU升级APP程序

  [复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-6-6
在线时间
15 小时
发表于 2016-11-1 18:31:47 | 显示全部楼层
请教大神们一个问题  ,STM32 DFU 进入不了APP地址 ,在判断APP地址是否合法 ()if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) 这几句不为真 就直接跳过了 ,我的芯片是STM32F103VET6, RAM是64K 的 我应该怎么改
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-11-2 12:51:12 | 显示全部楼层
zhaoli2009 发表于 2016-11-1 18:31
请教大神们一个问题  ,STM32 DFU 进入不了APP地址 ,在判断APP地址是否合法 ()if (((*(__IO uint32_t*)A ...

if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

这个是我目前跑的,很正常啊,都能跳转过去,你的APP地址是多少?不要超出flash地址范围喔
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-6-6
在线时间
15 小时
发表于 2016-11-2 14:13:41 | 显示全部楼层
八度空间 发表于 2016-11-2 12:51
if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

这个是我目前跑的,很正 ...

因为后面的应用程序很大  我设置的是 0x08004000
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-11-3 08:52:04 | 显示全部楼层
zhaoli2009 发表于 2016-11-2 14:13
因为后面的应用程序很大  我设置的是 0x08004000

应该正常啊,可能不是这里判断的问题,你看看哪里没有配置好,中断偏移量设置了没
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-6-6
在线时间
15 小时
发表于 2016-11-3 09:59:25 | 显示全部楼层
八度空间 发表于 2016-11-3 08:52
应该正常啊,可能不是这里判断的问题,你看看哪里没有配置好,中断偏移量设置了没

dfu程序的起始地址是0x8004000,地址设置如下
keil.png
APP程序是用IAR写的 设置如下
iar1.png iar3.png iar2.png

回复 支持 反对

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2016-11-3 12:14:21 | 显示全部楼层
谢谢楼主分享~~~
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-11-3 12:28:43 | 显示全部楼层
zhaoli2009 发表于 2016-11-3 09:59
dfu程序的起始地址是0x8004000,地址设置如下

APP程序是用IAR写的 设置如下

建议你直接使用库里边的icf文件,直接修改文件里边的ROM空间起始和结束地址就是了,截图是我的
QQ截圖20161103122802.jpg
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-6-6
在线时间
15 小时
发表于 2016-11-3 16:13:57 | 显示全部楼层
八度空间 发表于 2016-11-3 12:28
建议你直接使用库里边的icf文件,直接修改文件里边的ROM空间起始和结束地址就是了,截图是我的

好的 我试试看,
回复 支持 反对

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2016-11-4 10:59:46 | 显示全部楼层
如果发现下载后没有设别USB设备,好像可能是idVendor的原因,可以试着改一下.
回复 支持 反对

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2016-11-4 17:28:58 | 显示全部楼层
本帖最后由 弦子的弦 于 2016-11-4 17:52 编辑

楼主是什么系统,我下载后发现电脑没有识别出相应的设备,是需要额外下载什么驱动么?
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-1-3
在线时间
20 小时
发表于 2017-2-14 09:42:25 | 显示全部楼层
我想问一下楼主,使用了DFU升级程序后还能不能使用USB自定义设备
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-1-3
在线时间
20 小时
发表于 2017-2-14 09:42:36 | 显示全部楼层
我想问一下楼主,使用了DFU升级程序后还能不能使用USB自定义设备
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-2-17 16:52:09 | 显示全部楼层
jiutianlanyue3 发表于 2017-2-14 09:42
我想问一下楼主,使用了DFU升级程序后还能不能使用USB自定义设备

升级和其他没关系,升级是bootloader要干的事情,USB自定义设别是APP的事情,两者没冲突的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2016-12-7
在线时间
43 小时
发表于 2017-2-22 16:44:31 | 显示全部楼层
楼主   你好   请问用过F4的板子实现DFU功能吗?麻烦指导一下,多谢!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-2-23 20:02:40 | 显示全部楼层
橡树 发表于 2017-2-22 16:44
楼主   你好   请问用过F4的板子实现DFU功能吗?麻烦指导一下,多谢!

可以的,和103差不多
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2013-3-2
在线时间
67 小时
发表于 2017-3-1 17:17:56 | 显示全部楼层
不错,学习了。
回复 支持 反对

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-7
在线时间
41 小时
发表于 2017-5-5 23:43:40 | 显示全部楼层
兜兜里缺钱 发表于 2015-7-30 12:59
回复【87楼】Azer:
---------------------------------
我就是把这个函数给改回去了,八度大大是直接返 ...

改MAL_GetStatus,亲测ok,终于可以升级了。不过好像点击离开dfu mode会卡在49%,百度好像大伙都有这问题。现在使用cubemx好像搞不了dfu,不知道为什么,校验不通过。
回复 支持 反对

使用道具 举报

6

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2015-7-2
在线时间
120 小时
发表于 2017-5-15 17:53:52 | 显示全部楼层
楼主,你好!参考你的代码移植到mini板。1、bootloader 设置:
#define ApplicationAddress 0x08010000       
addr.png

2、APP 设置:

1000.png

3、DFU 现象
通过BIN文件生成.dfu文件。
sector.png
success.png
提示升级成功,可是板子复位后并没有跑到APP,if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)这个判断没有通过,没有找到堆栈指针。
然后通过Erase Sector Debug (验证过,这样并不会擦除所有数据)调试bootloader代码,发现0x08010000地址并没有数据。
MRMORY.png

意思是:Upgrade successful,但是固件根本没有写进FLASH。





后面我用移植官方的USB V4.0库移植DFU,也是一样的现象。
请问一下楼主,我是不是缺了哪些东西没有移植到?


rom.png
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-5-15 23:20:23 | 显示全部楼层
zhoutong 发表于 2017-5-15 17:53
楼主,你好!参考你的代码移植到mini板。1、bootloader 设置:
#define ApplicationAddress 0x08010000       

...

你看你写入flash数据那个函数是不是可以用的,不行你得自己写一个可以用的才行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-14
在线时间
12 小时
发表于 2017-8-7 17:00:13 | 显示全部楼层
问下大家  我现在想在自己做的STM32F405上进行试验
好像找不到驱动,在f405上移植需要注意修改那些地方?谢谢了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-14
在线时间
12 小时
发表于 2017-8-7 17:16:30 | 显示全部楼层
八度空间 发表于 2017-5-15 23:20
你看你写入flash数据那个函数是不是可以用的,不行你得自己写一个可以用的才行


问下大家  我现在想在自己做的STM32F405上进行试验
好像找不到驱动,在f405上移植需要注意修改那些地方?谢谢了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-8 08:55:51 | 显示全部楼层
laumou 发表于 2017-8-7 17:16
问下大家  我现在想在自己做的STM32F405上进行试验
好像找不到驱动,在f405上移植需要注意修改那些地 ...

你说的什么驱动?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-14
在线时间
12 小时
发表于 2017-8-8 09:46:58 | 显示全部楼层

USB和下位机无法连接

八度空间 发表于 2017-8-8 08:55
你说的什么驱动?

USB和下位机无法连接 捕获.JPG 无法出现左边你们说的驱动显示图片,STM32F405的移植需要注意下那些地方的更改呢
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-14
在线时间
12 小时
发表于 2017-8-8 09:51:47 | 显示全部楼层
八度空间 发表于 2017-8-8 08:55
你说的什么驱动?

另外下载STM32_DFU_Bootloader的HEX文件时候 boot0  设置为1 boot1设置为0
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-8 18:03:21 | 显示全部楼层
laumou 发表于 2017-8-8 09:51
另外下载STM32_DFU_Bootloader的HEX文件时候 boot0  设置为1 boot1设置为0

不用设置BOOT0和1的,先跳进bootloader(也可以使用芯片内嵌的,这个需要BOOT0的支持)然后耍数据,完成后重启片子就可以了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-14
在线时间
12 小时
发表于 2017-8-16 15:39:14 | 显示全部楼层
八度空间 发表于 2017-8-8 18:03
不用设置BOOT0和1的,先跳进bootloader(也可以使用芯片内嵌的,这个需要BOOT0的支持)然后耍数据,完成 ...

程序跳转已经清楚了 另外STM32F405不需要写usb下的DFU么?还是说F4系列的芯片直接支持?
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-16 20:34:44 | 显示全部楼层
laumou 发表于 2017-8-16 15:39
程序跳转已经清楚了 另外STM32F405不需要写usb下的DFU么?还是说F4系列的芯片直接支持?

USB包里边应该有相关的demo,405没搞过,不清楚,应该和407差不多
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-22 18:05:26 | 显示全部楼层
楼主我这死活都是Unknown Device
快来拯救下我
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-22 18:10:18 | 显示全部楼层
zxd74180 发表于 2017-8-22 18:05
楼主我这死活都是Unknown Device
快来拯救下我

???
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-23 09:29:30 | 显示全部楼层

我用的F103RET6,自己焊的板子没屏,改的中断触发,库用的都是你的。无奈显示不了设备
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-23 09:32:06 | 显示全部楼层
上传不了文件啊。。。..
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-23 09:34:47 | 显示全部楼层
[mw_shl_code=c,true]/**********************************************************

                   STM32 DFU移植实验

**********************************************************/

#include "stm32_config.h"

#include "led.h"
#include "stmflash.h"

#include "hw_config.h"        //USB相关头文件
#include "usb_lib.h"
#include "usb_conf.h"
#include "usb_prop.h"
#include "usb_pwr.h"
#include "dfu_mal.h"

typedef  void (*pFunction)(void);

uint8_t DeviceState;
uint8_t DeviceStatus[6];
pFunction Jump_To_Application;
uint32_t JumpAddress;

/**********************************************************
                           主函数
**********************************************************/
int main(void)
{
        delay_init(72);        //初始化延时函数
        USART1_Init(115200);        //初始化串口1
        DFU_Button_Config();        //初始化跳转APP程序按键
        delay_ms(5000);
        if(((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)        //检测APP地址是否合法
        {
                        //跳转到APP地址开始执行,地址+4位置是复位中断入口
                        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
                        Jump_To_Application = (pFunction) JumpAddress;

                        //设置APP程序堆栈指针
                        __set_MSP(*(__IO uint32_t*) ApplicationAddress);
                       
                        //跳转到APP程序中执行
                        Jump_To_Application();
        }
        while(1)
        {

        }
}
[/mw_shl_code]
这是我的main函数,下面是中断触发:
/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    08-April-2011
  * @brief   Main Interrupt Service Routines.
  *          This file provides template for all exceptions handler and
  *          peripherals interrupt service routine.
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "sys.h"

#include "hw_config.h"        //USB相关头文件
#include "usb_lib.h"
#include "usb_istr.h"
#include "usb_prop.h"
#include "usb_pwr.h"

/** @addtogroup STM32F10x_StdPeriph_Template
  * @{
  */
extern uint8_t DeviceState;
extern uint8_t DeviceStatus[6];

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/

/**********************************************************
* 函数功能 ---> USB低优先级中断处理
* 入口参数 ---> none
* 返回数值 ---> none
* 功能说明 ---> none
**********************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  USB_Istr();
}
/**********************************************************
* 函数功能 ---> USB唤醒中断处理
* 入口参数 ---> none
* 返回数值 ---> none
* 功能说明 ---> none
**********************************************************/
void USBWakeUp_IRQHandler(void)
{
        EXTI_ClearITPendingBit(EXTI_Line18);        //清除USB中断标志
}
/**********************************************************
* 函数功能 ---> 外部中断线0中断处理
* 入口参数 ---> none
* 返回数值 ---> none
* 功能说明 ---> none
**********************************************************/


void EXTI4_IRQHandler(void)
{
                LED_Init();       
                LED0=1;
                delay_ms(2000);
                LED0=0;
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)==0)//读取按键0==0)         //按键KEY0
        {
               
                BEEP_Init();
               
                BEEP=1;
                delay_ms(2000);
                BEEP=0;
        /******************************************************
                              显示基本信息
        ******************************************************/
        printf("==========================================================\r\n");
        printf("                STM32f103 DFU Test!                       \r\n");
        printf("                USB DFU Test v0.1.0                       \r\n");       
        printf("==========================================================\r\n");
       
        //按键已经按下,则进入APP升级模式
        DeviceState = STATE_dfuERROR;
        DeviceStatus[0] = STATUS_ERRFIRMWARE;
        DeviceStatus[4] = DeviceState;
       
        Set_System();
        Set_USBClock();
        USB_Init();
        }         
        EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
}


/**
  * @brief  This function handles NMI exception.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
        /* Go to infinite loop when Hard Fault exception occurs */
        printf("\r\nHardFault_Handler ERROR\r\n");
        while (1)
        {
        }
}

/**
  * @brief  This function handles Memory Manage exception.
  * @param  None
  * @retval None
  */
void MemManage_Handler(void)
{
          /* Go to infinite loop when Memory Manage exception occurs */
        printf("\r\nMemManage_Handler ERROR\r\n");
        while (1)
        {
        }
}

/**
  * @brief  This function handles Bus Fault exception.
  * @param  None
  * @retval None
  */
void BusFault_Handler(void)
{
          /* Go to infinite loop when Bus Fault exception occurs */
        printf("\r\nBusFault_Handler ERROR\r\n");
        while (1)
        {
        }
}

/**
  * @brief  This function handles Usage Fault exception.
  * @param  None
  * @retval None
  */
void UsageFault_Handler(void)
{
        /* Go to infinite loop when Usage Fault exception occurs */
        printf("\r\nUsageFault_Handler ERROR\r\n");
        while (1)
        {
        }
}

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
void SVC_Handler(void)
{
}

/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{
}

/**
  * @brief  This function handles PendSVC exception.
  * @param  None
  * @retval None
  */
void PendSV_Handler(void)
{
}

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
}

/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/

/**
  * @brief  This function handles PPP interrupt request.
  * @param  None
  * @retval None
  */
/*void PPP_IRQHandler(void)
{
}*/

/**
  * @}
  */


/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

/**
  ******************************************************************************
  * @file    hw_config.c
  * @author  MCD Application Team
  * @version V4.0.0
  * @date    21-January-2013
  * @brief   Hardware Configuration & Setup
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */


/* Includes ------------------------------------------------------------------*/

#include "hw_config.h"
#include "dfu_mal.h"
#include "usb_lib.h"
#include "usb_desc.h"
#include "usb_pwr.h"

#include "led.h"        //新增状态指示用


/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ErrorStatus HSEStartUpStatus;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name  : Set_System.
* Description    : Configures Main system clocks & power.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Set_System(void)
{   
        FLASH_Unlock();        //解锁FLASH
  
        /* Init the media interface */
        MAL_Init();
        USB_Cable_Config(ENABLE);
  
        /* Configure the EXTI line 18 connected internally to the USB IP */
        EXTI_ClearITPendingBit(EXTI_Line18);
        EXTI_InitStructure.EXTI_Line = EXTI_Line18;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
}

/*******************************************************************************
* Function Name  : Set_USBClock.
* Description    : Configures USB Clock input (48MHz).
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Set_USBClock(void)
{
        RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);        //USB_CLK = PLLCLK / 1.5 = 72/1.5=48MHz
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);        //启动USB时钟
}

/*******************************************************************************
* Function Name  : Enter_LowPowerMode.
* Description    : Power-off system clocks and power while entering suspend mode.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Enter_LowPowerMode(void)
{
  /* Set the device state to suspend */
  bDeviceState = SUSPENDED;
}

/*******************************************************************************
* Function Name  : Leave_LowPowerMode.
* Description    : Restores system clocks and power while exiting suspend mode.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Leave_LowPowerMode(void)
{
  DEVICE_INFO *pInfo = &Device_Info;

  /* Set the device state to the correct state */
  if (pInfo->Current_Configuration != 0)
  {
    /* Device configured */
    bDeviceState = CONFIGURED;
  }
  else
  {
    bDeviceState = ATTACHED;
  }
  /*Enable SystemCoreClock*/
  SystemInit();
}

/*******************************************************************************
* Function Name  : USB_Cable_Config.
* Description    : Software Connection/Disconnection of USB Cable.
* Input          : NewState: new state.
* Output         : None.
* Return         : None.
*******************************************************************************/
void USB_Cable_Config (FunctionalState NewState)
{
        if(NewState != DISABLE)        LED0= 0;        //USB连接上
        else        LED0 = 1;        //USB断开
}

/*******************************************************************************
* Function Name  : DFU_Button_Config.
* Description    : Configures the DFU selector Button to enter DFU Mode.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void DFU_Button_Config(void)        //初始化升级按键
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟

  //GPIOA.4          中断线以及中断初始化配置  下降沿触发        //KEY0
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
       
          EXTI_InitStructure.EXTI_Line=EXTI_Line4;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

        //初始化中断优先级
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;        //外部中断线4
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* Function Name  : DFU_Button_Read.
* Description    : Reads the DFU selector Button to enter DFU Mode.
* Input          : None.
* Output         : None.
* Return         : Status
*******************************************************************************/
uint8_t DFU_Button_Read (void)        //读取升级按键状态
{
        return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4);  
}

/*******************************************************************************
* Function Name  : USB_Interrupts_Config.
* Description    : Configures the USB interrupts.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void USB_Interrupts_Config(void)        //中断优先级配置
{

  /* 2 bit for pre-emption priority, 2 bits for subpriority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  
  /* Enable the USB interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;        //设置USB低中断优先级
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
    /* Enable the USB Wake-up interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;        //USB唤醒中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* Function Name  : Reset_Device.
* Description    : Reset the device.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Reset_Device(void)
{
  USB_Cable_Config(DISABLE);
  NVIC_SystemReset();
}

/*******************************************************************************
* Function Name  : Get_SerialNum.
* Description    : Create the serial number string descriptor.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Get_SerialNum(void)
{
  uint32_t Device_Serial0, Device_Serial1, Device_Serial2;

  Device_Serial0 = *(uint32_t*)ID1;
  Device_Serial1 = *(uint32_t*)ID2;
  Device_Serial2 = *(uint32_t*)ID3;   

  Device_Serial0 += Device_Serial2;

  if (Device_Serial0 != 0)
  {
    IntToUnicode (Device_Serial0, &DFU_StringSerial[2] , 8);
    IntToUnicode (Device_Serial1, &DFU_StringSerial[18], 4);
  }
}

/*******************************************************************************
* Function Name  : HexToChar.
* Description    : Convert Hex 32Bits value into char.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)
{
  uint8_t idx = 0;
  
  for( idx = 0 ; idx < len ; idx ++)
  {
    if( ((value >> 28)) < 0xA )
    {
      pbuf[ 2* idx] = (value >> 28) + '0';
    }
    else
    {
      pbuf[2* idx] = (value >> 28) + 'A' - 10;
    }
   
    value = value << 4;
   
    pbuf[ 2* idx + 1] = 0;
  }
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-23 09:38:42 | 显示全部楼层
时间效果:中断可以触发,LED闪,蜂鸣器响,之后连接USB,没反应
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-23 09:48:08 | 显示全部楼层
zxd74180 发表于 2017-8-23 09:38
时间效果:中断可以触发,LED闪,蜂鸣器响,之后连接USB,没反应

将相关信息打印到串口
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7206
金钱
7206
注册时间
2016-11-30
在线时间
622 小时
发表于 2017-8-23 14:04:12 | 显示全部楼层
好东西!感谢楼主!
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2017-8-24 15:27:08 | 显示全部楼层
。我的那个识别不了的问题解决了,板子USB模块不一样,换了块板子以后可以了。
PS:版主以后叫呵呵空间好了,一份文档里面全是呵呵,改成哈哈会不会好一点。
诶,你就是调不出来,哈哈哈!!
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-8-29 08:43:58 | 显示全部楼层
mark,谢谢楼主分享
书山有路勤为径,学海无涯苦作舟!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-8-29 09:11:47 | 显示全部楼层
zxd74180 发表于 2017-8-24 15:27
。我的那个识别不了的问题解决了,板子USB模块不一样,换了块板子以后可以了。
PS:版主以后叫呵呵空间好 ...

手贱一打就呵呵,哈哈了


哈哈哈哈哈哈哈哈哈哈
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-10-19
在线时间
56 小时
发表于 2017-9-20 20:18:29 | 显示全部楼层
厉害了
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
金钱
379
注册时间
2017-1-4
在线时间
129 小时
发表于 2017-12-6 14:20:14 | 显示全部楼层
谢谢,学习中
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-4-20
在线时间
10 小时
发表于 2018-4-3 20:36:21 | 显示全部楼层
八度大大 我例程测试  程序下载后电脑只能显示未识别的设备   然后我给那个未识别的设备安装dfu驱动 就变成这个样子了   我可能问题出在哪里了呢,求帮助~~
Snipaste_2018-04-03_20-36-54.jpg
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-12-8
在线时间
14 小时
发表于 2018-4-4 11:18:26 | 显示全部楼层
谢谢分享。。。。。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2018-4-5 18:50:40 | 显示全部楼层
shenlan 发表于 2018-4-3 20:36
八度大大 我例程测试  程序下载后电脑只能显示未识别的设备   然后我给那个未识别的设备安装dfu驱动 就变成 ...

你的什么系统?用兼容模式安装驱动包
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-5-9
在线时间
4 小时
发表于 2018-5-9 17:05:03 | 显示全部楼层
zhoutong 发表于 2017-5-15 17:53
楼主,你好!参考你的代码移植到mini板。1、bootloader 设置:
#define ApplicationAddress 0x08010000       

...

你好,请问你的问题解决了吗?我也遇到了同样的问题,折腾了好久了,谢谢大神。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-6-8
在线时间
10 小时
发表于 2018-6-9 03:24:08 | 显示全部楼层
这个例程。USB拔下的时候系统停止运行,插上又恢复运行了,貌似是进入了低功耗模式能否让他拔下的时候不进入低功耗模式呢?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-6-8
在线时间
10 小时
发表于 2018-6-10 18:02:16 | 显示全部楼层
lz,你的例程下载进去之后USB未插的情况下貌似是进入了低功耗模式,led不闪烁,插上USB后程序恢复运行,拔下后又停止运行了,请问你有没有这种现象?要如何解决呢?我在中断服务函数里也没有发现相关进入低功耗模式的代码
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2018-6-10 21:00:23 | 显示全部楼层
Gscsd 发表于 2018-6-10 18:02
lz,你的例程下载进去之后USB未插的情况下貌似是进入了低功耗模式,led不闪烁,插上USB后程序恢复运行,拔 ...

没有进入低功耗啊,主函数里边控制LED的,这个不重要,重要的是插上USB能用
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-11-26
在线时间
21 小时
发表于 2018-11-26 11:58:41 | 显示全部楼层
楼主威武,顶起来
回复 支持 反对

使用道具 举报

6

主题

36

帖子

1

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2018-12-5
在线时间
4 小时
发表于 2018-12-14 15:11:37 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2018-9-30
在线时间
39 小时
发表于 2019-3-1 14:46:09 | 显示全部楼层
太详细了!我这几天也在做这个。请问您知道USB的下载流程吗,我需要在开始下载和下载结束时加个标志位。
我在usb_prop.c这个文件找了很久也找不到。希望您能指点一二。感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表