完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对于32位的ARM单片机,其程序烧录的方式除了采用原始的串口下载之外,还拥有即可烧录程序,也可在线调试的外部接口,即JTAG与SWD接口。单片机芯片指定了一些IO口在默认的配置下实现上述的功能,例如:PA13、A14、A15、PB3、PB4等。那么如何设置其中某几个IO口做普通使用呢,这篇文章将会给出答案。
烧录方式 目前我经常用的烧录方式有三种,最开始使用JTAG方式去下载调试32单片机,到后来发现更加简单方便的SWD方式,再到后面的ST-LINK,其实也是SWD方式。 JTAG方式 JTAG:JTAG(JointTest Action Group;联合测试工作组)是一种国际标准测试协议,主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 市场上的J-Link下载器支持JTAG方式,其仿真器与单片机的连接电气图如下: 除标准的4个IO接口外,还有nTRST、RTCK、RESET,分别表示的含义如下: nTRST:可选项,内核的调试复位信号,以用来对TAPController进行复位(初始化) RTCK:可选项,目标端反馈给仿真器的时钟信号,用来同步TCK信号的产生,不使用时直接接地 RESET:可选项,与目标板上的系统复位信号相连,可以直接对目标系统复位。同时可以检测目标系统的复位情况,为了防止误触发应在目标端加上适当的上拉电阻。 JTAG在使用过程中,标准的4根线是必须要连接的,其他三根根据实际情况连接。 SWD方式 SWD:SW(Serial Wire Mode Interface),串行接口线模式。在串行线模式,只有针TCLK和TMS使用。TDO数据输出引脚是一个可选。也就是说SWD只需要3根线就可以实现烧录与调试,分别是时钟线、数据线和地线。相比于JTAG的7根调试线,SWD连接和使用更加方便,其稳定性和可靠性也有进一步提升,通过配置SWD方式,还可最大化的利用单片机的IO口,使A15、PB3、PB4做普通IO口使用。市面上的J-Link下载器也支持SWD方式,其仿真器与单片机的连接电气图如下: SWDIO:串行数据线,用于数据的读出和写入,与TMS复用 SWDCLK:串行时钟线,提供所需要的时钟信号与TCLK复用 特殊IO口定义 在常用的32位ARM单片机中,PA13、A14、A15、PB3、PB4这几个IO默认配置成调试专用,其具体的定义在手册中如下: 也就是说,如果在单片机初始化中不对这几个IO口进行配置,这些IO将无法作为普通IO口使用,有时候为了方便布线和管理,需要对这其中的某几个IO口进行设置的。 程序配置 需要进行配置的情况大致是,已经通过Keil软件设置成SWD方式进行烧录,这时需要在程序中添加以下代码: rcu_periph_clock_enable(RCU_AF); //开启复用时钟 gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE); //选择SWD调试方式 //gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE); //SWD或者4线JTAG 以上是GD32单片机提供的库函数设置,通过上面的两句话,就可以将A15、PB3、PB4做普通IO使用,PA13、A14做SWD的下载调试IO口使用。使用STM32CubeMX配置STM32芯片的过程如下,首先在STM32CubeMX中的配置如下:选择Pinout -> System Core -> SYS -> Serial Wire即可。 生成代码工程之后,在代码中的体现如下: _ __HAL_RCC_AFIO_CLK_ENABLE(); //打开复用时钟 __HAL_AFIO_REMAP_SWJ_NOJTAG(); //只选择SWD方式 //__HAL_AFIO_REMAP_SWJ_NONJTRST() SWD或者4线JTAG 需要注意的是在使用STM32CubeMX生成底层代码时,如果在之初没有选择Serial Wire,则默认处于NO Debug的状态,第一次可以烧录进程序,当第二次烧录时,就出现烧录不成功,显示没有找到芯片。处理的方式为:首先使用STM32CubeMX从新选择正确配置生成工程,点击烧录,在烧录的同时,将单片机的REST引脚拉低,当出现进度条时,取消REST引脚的拉低配置。出现这种情况的原因在于第一次烧录进去的程序没有配置SWD接口。 总结 本篇首先学习了以前经常使用的JTAG和SWD的烧录方式,讲述了如何将A15、PB3、PB4做普通IO使用,主要包含两类单片机GD32和STM32的程序配置。最后对于一些可能出现的情况讲述了其对应的解决方案。鉴于笔者知识面有限,如上述内容存在问题,请联系笔者更正,谢谢! 现存的问题:在单片机中如果使用TIM3的编码器模式,就会将SWD接口设置成普通IO口,不知道有没有好的解决方案? |
|
|
|
只有小组成员才能发言,加入小组>>
3269 浏览 9 评论
2947 浏览 16 评论
3446 浏览 1 评论
8967 浏览 16 评论
4041 浏览 18 评论
1084浏览 3评论
562浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
556浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2294浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1850浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 15:26 , Processed in 1.050204 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号