使用J-Link为STM32F103下载程序

STM32不像51单片机一类的可以直接使用proteus来软件模拟,很多时候是使用硬件仿真的,所以需要使用到J-Link。千里之行始于足下,首先就要学会使用J-Link为STM32下载程序。

STM32使用J-Link下载程序还有一个好处就是,不需要手动去拨动BOOT0来选择启动模式。使用J-Link下载程序,所有步骤都可以在PC端操作完成,最后只要按一下板子上的RST键就可以运行了(适当配置以后,可以不按RST键直接运行)。

===================阶段一:J-Link安装驱动===================

首先肯定要有一个J-Link,长这个样子:

一端是20脚的排线,一端是USB口。

将USB口插入电脑。然后再设备管理器中查看是否能够检测到JLink设备。如果已经安装了驱动程序,那么是能够看到如下一项的:

如果没有安装驱动程序,那么会看到这样的图像:

并且J-Link上面的一盏小绿灯也会闪烁不停。

驱动程序可以使用Jlink驱动程序.zip中的exe文件安装。安装过程很简单,在此不累述了。唯一需要注意的是,当程序安装完毕之后,会弹出一个对话框:

要记得勾选那个选项,这样Keil MDK才能使用J-Link。

=================阶段二:在Keil MDK5中编写测试代码================

本次示例代码是运行在STM32F103C8上面的。这个型号是各种教程里面最常用的,也是意法半导体最流行的型号了。这块板子长这个样子:

我买的是最简开发板,所以引脚比较少。

这段测试代码的目标就是,驱动一个LED小灯,让它不断闪烁。这个LED连接在PA5引脚上。

代码如下:

main.c

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

void led_init()
{
    GPIO_InitTypeDef t_gpio;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    t_gpio.GPIO_Pin=GPIO_Pin_5;
    t_gpio.GPIO_Mode=GPIO_Mode_Out_PP;
    t_gpio.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&t_gpio);
}

void delay(u32 p_count)
{
    while(p_count--);
}

int main()
{
    led_init();
    while(1)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
        delay(0x0FFFFF);
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);
        delay(0x0FFFFF);
    }
}

代码很简单,就是在led_init函数中,开启PA5的时钟,把PA5引脚设置为推挽输出、最大翻转频率为10Mhz。

STM32F10X系列单片机的工程模板可以下载stm32f10x_template.zip。下载解压后,直接把user目录中的main.c替换成上述内容即可编译通过。

==================阶段三:下载程序到STM32====================

程序编译通过以后,就可以把程序下载如板子了。这里有个比较坑的地方是,J-Link居然不会给板子供电,也就是说,需要用usb线或者其他方式给STM32F103供电。于是乎,连线有点多啊,电脑连JLink的usb口,Jlink的排线连STM32的排阵,同时在来一根usb线给STM32供电。实测发现,JLink的usb与供电的usb并不需要“共同地”,应该是JLink内部和STM32进行了“共同地”。连线如下:

接下来就需要在Keil MDK5中配置JLink:

(1)点击菜单 Project => Options for Target ‘Targer 1’…:

(2)在弹出的对话框中,选择Debug选项卡,然后将Use下拉框中的内容改为“J-LINK / J-TRACE Cortex”:

(3)接着选择Utilities选项卡,点击“–Use Debug Driver–” 旁边的Settings按钮:

(4)在弹出的对话框中,勾选”Reset and Run”:

该选项的意思是下载完就让板子从头开始运行。如果不勾选,需要手动给板子一个Reset信号。

点击确定之后,J-Link就设置完成了。

要下载程序,只需要点击主界面上的“Load”按钮:

于是就可以看见程序烧写入了板子:

========================阶段四:搭建电路运行====================

其实这一节不写也无所谓了,因为文章的主题只是用J-Link写入程序。不过为了完美,还是看看程序运行后的样子吧。

根据代码,LED是接在PA5上面的,至于“阳极接VCC、阴极接PA5”还是“阳极接PA5、阴极接GND”无所谓,反正是推挽输出。我用的是后者,毕竟更加符合逻辑。

于是电路为:PA5引脚 ====> 1K电阻 ====> 发光二极管 ====>GND,运行之后,LED闪烁~