第一步
USB_HID移植(原創(chuàng)http://blog.csdn.net/xbl1986/article/details/17577685#comments)
├── STM32_USB_Device_Library USB從設(shè)備庫
│ │ ├── Class
│ │ │ └── hid
│ │ │ ├── inc
│ │ │ │ └── usbd_hid_core.h
│ │ │ └── src
│ │ │ └── usbd_hid_core.c
│ │ └── Core
│ │ ├── inc
│ │ │ ├── usbd_core.h
│ │ │ ├── usbd_def.h
│ │ │ ├── usbd_ioreq.h
│ │ │ ├── usbd_req.h
│ │ │ └── usbd_usr.h
│ │ └── src
│ │ ├── usbd_core.c
│ │ ├── usbd_ioreq.c
│ │ └── usbd_req.c
│ ├── STM32_USB_OTG_Driver USB OTG 庫
│ │ ├── inc
│ │ │ ├── usb_bsp.h
│ │ │ ├── usb_core.h
│ │ │ ├── usb_dcd.h
│ │ │ ├── usb_dcd_int.h
│ │ │ ├── usb_defines.h
│ │ │ └── usb_regs.h
│ │ └── src
│ │ ├── usb_core.c
│ │ ├── usb_dcd.c
│ │ └── usb_dcd_int.c
從層級上分析,OTG是更加底層的,USBD的文件依賴于USB的文件,從對庫的使用來講,這些文件我們都不需要改動(dòng)。
我們需要改動(dòng)的有可能是下面的文件
├── usb_bsp.c
├── usb_conf.h
├── usbd_conf.h
├── usbd_desc.c
├── usbd_desc.h
└── usbd_usr.c
一些邏輯在main.c中操作,考慮如何發(fā)數(shù)據(jù)到主機(jī)端
對于一個(gè)工程來講
├── stm32f4xx_conf.h
├── stm32f4xx_it.c
├── stm32f4xx_it.h
├── system_stm32f4xx.c
這幾個(gè)文件也是從庫里提取出來的,有可能會(huì)改動(dòng)的
STM32F4xx_StdPeriph_Driver 這部分的內(nèi)容基本上從來沒有動(dòng)過,是相當(dāng)?shù)讓拥尿?qū)動(dòng)文件了
│ ├── CMSIS
│ │ ├── Include
│ │ │ ├── core_cm4.h
│ │ │ ├── core_cm4_simd.h
│ │ │ ├── core_cmFunc.h
│ │ │ └── core_cmInstr.h
│ │ └── ST
│ │ └── STM32F4xx
│ │ ├── Include
│ │ │ ├── stm32f4xx.h
│ │ │ └── system_stm32f4xx.h
│ │ └── Source
│ │ └── Templates
│ │ └── arm
│ │ └── startup_stm32f4xx.s
這些文件也是一般不會(huì)去動(dòng)的,.s文件的名字可能有些區(qū)別
下面給出一個(gè)修改過的main.c 內(nèi)容很精簡了
/**
******************************************************************************
* @file main.c
* @author MCD Application Team
* @version V1.0.0
* @date 19-September-2011
* @brief Main program body
******************************************************************************
* @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.
*
*
? COPYRIGHT 2011 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usbd_hid_core.h"
#include "usbd_usr.h"
#include "usbd_desc.h"
/** @addtogroup STM32F4-Discovery_Demo
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma data_alignment = 4
#endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
__IO uint32_t TimingDelay;
/* Private function prototypes -----------------------------------------------*/
static uint32_t Demo_USBConfig(void);
static void Demo_Exec(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
RCC_ClocksTypeDef RCC_Clocks;
/* SysTick end of count event each 10ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
Demo_Exec();
}
/**
* @brief Execute the demo application.
* @param None
* @retval None
*/
static void Demo_Exec(void)
{
uint8_t buf[4];
buf[0]=0;
buf[1]=7;
buf[2]=7;
buf[3]=0;
/* USB configuration */
Demo_USBConfig();
while(1) {
Delay(5);
USBD_HID_SendReport (&USB_OTG_dev,
buf,
4);
}
}
/**
* @brief Initializes the USB for the demonstration application.
* @param None
* @retval None
*/
static uint32_t Demo_USBConfig(void)
{
USBD_Init(&USB_OTG_dev,
USB_OTG_FS_CORE_ID,
&USR_desc,
&USBD_HID_cb,
&USR_cb);
return 0;
}
/**
* @brief Inserts a delay time.
* @param nTime: specifies the delay time length, in 10 ms.
* @retval None
*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/**
* @brief Decrements the TimingDelay variable.
* @param None
* @retval None
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
/**
* @brief This function handles the test program fail.
* @param None
* @retval None
*/
void Fail_Handler(void)
{
while(1)
{
Delay(5);
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
第二步
移植并修改底層文件
先上個(gè)移植完的工程下載地址:
http://download.csdn.net/detail/u013352158/8212365
剛開始打算在discovery板子上移植USB官方庫時(shí)候是想用全速模式的,折騰了半天沒反應(yīng),后來看原理圖時(shí)發(fā)現(xiàn)全速模式的兩引腳接到仿真器上去了,沒辦法只能采用在高速口下配置成全速模式的方法,不過移植起來也算方便,總的來說就三點(diǎn)吧:時(shí)鐘,IO最后就是把該刪的都刪了。
文件結(jié)構(gòu)可以看下面這一篇文章,講的很清楚了,畢竟f4和f1系列USB庫差別挺大的,一開始可能無從下手
http://blog.csdn.net/xbl1986/article/details/17577685#comments
首先是預(yù)編譯指令,有4個(gè):USE_STDPERIPH_DRIVER,STM32F4XX,USE_USB_OTG_HS,USE_EMBEDDED_PHY,前三個(gè)不說了應(yīng)該都看的懂,第四個(gè)有兩個(gè)指令可以選擇,USE_ULPI_PHY是正常的高速模式,stm32要使用高速模式必須外擴(kuò)個(gè)USB3300芯片作為高速USB的物理層,這里我們使用片上內(nèi)置的物理層,所以用的是USE_EMBEDDED_PHY,在高速口下配置成全速模式。
接著是時(shí)鐘,USB時(shí)鐘必須為48M,不同板子外接的晶振不一樣,官方庫里用的是25M的外部晶振,而我們的discovery板子上用的是8M的晶振,需要去system_stm32f4xx.c文件里改下分頻系數(shù),下面就是配置成168M主頻48M的USB時(shí)鐘
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
#define PLL_N 336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7
之后去app.c里找主函數(shù),主函數(shù)很簡單,只調(diào)用了一個(gè)USBD_Init()初始化函數(shù),跟著這個(gè)函數(shù)去usb_bsp.c文件里把底層IO配置改下,說白了就是配置下DM,DP,VBUS三個(gè)引腳,順便把USB和GPIOB外設(shè)時(shí)鐘打開。
[cpp] view plain copy
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE) ;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE) ;
GPIO_InitStructure.GPIO_Pin = //GPIO_Pin_12 | //ID
GPIO_Pin_14 | //DM
GPIO_Pin_15; //DP
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG_HS_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG_HS_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG_HS_FS) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
到這里就接近尾聲了,編譯一下開始刪吧,中斷文件里幾個(gè)外部中斷和喚醒中斷都可以刪了,usbd_usr.c里各種函數(shù)內(nèi)容都刪了吧,留著個(gè)接口當(dāng)備胎以后再說,刪的沒錯(cuò)誤了之后把usb_conf.h里下面兩條注釋掉就算完成了。
// #define USB_OTG_HS_DEDICATED_EP1_ENABLED
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
最后貼個(gè)usb的軟斷開代碼,以后應(yīng)該會(huì)用到的吧:
USB_OTG_DCTL_TypeDef dctl;
/*軟斷開*/
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
dctl.b.sftdiscon = 1; //0:正常工作;1:軟斷開
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
上一篇:基于STM32F429的SDRAM使用
下一篇:STM32F429 CAN2通信
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 【ESP32】通過串口控制直流電機(jī)
- ESP32 spi 驅(qū)動(dòng)使用 dummy 方式支持設(shè)備驅(qū)動(dòng)
- ESP32系列CPU支持差分升級
- ESP32驅(qū)動(dòng)MFRC522 RFID模塊讀寫IC卡數(shù)據(jù)
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 小鵬華為聯(lián)手終結(jié)AR-HUD“三大痛”
- 英特爾攜手香港大學(xué)“菁英聚·港大”,推動(dòng)中學(xué)人工智能教育普及
- 奔馳,國軒高科固態(tài)電池正式裝車,續(xù)航超1000km!
- 高功耗芯片如何設(shè)計(jì)滿足散熱需求?
- 智能駕駛仿真研究:仿真走向跨域融合,世界模型應(yīng)用提速
- 國投招商投資景略半導(dǎo)體,加速車載芯片國產(chǎn)替代進(jìn)程
- 正極材料知多少:LFP仍是市場主流,三元體系將持續(xù)滲透30萬元以上車型
- 擺脫中國電池鏈?特斯拉欲自建電池生產(chǎn)體系
- 人形機(jī)器人新賽道,湖北想贏
- 大陸集團(tuán)開發(fā)出全新傳感器技術(shù) 可減少稀土元素的使用
- 安全的革新,全新的驗(yàn)證方式 下載富士通 《頻譜驗(yàn)證解決方案 》白皮書 好禮送!
- 第二季學(xué)習(xí)體驗(yàn)活動(dòng)風(fēng)暴來襲!
- 【已結(jié)束】R&S 直播【PCI Express Gen 3 一致性測試(含demo演示)】
- 【EEWORLD第四十一屆】2012年08月社區(qū)明星人物揭曉!
- 免費(fèi)申請測評:超小型 Linux 開發(fā)套件:Quantum Tiny Linux(帶 SoM 和擴(kuò)展板)
- 免費(fèi)申請富士通FRAM 曬心得 贏大禮!
- 【TI有獎(jiǎng)直播】新一代低功耗藍(lán)牙微控制器CC2640R2,開發(fā)和應(yīng)用案例解析
- 福祿克有獎(jiǎng)直播:高精度測溫賦能電子制造
- 有獎(jiǎng)直播|多款MSP430™片上Sigma-Delta ADC助力高精度信號(hào)檢測應(yīng)用 報(bào)名中
- 郭明錤:蘋果將采用侵略性價(jià)格策略背后的三大原因
- 賽普拉斯3.0戰(zhàn)略成敗關(guān)鍵:汽車、物聯(lián)網(wǎng)與工業(yè)
- 聯(lián)想手機(jī)再出發(fā),這一次能成功嗎?
- 小米手環(huán)3首發(fā)開賣:功能這么多?
- 始于顏值 忠于才華,我們期待OPPO Find X 到底是期待什么?
- Stm32調(diào)試之a(chǎn)ssert_param() 斷言機(jī)制
- STM32F1x系列——跑馬燈實(shí)驗(yàn)-庫函數(shù)
- STM32寄存器與庫函數(shù)
- 糟糕!手機(jī)密碼也能被“監(jiān)聽”?劍橋大學(xué)新研究AI算法顛覆常理
- 寫STM32 的I2c庫函數(shù)
- 在電路設(shè)計(jì)中電容使用一些誤區(qū)
- 為了加大輸出的電流,通常會(huì)并聯(lián)MOS,這樣一來。柵極電容就大了。驅(qū)動(dòng)G的信號(hào)要注...
- 【求助】代碼中的這個(gè)用法是什么意思
- WIFI232如何當(dāng)串口使用
- visual studio 2005 調(diào)試windows ce程序的問題
- TI 15.4-Stack支持470M頻段
- 關(guān)于malloc返回的地址
- 【TI薦課】#TI 毫米波雷達(dá)技術(shù)介紹#
- 【TI DLP創(chuàng)意征集】+新型固定電話
- 分享TMS320F28335的存儲(chǔ)空間 的有關(guān)經(jīng)驗(yàn)