娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月12日(星期四)

2019年06月12日 | STM32F103C8T6使用MDK 4.12中Custom_HID的修改方法

發布者:ping777 來源: eefocus關鍵字:STM32F103C8T6  MDK  修改方法 手機看文章 掃描二維碼
隨時隨地手機看文章

目的,由上位機發送64字節,設備回應3個字節,功能自定。。

板子使用的是最小核心板,MCU為STM32F103C8T6。
USB的D-和D+分別接到PA11(USBDM)和PA12(USBDP)上,PA12(USBDP)即D+通過跳線使上拉1.5K電阻到VCC(3.3V)。
1:打開MDK4.12,打開
C:KeilARMExamplesSTSTM32F10xUSBLibDemosCustom_HIDproject目錄下的Custom_HID項目文件。

2:選擇菜單 Project->Options for Target 'STM3210E-EVAL'

在Device選項卡里選擇 STM32F103C8。
在Output選項卡里把Create HEX File選上,取消Browse Information。
在C/C++選項卡里的Preprocessor Symbols里的Define: USE_STM3210E_EVAL清除。


3:從Application files組中的文件由上而下逐個修改

第一個是usb_pwr.c

把PowerOn和PowerOff()面里的USB_Cable_Config(ENABLE);和USB_Cable_Config(DISABLE);這兩句刪除,因為我的板子上沒有這個控制電路
而是通過跳線把USBDP通過1.5K電阻接通到VCC(3.3V)的。


接下來修改hw_config.c


#define ADC1_DR_Address    ((u32)0x4001244C)
u32 ADC_ConvertedValueX = 0;
u32 ADC_ConvertedValueX_1 = 0;
這三句刪除,因為我不用ADC,外部中斷和DMA,只需要跟上位機通信點亮板上連接到PB0上的一個LED。

所以還要把Set_System函數里的
EXTI_Configuration();
ADC_Configuration();
這兩句刪除。

把USB_Interrupts_Config函數里的
EXTI9_5 Interrupt
EXTI15_10 Interrupt
DMA1 Channel1 Interrupt
這三個相關的語句都刪除。

把USB_Cable_Config整個函數刪除。

把GPIO_Configuration里面的
KEY
Tamper
Potentiometer
三個相關的配置語句都刪除。
下面的LED配置只配置LED1,用來指示上位機的指令,其它都刪除。


EXTI_Configuration
ADC_Configuration
這兩個函數整個刪除。

加上這句RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); 別忘了開CRC電源。計算序列號要用到的,否則序列號就會變成42949-67295,是0xffffffff,是錯誤的。

把Get_SerialNum函數的功能改成如下
目的是把96位ID作CRC運算后來做產品的序列號。
可以不要這個函數,只在usb_desc.c里定義序列號。同時其它文件里用到這個函數的地方就要刪除。

增加RBIT這個函數,32位位倒置程序,CRC用到的。因為STM32的CRC計算結果跟一般的CRC校驗工具計算結果不同,所以要特殊處理。

原始序列號: 39006C065834313149670543
分成三個32位數。每一個32位按位倒置,然后給STM32計算CRC,結果跟0xffffffff異或運算后,再把32位的結果按位倒置。就對了。
39006C06=00111001000000000110110000000110 = 01100000001101100000000010011100 = 6036009C
58343131=01011000001101000011000100110001 = 10001100100011000010110000011010 = 8C8C2C1A
49670543=01001001011001110000010101000011 = 11000010101000001110011010010010 = C2A0E692

STM32的CRC結果跟0xffffffff后為十進制4289354847=FFAA5C5F=11111111101010100101110001011111=倒過來

11111010001110100101010111111111=FA3A55FF


__asm u32 RBIT(u32 value)
{
    rbit r0, r0
    bx lr
}

void Get_SerialNum(void)
{
  u32 Device_Serial, Device_Serial0, Device_Serial1, Device_Serial2;

  Device_Serial0 = *(u32*)(0x1FFFF7E8);
  Device_Serial0 = RBIT(Device_Serial0);

  Device_Serial1 = *(u32*)(0x1FFFF7EC);
  Device_Serial1 = RBIT(Device_Serial1);

  Device_Serial2 = *(u32*)(0x1FFFF7F0);
  Device_Serial2 = RBIT(Device_Serial2);


  CRC_ResetDR();
  Device_Serial = CRC_CalcCRC(Device_Serial0);
  Device_Serial = CRC_CalcCRC(Device_Serial1);
  Device_Serial = CRC_CalcCRC(Device_Serial2);

  Device_Serial ^= 0xFFFFFFFF;
  Device_Serial = RBIT(Device_Serial);

  if(Device_Serial != 0)
  {
  CustomHID_StringSerial[0] = CUSTOMHID_SIZ_STRING_SERIAL;
  CustomHID_StringSerial[1] = USB_STRING_DESCRIPTOR_TYPE;
  CustomHID_StringSerial[2] = (u8)(Device_Serial/(u32)1000000000)+0x30;
  CustomHID_StringSerial[3] = 0x00;
  CustomHID_StringSerial[4] = (u8)((Device_Serial%(u32)1000000000)/(u32)100000000)+0x30;
  CustomHID_StringSerial[5] = 0x00;
  CustomHID_StringSerial[6] = (u8)((Device_Serial%(u32)100000000)/(u32)10000000)+0x30;
  CustomHID_StringSerial[7] = 0x00;
  CustomHID_StringSerial[8] = (u8)((Device_Serial%(u32)10000000)/(u32)1000000)+0x30;
  CustomHID_StringSerial[9] = 0x00;
  CustomHID_StringSerial[10] = (u8)((Device_Serial%(u32)1000000)/(u32)100000)+0x30;
  CustomHID_StringSerial[11] = 0x00;
  CustomHID_StringSerial[12] = '-';
  CustomHID_StringSerial[13] = 0x00;

  CustomHID_StringSerial[14] = (u8)((Device_Serial%(u32)100000)/(u32)10000)+0x30;
  CustomHID_StringSerial[15] = 0x00;
  CustomHID_StringSerial[16] = (u8)((Device_Serial%(u32)10000)/(u32)1000)+0x30;
  CustomHID_StringSerial[17] = 0x00;
  CustomHID_StringSerial[18] = (u8)((Device_Serial%(u32)1000)/(u32)100)+0x30;
  CustomHID_StringSerial[19] = 0x00;
  CustomHID_StringSerial[20] = (u8)((Device_Serial%(u32)100)/(u32)10)+0x30;
  CustomHID_StringSerial[21] = 0x00;
  CustomHID_StringSerial[22] = (u8)((Device_Serial%(u32)10)/(u32)1)+0x30;
  CustomHID_StringSerial[23] = 0x00;
  }   
}


然后修改對應的 hw_config.h
void USB_Cable_Config (FunctionalState NewState);
void EXTI_Configuration(void);
void ADC_Configuration(void);
把這三條刪除。
Get_SerialNum也視情況決定要不要刪除。

main.c不動。

接下來修改 stm32f10x_it.c
把u8 Send_Buffer[2]; 這句刪除。


extern u32 ADC_ConvertedValueX;
extern u32 ADC_ConvertedValueX_1;
刪除。


DMA1_Channel1_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
這三個函數清空,是清空里面的內容,保留一個空的函數。

 

接下來改 usb_desc.c
把報告描述符改成自已的:
/* CustomHID_ConfigDescriptor */
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  {    
    0x05, 0x01,                    // USAGE_PAGE(User define)
    0x09, 0x00,                    // USAGE(User define)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x19, 0x00,                    //   USAGE_MINIMUM(0)
    0x29, 0xFF,                    //   USAGE_MAXIMUM(255)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x03,                    //   REPORT_COUNT (3)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

    0x05, 0x02,                    // USAGE_PAGE(2)
    0x19, 0x00,                    //   USAGE_MINIMUM (0)
    0x29, 0xFF,                    //   USAGE_MAXIMUM (255)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x95, 0x40,                    //   REPORT_COUNT (8)
    0x75, 0x08,                    //   REPORT_SIZE (64)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0xc0            /*     END_COLLECTION              */

  }; /* CustomHID_ReportDescriptor */


然后更改配置描述符中的輸入輸出端點的最大包數。輸入端點改成3個字節,輸出端點改成64字節。


再來改下面三個字符串描述符,使用的是UNICODE格式的,用記事本寫好保存為UNICODE格式文件,再用十六進制編輯器打開就看到了。

改完以上的數據,還要更改usb_desc.h里的定義的大小。(注意字節數還包括描述符長度及標識),如上面的報告描述符大小應改成
#define CUSTOMHID_SIZ_REPORT_DESC 37


接下來改usb_endp.c

u8 Receive_Buffer[2];
改成
u8 Receive_Buffer[64]; //因本例中要求上位機發來64字節。

然后是EP1_OUT_Callback這個函數的修改,根據上位機發來的數據,作出相應回應。

usb_istr.c不用改。

然后改usb_prop.c
把CustomHID_Reset函數里的
  SetEPTxCount(ENDP1, 2);
  SetEPRxCount(ENDP1, 2);
改成
  SetEPTxCount(ENDP1, 3);
  SetEPRxCount(ENDP1, 64);


CustomHID_init函數里調用了Get_SerialNum函數,如果使用usb_desc.c里定義的產品序列號,這里也不用了。。


還要修改platform_config.h
把修改LED引腳,USB引腳的定義。

終于改完了。。

 

 

以下是記錄下來的發送程序段。
u8 Send_Buffer[3];
Send_Buffer[0] = 0xxx;
Send_Buffer[1] = 0xxx;
Send_Buffer[2] = 0xxx;
UserToPMABufferCopy(Send_Buffer, ENDP1_TXADDR, 3);
SetEPTxValid(ENDP1);

 

最后要還說一說跟上位機通信要注意的地方,上位機程序要限制只能用運行一個實例,可以用互斥量。運行多個程序會導致USB不知應該跟哪個

程序通信,數據會錯誤。
注意程序關閉再打開后要獲得設備的狀態。而設備復位后也要通知上位機,以保證兩者狀態一致。
上位機程序的讀寫緩沖都要比設備定義的大一個字節(開始位置,0x00)。這個字節由電腦發到設備中會被去掉,所以設備端不用管。
電腦接收到的數據也比設備發來的多一個字節,也要處理掉。。。
還有ANSI跟UNICODE的處理,要清楚。如字符串描述符中的字符串的顯示等。


關鍵字:STM32F103C8T6  MDK  修改方法 引用地址:STM32F103C8T6使用MDK 4.12中Custom_HID的修改方法

上一篇:基于官方庫的STM32操作U盤注意的問題
下一篇:STM32F103學習筆記三 串口通信

推薦閱讀

6月11日,市場調查機構群智咨詢(Sigmaintell)發布的報告顯示,受全球終端需求低迷以及前期庫存影響,指紋芯片廠下訂單偏謹慎保守,預計2018年全球指紋芯片出貨量約9.7億顆,同比下降約11%。數據顯示,2018年第一季度,全球指紋芯片出貨量約2億顆,同比下降約26%。
6月11日,中國移動采購與招標網顯示,中國移動(00941)子公司向4家國產手機廠商采購8100臺5G手機,這是今年以來中國移動獲得商用牌照后的第一單5G手機采購,也是規模最大的一單。公告顯示,該子公司為中國移動通信集團終端有限公司。根據工商資料,公司成立于2011年,至今對外投資了53家公司,主要是中國移動各地營業廳。這一批5G終端主要是5G手機和CPE(...
拿下DXOMark的后置拍照、前置拍照世界第一之后,華為P40 Pro的音頻得分剛剛也出爐了,不過這款手機只得了59分,沒有進入TOP10,單揚聲器設計失分不少。  華為P40 Pro的音頻設計有些出乎意料,因為2020年旗艦機很多用上了雙揚聲器,它還是單揚聲器設計,DXO指出這可能是跟P40 Pro的拍照有關,塞入了四五個鏡頭,頂部還有多麥克風、天線,可...
企查查APP顯示,日前,浙江吉利控股集團有限公司、吉利汽車研究院(寧波)有限公司公開一項名為“一種車路協同自動駕駛方法、系統及車輛”的發明專利,公開號為CN112927543A。該專利申請日期為2021年2月,法律狀態為“審中”。 根據企查查的專利摘要,本發明提供了一種車路協同自動駕駛方法、系統及車輛,涉及車輛自動駕駛技術領域。該方法通過接收計算指...

史海拾趣

問答坊 | AI 解惑

wince上電自啟動,如何不出現桌面,直接出現我的程序界面?

我現在用注冊表的方式,讓我的程序(窗口程序)在gwes,explore之后啟動。這樣會先出現桌面2,3秒再出現我的程序。 如果希望不出現桌面,要怎么做。…

查看全部問答∨

為什么有的驅動安裝完后會在任務欄顯示刪除硬件?

就像U盤驅動那樣?而有些就不會顯示,關鍵是在哪里呢?…

查看全部問答∨

VC程序移植的一個問題

我用VC寫的程序移植到WinCE中,原來用到了一個CHtmlView類,但在WinCE中不支持,怎么辦啊?…

查看全部問答∨

香帥,請教。MDK軟件仿真沒有CAN外設。

MDK 3.80 STM32F107 調試時,外設沒有CAN部分,我在網上聽說別人的有,我估計是不是安裝了什么插件。請教!上圖求真相! 下載 (31.08 KB) 2009-12-22 17:33 …

查看全部問答∨

周立功的人生(勵志)

盡管我們不能改變制度,也不一定能夠改變別人,但我們可以改變自己,因為沒有人能夠阻止我們不斷進步,如果失敗或者失意,那只能怪我們自己無能,怪我們自己不善于學習,不能怪別人沒有給您機會,更不能怪這個社會......       ...…

查看全部問答∨

STM中斷求助

STM的優先級分組是根據什么來分的,如何確定是分第幾組,例如 第0組:所有4位用于指定響應優先級 第1組:最高1位用于指定搶占式優先級,最低3位用于指定響應優先級 第2組:最高2位用于指定搶占式優先級,最低2位用于指定響應優先級 第3組:最高3位 ...…

查看全部問答∨

看看MSP430單片機

第一次看看MSP430,雖然買了,但還沒有學他,不知道好不好學,真很想學學他。…

查看全部問答∨

電壓跟隨器的作用有哪些?

在百度百科中看到 電壓跟隨器的其中一個好處是,提高了輸入阻抗,這樣,輸入電容的容量可以大幅度減小,為應用高品質的電容提供了前提保證。 為什么可以說:輸入電容的容量可以大幅度減小? 小弟初入模擬電子的世界,還請各位幫忙解釋一下,非 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 栾城县| 德保县| 交口县| 安丘市| 拜城县| 车险| 固原市| 常州市| 扶绥县| 离岛区| 和顺县| 萍乡市| 渝中区| 宣化县| 蒙城县| 浠水县| 思茅市| 正宁县| 论坛| 阳曲县| 柳河县| 微山县| 固镇县| 江陵县| 云安县| 会同县| 陆丰市| 岳阳市| 阳朔县| 丹东市| 汾阳市| 蒲江县| 湖南省| 莲花县| 康乐县| 滨州市| 安图县| 兰坪| 蓝田县| 惠来县| 富川|