cmsis dap的实现, 改为无线通信方式

来源:互联网 发布:手机荧屏软件 编辑:程序博客网 时间:2024/06/06 02:14

CMSIS DAP在stm32f107上的实现

CMSIS DAP的简介

英文全称Firmwarefor CoreSight Debug Access Port, 顾名思义为调试接口固件, 基于此可以实现自己的仿真器, 协议开源, 商业免费, 无版权顾虑.

详情可参考http://www.keil.com/pack/doc/CMSIS/DAP/html/index.html

本文目的是构建自己的仿真器

如果有MDK pro的license可以参考官方配置方法, 配置处理器,IO口,USB外设, 应该可以实现仿真器的功能.

但是由于没有pro的license, 所以这里打算用 stm32的usb otg v2.2.0的库, 加上cmsis-dap的源码实现.

 

1.      Stm32 usb otg库的使用

下载地址, ST官网 搜索usb, 在工具与软件项找到库文件及例程.

 如图所示 STSW-STM32046 即为官方库文件. 官方工程为IAR, 这里因为我们用的是KEIL就需要把USB驱动,设备类驱动,用户层相关文件添加进自己的工程,并添加响应的头文件. 如下图.

根据CMSIS-DAP要求采用的是USB HID类设备, 设备描述符,也根据官方配置要求设置, 报告描述符见下图.

 

 

Stm32 usb库中 drivers文件夹内为与硬件相关的操作, device为与设备类相关的操作, user文件夹内为与板级相关及用户app回调函数和标准描述符文件.

移植过程中drivers文件夹不需要修改, device文件夹只需要修改类相关文件也就是hid_core文件, 主要修改部分为描述符, 及操作结构体内的 DATA_INDATA_OUT函数.

 

在这里要稍微描述下usbotg的库, usb库初始化后, 调用USBD_Init(…)函数,注册一些列函数, 最主要的是类相关回调函数. 这个结构体会在usb在中断产生后收到请求时将非usb标准请求传给类相关的函数. 也就是usbd_customhid_core.c文件. 因为考虑到后续会将仿真器改造成无线仿真器,在这里我主要在类相关回调函数中调用自己的接口函数.

最主要的结构体:

typedef struct _Device_cb

{

  uint8_t (*Init)         (void *pdev ,uint8_t cfgidx);

  uint8_t (*DeInit)       (void *pdev ,uint8_t cfgidx);

 /* Control Endpoints*/

  uint8_t (*Setup)        (void *pdev ,USB_SETUP_REQ  *req); 

  uint8_t (*EP0_TxSent)   (void *pdev);   

  uint8_t (*EP0_RxReady)  (void *pdev); 

  /* Class Specific Endpoints*/

  uint8_t (*DataIn)       (void *pdev ,uint8_t epnum);  

  uint8_t (*DataOut)      (void *pdev ,uint8_t epnum);

  uint8_t (*SOF)          (void *pdev);

  uint8_t (*IsoINIncomplete)  (void *pdev);

  uint8_t (*IsoOUTIncomplete)  (void*pdev);  

 

  uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length);

#ifdef USB_OTG_HS_CORE

  uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);  

#endif

 

#ifdefUSB_SUPPORT_USER_STRING_DESC

  uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index,  uint16_t *length);  

#endif 

 

}USBD_Class_cb_TypeDef;

我主要实现了3个函数, Init, DataIn, DataOut.

Init中完成一些数据的初始化, 并使能预接收.

DataOut 发送信号给处理线程, 再次使能预接收.

In中查看是否有待发送数据,有则发送.

 

处理线程中调用DAP协议处理信号.

后续将完成无线部分改造.


0 0
原创粉丝点击