国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

在EK-STM32F學習套件上實現(xiàn)了USB-DFU設備功能

發(fā)布時間:2009-11-25 15:50    發(fā)布者:STM32
關(guān)鍵詞: 功能 , 設備 , 套件 , 學習
首先在ST官網(wǎng)上下載了STM32USB開發(fā)套件地址:http://www.st.com/stonline/produ ... ro/files/um0424.zip

由于此開發(fā)套件基于ST的官方開發(fā)板,與EK-STM32F的電路有所不同。

比較了一下,不同之處在于
1, 官方的開發(fā)套件使用PD.09作為USB識別使能線,而EK-STM32F使用PD.08。
2, 官方的開發(fā)套件通過PB.09來判斷是否進入DFU模式, 而EK-STM32F的按鍵使用了PD.03和PD.04。
3,  EK-STM32F沒有接外部SPI Flash, 所以只能更新內(nèi)部flash。

因此修改代碼如下:

void DFU_Button_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable GPIOD clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  
  /* Configure PD.04 as input floating (Key push-button on EK-STM32F) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}

u8 DFU_Button_Read (void)
{
  /* Return the value of PD.04 */
  return GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_4);
}

void Set_System(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  FLASH_Unlock();

  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

  /* Enable GPIOD clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  
  /* PD.08 used as USB pull-up --> EK-STM32F */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  USB_Cable_Config (DISABLE);
// SPI_FLASH_Init();
  USB_Cable_Config (ENABLE);
}

void USB_Cable_Config (FunctionalState NewState)
{
  if (NewState != DISABLE)
  {
    GPIO_ResetBits(GPIOD, GPIO_Pin_8);
  }
  else
  {
    GPIO_SetBits(GPIOD, GPIO_Pin_8);
  }   
}

修改后燒入EK-STM32F學習板,果然能識別出一個DFU設備。

請下載移植到EKSTM32F的USB開發(fā)套件后把他們放到同一個目錄下(STM32F10xUSBLib),方法如下:

1)自建一個STM32F10xUSBLib目錄

2)下載這個文件 1.zip (139.44 KB) 并解壓到STM32F10xUSBLib目錄

3)下載這個文件 2.zip (231.04 KB) 并解壓到STM32F10xUSBLib目錄


最終目錄結(jié)構(gòu)應為:
STM32F10xUSBLib
  FWLib
    library
      inc
      src
  USBLib
    demos
      Device_Firmware_Upgrade  本帖介紹的DFU演示軟件
      JoyStickMouse
      Mass_Storage
      Virtual_COM_Port
    library
      inc
      src

在ST官網(wǎng)下載PC端驅(qū)動和應用程序地址:http://www.st.com/stonline/produ ... ro/files/um0412.zip

安裝后運行DfuSeDemo(V2.1),在DFU Device中識別到一個STM Device in DFU Mode設備。

選擇Internal Flash,選擇STM32 USB開發(fā)套件的DFU DEMO中的任意image, 按下Upgrade按鍵。

出現(xiàn)一個對話框:擦除操作失敗

。。。。。。

DFU的代碼我曾經(jīng)在ST的官方開發(fā)板上測試過,沒有出過錯,那么現(xiàn)在的錯誤在哪里呢?

拿了USB分析儀,看USB線上數(shù)據(jù),發(fā)現(xiàn)設備總在某次的DFU_GETSTATUS請求后響應一個STALL信號,導致出錯。

根據(jù)USB DFU協(xié)議(下載地址: http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf), 對DFU_GETSTATUS的響應應該由:bStatus(1byte) + bwPollTimeout(3Bytes,以ms為單位) + bState(1byte) + iString(1byte)組成,但看USB線上數(shù)據(jù),設備的響應為:00 00 00 00 04 00,顯然是要求的Poll Time時間太短,導致設備在擦除flash的等待時間內(nèi)無法響應PC端的又一個請求。

仔細看u8 *GETSTATUS(u16 Length)的代碼:
    case   STATE_dfuDNLOAD_SYNC:
      if (wlength != 0)
      {
        DeviceState = STATE_dfuDNBUSY;
        DeviceStatus[4] = DeviceState;
        if ((wBlockNum == 0) && (Load_Buffer[0] == CMD_ERASE))
        {
          if  (Pointer < 0x800000) /* 64K sectors of SPI Flash */
          {
            DeviceStatus[1] = 0xDC;  /* 1.5 seconds */
            DeviceStatus[2] = 0x05;
            DeviceStatus[3] = 0x00;
          }
                  <=====================此處值得商榷
        }
        else
        {
          DeviceStatus[1] = (wlength >> 8) * 2  ; /* Nb of Pages(of 256 )* 2ms */
          DeviceStatus[2] = 0;
          DeviceStatus[3] = 0;
        }
     
      }
      else  /* (wlength==0)*/
      {
        DeviceState = STATE_dfuDNLOAD_IDLE;
        DeviceStatus[4] = DeviceState;
        DeviceStatus[1] = 0;
        DeviceStatus[2] = 0;
        DeviceStatus[3] = 0;
        
      }
   break;

代碼在分析到當前操作為CMD_ERASE命令時,僅僅對SPI FLASH的操作定義了Poll的時間,而對內(nèi)部flash的操作沒有定義,因此設備直接返回了0。

察看STM32F103的Datasheet:
Page(1KB)erase time 為 Min20ms,  Max40ms
Word programming time 為 Min20us, Max40us


修改代碼如下:
   case   STATE_dfuDNLOAD_SYNC:
      if (wlength != 0)
      {
        DeviceState = STATE_dfuDNBUSY;
        DeviceStatus[4] = DeviceState;
        if ((wBlockNum == 0) && (Load_Buffer[0] == CMD_ERASE))
        {
          if  (Pointer < 0x800000) /* 64K sectors of SPI Flash */
          {
            DeviceStatus[1] = 0xDC;  /* 1.5 seconds */
            DeviceStatus[2] = 0x05;
            DeviceStatus[3] = 0x00;
          }
          else {
            DeviceStatus[1] = 0x28;
            DeviceStatus[2] = 0x00;
            DeviceStatus[3] = 0x00;
          }
        }
        else
        {
//          DeviceStatus[1] = (wlength >> 8) * 2  ; /* Nb of Pages(of 256 )* 2ms */
          DeviceStatus[1] = (wlength >> 8) * 10  ; /* Nb of Pages(of 256 )* 10ms */
          DeviceStatus[2] = 0;
          DeviceStatus[3] = 0;
        }
     
      }
      else  /* (wlength==0)*/
      {
        DeviceState = STATE_dfuDNLOAD_IDLE;
        DeviceStatus[4] = DeviceState;
        DeviceStatus[1] = 0;
        DeviceStatus[2] = 0;
        DeviceStatus[3] = 0;
        
      }
      break;


修改后重新燒錄代碼,重新執(zhí)行Upgrade操作,OK。

至于原先在測試DFU代碼時為何沒有出錯,我認為是因為我剛新?lián)Q了電腦的緣故,PC跑的快了,愿意等待的時間短了。。。。。

DUF搞完,開始考慮image的生成。

PC端的應用程序除了DfuSeDemo,還有個DfuFileManage(V2.1),能將S19,HEX和BIN文件生成DFU文件。


隨便找了個LCD的demo,修改lnkarm_flash.xcl文件如下:
// Code memory in FLASH
-DROMSTART=0x8003000
-DROMEND=0x801FFFF

修改stm32f10x_nvic.h文件對于Vector Table地址的定義如下:
#define NVIC_VectTab_RAM             ((u32)0x20000000)
#define NVIC_VectTab_FLASH           ((u32)0x08003000)

使用IAR生成raw-binary文件。

運行DFU File Manager Generation程序, 選擇Mullti Bin injection,輸入剛才生成的bin文件,選擇地址為0x08003000, 生成OK。

運行DfuSeDemo程序,將剛才生成的DFU文件燒錄到內(nèi)部flash中。

按下Reset按鍵,LCD DEMO程序如愿跑了起來,再次按下Reset按鍵,同時按下KEY3,PC識別到一個DFU設備。

至此,DFU設備在EK-STM32F學習板上移植成功。

最初發(fā)表日期:2008-4-12
本文地址:http://www.qingdxww.cn/thread-5754-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 草逼免费看 | 亚洲国产精品激情在线观看 | 落跑甜心电视剧全集免费观看 | 国产精品成人一区二区三区 | 手机免费看黄色 | 香蕉视频啊啊啊 | 狠狠色丁香久久综合网 | 欧美日韩一区二区在线视频 | 香蕉久久高清国产精品免费 | 中文字幕在第10页线观看 | 国产精品免费看久久久 | 久久国产成人午夜aⅴ影院 久久国产成人精品麻豆 | 国产精品每日更新在线观看 | 华人91视频| 最新理论手机免费看片 | 精品国产一区二区三区不卡蜜臂 | 亚洲欧美激情综合首页 | chainaxxxtube8| 色老二精品视频在线观看 | 五月婷婷六月丁香综合 | 国产免费a视频 | 狠狠色狠狠色综合久久一 | 一本毛片| 日韩国产午夜一区二区三区 | 欧美噜噜| 国产在线一区二区三区 | 国产福利精品在线 | 日韩精品免费视频 | 性欧美大战久久久久久久野外黑人 | 婷婷综合在线观看丁香 | 国产高清视频在线播放 | 国产又湿又黄又硬又刺激 | 亚洲黄色片视频 | 国产一区二区在线观看免费 | 九九热精品免费视频 | 日本高清不卡视频 | 日韩一区二区三区在线播放 | 亚洲swag精品自拍一区 | 人人干综合 | 成人亚洲欧美日韩中文字幕 | 欧美性色黄大片在线观看 |