如何使用stm32进行usb应用开发 如何用STM32系列内核的MCU与PC进行USB通信

\u5982\u4f55\u4fee\u6539STM32\u7684USB\u4f8b\u7a0b\u4e3a\u81ea\u5df1\u6240\u7528

\u3000\u3000\u5982\u4f55\u4fee\u6539STM32\u7684USB\u4f8b\u7a0b\u4e3a\u81ea\u5df1\u6240\u7528
\u3000\u3000\u4f7f\u7528\u65b9\u6cd5\uff1a
\u3000\u30001.\u5148\u6839\u636e\u4f60\u7684\u786c\u4ef6\uff0c\u4fee\u6539/project/user/HAL/USBCDC/hw_config.c\uff0c\u6b64\u6587\u4ef6\u5bf9USB\u8fdb\u884c\u521d\u59cb\u5316
\u3000\u30002.API\u8c03\u7528\u8bf4\u660e\uff1a
\u3000\u3000\u5148\u521d\u59cb\u5316STM32\uff0c\u518d\u8c03\u7528USBCDC_init\uff08\uff09\uff1b
\u3000\u3000\u8c03\u7528USBCDC_ready\uff08\uff09\u5982\u679c\u8fd4\u56de\u771f\uff08\u975e\u96f6\uff09\uff0c\u8868\u793a\u8fde\u63a5\u5df2\u5efa\u7acb\uff0c\u53ef\u4ee5\u901a\u8baf
\u3000\u3000\u6b64\u65f6\u8c03\u7528USBCDC_senddata\u548cUSBCDC_recvdata\uff0c\u5373\u53ef\u6536\u53d1\u6570\u636e\u3002
\u3000\u3000USBCDC_disconnect\uff08\uff09\u53ef\u4ee5\u5173\u65ad\u8fde\u63a5\uff0c\u4ee4USB\u6a21\u5757\u4f11\u7720\uff0c\u964d\u4f4e\u529f\u8017
\u3000\u3000\u5982\u679c\u8981\u91cd\u65b0\u6253\u5f00\u8fde\u63a5\uff0c\u8c03\u7528USBCDC_connect\uff08\uff09\uff1b\u8fd9\u4e2a\u51fd\u6570\u4f1a\u6fc0\u6d3bUSB\u6a21\u5757
\u3000\u30003.PC\u7aef\u9a71\u52a8\u7a0b\u5e8f\u5b89\u88c5\uff0c\u53ef\u4ee5\u4f7f\u7528\u9644\u5e26\u7a0b\u5e8f\uff0c\u4e5f\u53ef\u4ee5\u8ba9\u7cfb\u7edf\u81ea\u52a8\u4e0a\u7f51\u67e5\u627e\u3002\u76ee\u524d\u4ec5\u6d4b\u8bd5\u8fc7windows xp/vista/7\uff0clinux\u672a\u6d4b\u8bd5\u8fc7\u3002
\u3000\u3000\u8fd9\u4e2a\u9a71\u52a8\u7a0b\u5e8f\u5b9e\u9645\u4e0a\u662f\u4f7f\u7528\u4e86\u7cfb\u7edf\u81ea\u5e26\u7684usbser.sys\uff0c\u5b89\u88c5\u7684\u53ea\u662f\u4e00\u4e2ainf\u8bbe\u7f6e\u6587\u4ef6\u3002

STM32\u7cfb\u5217\u4ea7\u54c1\u672c\u8eab\u5305\u542b\u4e86USB\u63a5\u53e3\u3002
\u4e0ePC\u901a\u8baf\u7684\u8bdd\uff0c\u9700\u8981\u4ee5\u4e0b\u5de5\u4f5c\uff1a
\u4f7f\u7528STM32\u7684USB\u5f15\u811a\uff0c\u8bbe\u8ba1\u6b63\u786e\u7684\u786c\u4ef6\u63a5\u53e3
\u8f6f\u4ef6\u4e2d\uff0c\u5f15\u5165\u6216\u7f16\u5236USB\u9a71\u52a8\u4ee3\u7801\uff0c\u5b9e\u73b0\u5d4c\u5165\u5f0f\u7aef\u7684\u8f6f\u4ef6\u529f\u80fd
PC\u7aef\u9700\u8981\u7f16\u5236\u7279\u5b9a\u7684\u9a71\u52a8\u7a0b\u5e8f\uff0c\u4ee5\u5b9e\u73b0\u53cc\u65b9\u7684\u901a\u8baf\u5185\u5bb9
\u8054\u673a\u8c03\u8bd5\uff0c\u4fee\u6b63Bug\u3002

主要是分析官方的Custom_HID 例程,强烈建议大家结合USB2.0协议去分析源代码。特别不错,分析完之后就可以修改移植了。另外,有个叫源享科技的出了一套80集的关于STM32的整套视频,对USB等高级外设讲的非常透彻,结合原子的开发板学习,效果也很好的。那视频在源享科技官网上挺贵的,哈哈,最后我在淘宝上发现那些新开的店最便宜的才10块钱。老板是个挺厉害的研究生,在学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。注释掉需要处理的函数。NOP_Process表示不处理。

三usb_prop.c文件
1、修改void XX_Reset(void)(如:void Joystick_Reset(void))
一般/* Initialize Endpoint 0 */的不用修改,如下为举例说明端点1的初始化,其他端口原理一样。
SetEPType(ENDP1, EP_INTERRUPT);//设置端点1类型
/*EP_BULK
批量端点
EP_CONTROL 控制端点
EP_ISOCHRNOUS 同步端点
EP_INTERRUPT 中断端点*/
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //设置端点1缓冲区基地址
SetEPTxCount(ENDP1, 64);// 配置Tx 缓冲计数器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //设置端点接收关闭
SetEPTxStatus(ENDP1, EP_TX_NAK);// //设置端点1发送不应答
/*
#define EP_RX_DIS
(0x0000) // EndPoint RX DISabled 端点接收关闭
#define EP_RX_STALL
(0x1000) // EndPoint RX STALLed 端点接收延迟
#define EP_RX_NAK
(0x2000) // EndPoint RX NAKed 端点接收不应答
#define EP_RX_VALID
(0x3000) // EndPoint RX VALID端点接收有效
#define EP_TX_DIS
(0x0000) //EndPoint TX DISabled
#define EP_TX_STALL
(0x0010) // EndPoint TX STALLed
#define EP_TX_NAK
(0x0020) // EndPoint TX NAKed
#define EP_TX_VALID
(0x0030) // EndPoint TX VALID */

2、删除不相干的描述符等。
如自定义的USB设备就不需要以下结构体初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor

3、修改RESULT XX_Data_Setup(u8 RequestNo)的数据类请求处理。
如Custom_HID例程修改为“自定义USB设备”例程时可以将以下代码删除
if ((RequestNo == GET_DESCRIPTOR)

&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
{
CopyRoutine = Joystick_GetReportDescriptor;
}
else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)

{
CopyRoutine = Joystick_GetHIDDescriptor;

4、删除不相干的获得描述符返回函数
如自定义的USB设备就不需要以下函数:
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor

四、usb_endp.c文件
1、增加之前定义的中断数据处理函数
如:
void EP1_OUT_Callback(void)
{

这些写接收代码
五、数据发送和接收,举例说明
1、数据接收
u8 DataLen;

DataLen = GetEPRxCount(ENDP1);

PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

SetEPRxValid(ENDP1);

USART1_Send(DataLen);

count_out = 1;
2、数据发送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);

如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。

  • 濡備綍鐢⊿TM32绯诲垪鍐呮牳鐨凪CU涓嶱C杩涜USB閫氫俊
    绛旓細闇瑕丼TM32涓嶱C杩涜USB閫氫俊鎮ㄥ彲浠ラ夋嫨涓変釜閫斿緞锛绗竴锛氫綘鍙互浣跨敤STM32鐨凴X鍙奣X鐨勪覆鍙i厤鍚堜覆鍙h浆USB鑺墖锛屾瘮濡侾L2303锛孋H340杩欐牱鐨勮姱鐗囧疄鐜癝TM32涓嶱C鏈篣SB閫氫俊锛岀浜屼釜妯″紡灏辨槸浣跨敤STM32+CH375(甯SB鍥轰欢锛夎姱鐗囦笌PC閫氫俊锛岀涓変釜妯″紡灏辨槸鍒╃敤STM32鑷韩鐨刄SBslave鎺ュ彛涓嶱C閫氫俊锛屼絾鏄悗闈㈤偅绉嶅睘浜嶶SB锛岄偅涔堥厤...
  • 濡備綍浣跨敤stm32杩涜usb搴旂敤寮鍙
    绛旓細鏍规嵁浣犵▼搴浣跨敤鐨勯氫俊鏂瑰紡淇敼銆usb_desc.h鏂囦欢涓畾涔夎鏍规嵁usb_desc.c鏂囦欢涓殑鏁扮粍鐨勫ぇ灏忥紱ConfigDescriptor[SIZ_CONFIG_DESC]涓嬫坊鍔犻渶瑕佸鐞嗙殑绔偣锛涙牴鎹渶瑕佹坊鍔犳垨鍒犻櫎鎶ュ憡鎻忚堪绗︼紙涓昏鐢ㄤ簬HID锛夊拰CDC鎺ュ彛鎻忚堪绗︼紙涓昏鐢ㄤ簬瀹炵幇USB杞覆鍙o級绛夈傚叿浣撴柟娉曞彲浠ヤ笅杞戒釜鈥滅數鑴戝湀鍦堚濅娇鐢―12缂栧啓鐨勪緥瀛愩備簩銆Usb_...
  • 濡備綍瀹炵幇STM32F407鐨USB
    绛旓細STM32F407寮鍙戞澘涓婃湁鏉胯浇鐨凷T-Link鍚楋紵瑕佹槸鏈夛紝灏哠T-Link鐨勬帴鍙f彃鍒扮數鑴戠殑USB鍙d笂锛岀劧鍚庤椹卞姩銆傚鏋滄病鏈夋澘杞界殑ST-Link锛岄渶瑕佸鎺ヤ竴涓猄T-Link锛屽厛鎵句釜ST-Link锛屽皢鍏惰繛鎺ュ埌鐢佃剳鐨刄SB鍙d笂锛岀劧鍚庡啀瀹夎椹卞姩銆
  • 濡備綍鐢⊿TM32绯诲垪鍐呮牳鐨凪CU涓嶱C杩涜USB閫氫俊
    绛旓細1锛塽sart + usb铏氭嫙涓插彛鑺墖锛屼緥濡侳T232鎴朇P2101 2锛夐夋嫨鍐呯疆usb澶栬鐨stm32锛USB-FS-OTG妯″紡锛鐢瀹樻柟搴撳紑鍙
  • 濡備綍浣跨敤STM32鐨刄SB搴撴敮鎸佹帶鍒剁鐐0
    绛旓細濡備綍浣跨敤STM32鐨刄SB搴撴敮鎸佹帶鍒剁鐐0_宸ュ_楂樼瓑鏁欒偛_鏁欒偛涓撳尯銆傛帶鍒剁鐐圭殑浼犺緭鏈変笁涓樁娈,SETUP闃舵銆佹暟鎹樁娈靛拰鐘舵侀樁娈;鏁版嵁闃舵鍙堝垎涓烘暟鎹叆浣跨敤STM32鐨刄SB搴撴敮鎸佹帶鍒剁鐐0浠ID鐨凷ETREPORT涓轰緥璇存槑濡備綍浣跨敤ST;棣栧厛鎴戜滑鍏堝洖椤句竴涓嬫帶鍒剁鐐圭殑浼犺緭鏂瑰紡:;鎺у埗绔偣鐨勪紶杈撴湁涓変釜闃舵,SETUP闃舵銆
  • STM32鐨刄SB鎺ュ彛閫氫俊
    绛旓細鏄殑璇濓紝闇瑕佸皢stm32鐨剈sb璁惧鏋氫妇鎴愯櫄鎷熶覆鍙g被锛圕DC)锛岄渶瑕佸畨瑁呴┍鍔ㄧ▼搴忥紱濡傛灉涓嶆槸锛岄偅涔堝彲浠ュ皢stm32鐨剈sb璁惧鏋氫妇鎴怘ID绫昏嚜瀹氫箟璁惧锛屾槸涓嶉渶瑕侀┍鍔ㄧ殑銆傝皟璇曢渶瑕鐢╱sb璋冭瘯宸ュ叿锛屽叿浣撳簲鐢ㄧ殑璇濋渶瑕佸紑鍙戜笂浣嶆満绋嬪簭鏉ユ敹鍙戞暟鎹紙涓嶆槸椹卞姩鍝︼紝涓ょ爜浜嬶級銆傚彟澶栵紝涔熸病鏈変粈涔坰tm32鑷韩鎵甯︾殑鍗忚锛岄兘鏄USB鍗忚銆
  • 鎯冲疄鐜USB澶嶅悎璁惧,浣跨敤STM32Cube.姹傚姪
    绛旓細鍦ㄦ湰渚嬩腑閲囩敤涓涓厤缃涓帴鍙g殑鏂瑰紡 棣栧厛淇敼璁惧鎻忚堪绗,鏍囧噯璁惧鎻忚堪绗﹀拰鎶ュ憡鎻忚堪绗﹂兘涓嶉渶瑕佷慨鏀,鍙渶瑕佷慨鏀归厤缃弿杩扮鍗冲彲淇敼鎻忚堪绗︿箣鍚庤鍚屾椂璁板緱淇敼鎻忚堪绗︾殑闀垮害,鐒跺悗淇敼usb_prop鏂囦欢,涓昏鏄袱涓鍑烘潵鐨勫懡浠ET_MAX_LEN鐢ㄦ潵鑾峰彇褰撳墠瀛樺偍璁惧鐨勪釜鏁,杩樻湁涓涓敤鏉ュ浣嶅綋鍓嶅瓨鍌ㄨ澶囷紒
  • 濡備綍浣跨敤STM32鐨刄SB闈炴帶鍒剁鐐瑰彂閫佸涓暟鎹寘
    绛旓細鍦–ustom_HID渚嬬▼涓婁慨鏀逛簡濡備笅浠g爜锛 1.usb_proc.c 鐨凜ustomHID_Reset锛堬級閲 SetEPTxCount(ENDP1, 64); 2.鍏抽棴 DMA涓柇锛屼笉璁〢DC閲囨牱鍚庡彂閫丒P1鍖 3.鍦╩ain.c閲 閲嶅鍙戦佷竴涓128B鐨勫寘, while(1){ for(i=0;i<2;i++) { SetEPTxAddr(ENDP1, ENDP1_TXADDR+i*64); SetEPTxValid(ENDP1...
  • stm32usb铏氭嫙涓插彛鎬庝箞瀹炵幇
    绛旓細PC閫氳繃铏氭嫙涓插彛鍙戦佹暟鎹埌STM32usb鍙o紝STM32鍐嶉氳繃usart1鍙戦佹暟鎹埌PC涓插彛銆傛垜浠仛椤圭洰鏃讹紝鍙敤USB铏氭嫙涓插彛鍗冲彲銆傛墍浠ユ垜浠幇鍦ㄩ渶瑕佹妸涓插彛鍙戦侀儴鍒嗗垹闄ゃ傛妸USB鍋氫负涓涓狢OM鍙f潵浣跨敤銆傛垜浠濡備綍浣跨敤杩欎釜USB鍙e憿锛焏emo涓槸鎶奤SB鍙戦佹暟鎹仛浜嗕竴涓紦
  • STM32F407 澶栨帴3G妯″潡鏄USB鎺ュ彛,STM32搴旇鐢鍝釜渚嬬▼鏀
    绛旓細浣跨敤鏂规硶锛1.鍏堟牴鎹綘鐨勭‖浠讹紝淇敼/project/user/HAL/USBCDC/hw_config.c锛屾鏂囦欢瀵USB杩涜鍒濆鍖 2.API璋冪敤璇存槑锛氬厛鍒濆鍖STM32锛屽啀璋冪敤USBCDC_init锛堬級锛涜皟鐢║SBCDC_ready锛堬級濡傛灉杩斿洖鐪燂紙闈為浂锛夛紝琛ㄧず杩炴帴宸插缓绔嬶紝鍙互閫氳 姝ゆ椂璋冪敤USBCDC_senddata鍜孶SBCDC_recvdata锛屽嵆鍙敹鍙戞暟鎹俇SBCDC_...
  • 扩展阅读:usb3.0接口长啥样 ... usb3.2接口图片 ... stm32与摄像头接线图 ... 手机怎么打开usb ... stm32 usb hid ... stm32通过usb下载程序 ... stm32控制小风扇 ... stm32f103c8t6usb口使用 ... usbtottl使用方法 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网