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

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

[复制链接]
radio2radio 发布时间:2018-5-31 15:47
阅读主题, 点击返回1楼
1 收藏 45 评论418 发布时间:2018-5-31 15:47
418个回答
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
radio2radio 回答时间:2018-8-7 14:32:12
本帖最后由 radio2radio 于 2018-10-27 12:29 编辑

刚刚发现,一楼的原码包,USB文件夹里面,少了一个 “USB_CM3.lib” 的USB库文件。
我自己的硬盘上面就有这个文件,但是上传github后,这个文件就是没有上传出去,我后加也不会加。

我不知道为什么,记得第一次上传时,*.hex固件文件就是不给上传,后来我压缩成rar文件才传上去的。
哪位熟悉github的大侠,告诉我如何上传(.lib/.hex)等文件,谢谢。

没有了USB_CM3.lib库文件,肯定不行,下面的3个方法都能解决:
方法1,在C:\Keil\ARM\RV31\LIB目录里面,可以找到此文件,2016年的,248KB左右。拷贝到.\USB文件夹。
方法2,在C:\Keil\ARM\RV31\LIB目录里面,可以找到此文件,2016年的,248KB左右。将此文件添加到工程里面。
方法3,在其他地方拷贝一个,加到.\USB文件夹。本楼的附件就有一个,方便有需要的。

(我的github已经更新,使用方法2)

这个问题已经解决,是我第一次使用github,还不熟悉,经过网友提醒,需要在github的上传过滤文件里面,修改容许.lib/.hex等文件的上传。


USB_CM3.rar

下载

63.75 KB, 下载次数: 50

所属标签

相似分享

官网相关资源

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