你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【源代码】STM32F103C8T6最小板搞定CMSIS-DAP和SWO功能  

[复制链接]
radio2radio 发布时间:2018-5-31 15:47
阅读主题, 点击返回1楼
1 收藏 45 评论418 发布时间:2018-5-31 15:47
418个回答
radio2radio 回答时间:2018-7-4 20:54:32
shanji 发表于 2018-7-4 19:16
看来要换个mdk版本了

也不一定要换,单独升级CMSIS,如图:
Keil CMSIS v5.3.0_required.JPG
sunonly 回答时间:2018-7-6 19:13:30
感谢分享!下来学习学习
radio2radio 回答时间:2018-7-17 17:20:34
shanji 发表于 2018-7-4 19:16
看来要换个mdk版本了

搞定没有?
hi201803 回答时间:2018-7-22 19:23:07

在  MDK 4.xx  里面编译通过了。
只需要把 缺少的头文件复制过去就可以,大约3个,再改一下include 设置就可.

缺少的头文件 在MDK 5.xx 下面目录里.
C:\Keil\ARM\PACK\ARM\CMSIS\5.3.0\CMSIS\Include
C:\Keil\ARM\PACK\ARM\CMSIS\5.3.0\CMSIS\Driver\Include

缺少 的 usb库文件 也复制过去. 具体在哪里就不清楚了.
wujique 回答时间:2018-7-24 09:35:40
楼主能否说下软复位具体如何做的?我想改改改DAPLINK固件。
还有CDC不敢呢?不知道DAPLINK是否有这个BUG。
radio2radio 回答时间:2018-7-24 21:21:44
huangxuejia-292 发表于 2018-7-24 09:35
楼主能否说下软复位具体如何做的?我想改改改DAPLINK固件。
还有CDC不敢呢?不知道DAPLINK是否有这个BUG。 ...

这个简单,在main.c的最后面一段,我拷贝到这里:

  1. //-----Soft reset + Hard reset-------------------------------------------------
  2. #define PIN_SWCLK_SET PIN_SWCLK_TCK_SET
  3. #define PIN_SWCLK_CLR PIN_SWCLK_TCK_CLR

  4. #define RST_CLOCK_CYCLE()                \
  5.   PIN_SWCLK_CLR();                       \
  6.   PIN_DELAY();                           \
  7.   PIN_SWCLK_SET();                       \
  8.   PIN_DELAY()

  9. #define RST_WRITE_BIT(bit)               \
  10.   PIN_SWDIO_OUT(bit);                    \
  11.   PIN_SWCLK_CLR();                       \
  12.   PIN_DELAY();                           \
  13.   PIN_SWCLK_SET();                       \
  14.   PIN_DELAY()

  15. #define RST_READ_BIT(bit)                \
  16.   PIN_SWCLK_CLR();                       \
  17.   PIN_DELAY();                           \
  18.   bit = PIN_SWDIO_IN();                  \
  19.   PIN_SWCLK_SET();                       \
  20.   PIN_DELAY()

  21. #define PIN_DELAY() PIN_DELAY_SLOW(DAP_Data.clock_delay)

  22. uint8_t RST_Transfer(uint32_t request, uint32_t data)
  23. {
  24.   uint32_t ack;                                                                 \
  25.   uint32_t bit;                                                                 \
  26.   uint32_t val;                                                                 \
  27.   uint32_t parity;                                                              \
  28.   uint32_t n;                                                                   \
  29.   \
  30.   /* Packet Request */                                                          \
  31.   parity = 0U;                                                                  \
  32.   RST_WRITE_BIT(1U);                     /* Start Bit */                        \
  33.   bit = request >> 0;                                                           \
  34.   RST_WRITE_BIT(bit);                    /* APnDP Bit */                        \
  35.   parity += bit;                                                                \
  36.   bit = request >> 1;                                                           \
  37.   RST_WRITE_BIT(bit);                    /* RnW Bit */                          \
  38.   parity += bit;                                                                \
  39.   bit = request >> 2;                                                           \
  40.   RST_WRITE_BIT(bit);                    /* A2 Bit */                           \
  41.   parity += bit;                                                                \
  42.   bit = request >> 3;                                                           \
  43.   RST_WRITE_BIT(bit);                    /* A3 Bit */                           \
  44.   parity += bit;                                                                \
  45.   RST_WRITE_BIT(parity);                 /* Parity Bit */                       \
  46.   RST_WRITE_BIT(0U);                     /* Stop Bit */                         \
  47.   RST_WRITE_BIT(1U);                     /* Park Bit */                         \
  48.   \
  49.   /* Turnaround */                                                              \
  50.   PIN_SWDIO_OUT_DISABLE();                                                      \
  51.   for (n = DAP_Data.swd_conf.turnaround; n; n--) {                              \
  52.     RST_CLOCK_CYCLE();                                                          \
  53.   }                                                                             \
  54.   \
  55.   /* Acknowledge response */                                                    \
  56.   RST_READ_BIT(bit);                                                            \
  57.   ack  = bit << 0;                                                              \
  58.   RST_READ_BIT(bit);                                                            \
  59.   ack |= bit << 1;                                                              \
  60.   RST_READ_BIT(bit);                                                            \
  61.   ack |= bit << 2;                                                              \
  62.   \
  63.   /* Data transfer */                                                           \
  64.   /* Turnaround */                                                              \
  65.   for (n = DAP_Data.swd_conf.turnaround; n; n--) {                              \
  66.     RST_CLOCK_CYCLE();                                                          \
  67.   }                                                                             \
  68.   PIN_SWDIO_OUT_ENABLE();                                                       \
  69.   /* Write data */                                                              \
  70.   val = data;                                                                   \
  71.   parity = 0U;                                                                  \
  72.   for (n = 32U; n; n--) {                                                       \
  73.     RST_WRITE_BIT(val);              /* Write WDATA[0:31] */                    \
  74.     parity += val;                                                              \
  75.     val >>= 1;                                                                  \
  76.   }                                                                             \
  77.   RST_WRITE_BIT(parity);             /* Write Parity Bit */                     \
  78.   PIN_SWDIO_OUT_ENABLE();                                                       \
  79.   PIN_SWDIO_OUT(1U);                                                            \
  80.   return ((uint8_t)ack);                                                        \
  81. }

  82. void vResetTarget(uint8_t bit)
  83. {
  84.   uint32_t i;
  85.   //soft-reset for Cortex-M
  86.   RST_Transfer(0x00000CC5, 0xE000ED0C); //set AIRCR address
  87.   for (i=0; i<100; i++);
  88.   RST_Transfer(0x00000CDD, 0x05FA0007); //set RESET data
  89.   for (i=0; i<100; i++);
  90.   RST_Transfer(0x00000CC5, 0xE000ED0C); //repeat
  91.   for (i=0; i<100; i++);
  92.   RST_Transfer(0x00000CDD, 0x05FA0007);
  93.   
  94.   if (bit & 1)  PIN_nRESET_HIGH();
  95.   else          PIN_nRESET_LOW();
  96. }

复制代码


您再看看,是哪里调用了vResetTarget(uint8_t bit)函数。

CDC的改进,我是仿造CubeMX的CDC user 样板文件,UART库函数换成ARM RTE的。 解决了原来的版本CDC操作会导致死机问题。

USB的底层没有动。我曾经尝试将USB库函数更换成CubeMX的,没有成功。
也还发现,如果换成CubeMX的USB库,编译后代码文件会大了很多,很可能导致64KB不够用(我的F103C8只有64KB)。

wujique 回答时间:2018-7-25 15:00:55
radio2radio 发表于 2018-7-24 21:21
这个简单,在main.c的最后面一段,我拷贝到这里:

改好了,调试能复位。
MSD(U盘拖放)无法复位。。。
radio2radio 回答时间:2018-7-25 18:59:43
本帖最后由 radio2radio 于 2018-7-25 19:14 编辑
huangxuejia-292 发表于 2018-7-25 15:00
改好了,调试能复位。
MSD(U盘拖放)无法复位。。。

你看看优盘拖放是不是后台运行的,要等优盘拖放完成之后,插入一个时延(100ms),调用一次vResetTarget,一定行。
dreamfly239 回答时间:2018-7-26 10:38:40
很受益啊,希望楼主继续分享有价值的资料
shanji 回答时间:2018-7-27 10:01:49

还没有,不去折腾了
hi201803 回答时间:2018-7-27 17:01:25
radio2radio 发表于 2018-7-24 21:21
这个简单,在main.c的最后面一段,我拷贝到这里:

看到,github 里面有 几个cmsis-DAP使用 st的USB库,至于大小,具体情况没细看.
chowei 回答时间:2018-7-29 18:32:27
好东西
g2004-148848 回答时间:2018-8-7 00:02:08
楼主辛苦谢谢分享
g2004-148848 回答时间:2018-8-7 00:03:15
请问楼主是用哪个版本编译的?
radio2radio 回答时间:2018-8-7 11:53:12
g2004-148848 发表于 2018-8-7 00:03
请问楼主是用哪个版本编译的?

Keil 5.xx,留意第60楼,ARM CMSIS要升级到V5.3.0

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版