|
前些日子买了块板子,当时比较忙就束之高阁了。最近要用到USB,手里没有一块合适的板子,然后就想到了它。和板子配套的程序是C++编写且不开放源码,没有实现USB功能,添加起代码来比较费劲,然后就想到了st提供的CubeMX。然后用它生成工程后先要调试一把试试感觉,结果问题来了。- T. S5 r+ a1 [) M' \# Y& m: H & a5 ~+ S6 o, x5 n4 I- \ d. r+ t% h2 @: l3 d 烧写完一次后,不能再次烧写,开始以为是硬件的问题,查来查去没有发现硬件哪里有问题。最后发现问题在调试的那几个引脚上。7 t6 |3 o- Q; C0 N 1 S( Q4 ]' G- W 通常我使用的是jlink仿真器,使用的引脚是 PA13--SWDIO* I( w% A; }1 ~$ V7 h PA14--SWCLCK PA15--JTDI/ S$ P, w. E v9 p1 |! t3 t5 x5 Y PB3--JTDO PB4--JNTRST 而这个板子只使用了PA13和PA14作为调试引脚。( R F6 } n- e+ W9 |/ a 7 W6 r# [( v/ n0 F4 _2 _9 B 找到了这个地方,再看下数据手册。为了在调试期间可以使用更多的GPIOs,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位可以改变重映射配置。
现在的重映射需要再寄存器里更改一下' _# s8 T& M2 x# b0 J: s
好了找到寄存器的重映射, #define AFIO_MAPR_SWJ_CFG_Pos (24U) #define AFIO_MAPR_SWJ_CFG_Msk (0x7U << AFIO_MAPR_SWJ_CFG_Pos) /*!< 0x07000000 */' O ^5 i9 s" E3 r2 o9 m& x #define AFIO_MAPR_SWJ_CFG AFIO_MAPR_SWJ_CFG_Msk /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ % g+ R( t. ~, ^9 O ' {2 n" _4 r6 p" |* |/ s* n#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos (25U) : c7 U) H0 \' G* h6 I) n4 L3 K8 G #define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk (0x1U << AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos) /*!< 0x02000000 */ #define AFIO_MAPR_SWJ_CFG_JTAGDISABLE AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk /*!< JTAG-DP Disabled and SW-DP Enabled */ x7 w1 s! k+ T" h3 s& A/ {1 X #define READ_BIT(REG, BIT) ((REG) & (BIT)) #define CLEAR_REG(REG) ((REG) = (0x0)) #define WRITE_REG(REG, VAL) ((REG) = (VAL)) #define READ_REG(REG) ((REG)) #define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))9 B. U& s2 \. f1 _- U6 a % P: Y5 g* D0 m" i# o5 i' V#define __HAL_AFIO_REMAP_SWJ_NOJTAG() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_JTAGDISABLE) * J: [0 d: p( X% y) I& ^4 E 当程序调用一下这条语句:__HAL_AFIO_REMAP_SWJ_NOJTAG();就可以了。 |
![]() ![]() 支持一下 |
微信公众号
手机版