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

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

[复制链接]
radio2radio 发布时间:2018-5-31 15:47
阅读主题, 点击返回1楼
1 收藏 43 评论399 发布时间:2018-5-31 15:47
399个回答
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库文件 也复制过去. 具体在哪里就不清楚了.
huangxuejia-292 回答时间: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)。

huangxuejia-292 回答时间: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

还没有,不去折腾了

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

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