ubuntu下建立stm32开发环境:程序烧录openocd+openjtag

发布者:神光骑士最新更新时间:2018-10-13 来源: eefocus关键字:ubuntu  stm32  开发环境  程序烧录 手机看文章 扫描二维码
随时随地手机看文章

上一篇博客写了在ubuntu下,建立stm32开发环境,程序也已经编译好生成main.bin,接下来就是要把该文件烧录到stm32上.在Linux下给arm烧录程序主要使用openocd,这个软件开源,而且支持众多芯片,从ARM9到A8都可以,当然STM32也可以.支持的JTAG工具也很多,JLINK ST-LINK OSBDM都可以,我这正好有一个openjtag基于FT2232C的,也是被支持的.


参考:


How-to manual  Installing a toolchain for Cortex-M3/STM32 on Ubuntu   by Peter Seng

博主最近在电脑上自建了博客,以后会更多的用那个了,欢迎关注访问,里面也有很多有用资源:http://www.embbnux.com


一  安装openocd

在ubuntu下安装openocd:

sudo apt-get install openocd


也可以到官网下载源码包自己编译


二 安装openjtag驱动


插上openjtag

user@ubuntu:~/$ lsusb 
Bus 002 Device 005: ID 093a:2521 Pixart Imaging, Inc.  
Bus 002 Device 003: ID 1457:5118 First International Computer, Inc. OpenMoko Neo1973 Debug board (V2+)


第二个就是了,记下ID 1457:5118

sudo gedit /etc/udev/rules.d/45-ftdi2232-libftdi.rules

在里面添加

SYSFS{idProduct}=="5118", SYSFS{idVendor}=="1457", MODE="666", GROUP="plugdev"

   权限666,使用openocd就不用sudo了.

sudo /etc/init.d/udev restart

拔下在插上就可以了.

三 使用openocd 连openjtag

JTAG接口配置文件openjtag.cfg.根据JTAG设备不同,修改下面

#interface configuration openjtag############################# 
interface ft2232 
ft2232_device_desc "USB<=>JTAG&RS232" 
ft2232_layout jtagkey 
ft2232_vid_pid 0x1457 0x5118


可以参考openocd目录下的文件:/usr/share/openocd/scripts/interface,主要是设备ID以及设备名字,可以通过dmesg | grep usb命令查看.

要烧录stm32f103就得有这个设备的相关配置,可以查看/usr/share/openocd/scripts/target/stm32f1x.cfg

这里把两个文件合在一起openocd.cfg

#daemon configuration############################################################### 
telnet_port 4444 
gdb_port 3333 
 
#interface configuration openjtag############################# 
interface ft2232 
ft2232_device_desc "USB<=>JTAG&RS232" 
ft2232_layout jtagkey 
ft2232_vid_pid 0x1457 0x5118 
 
#board configuration################################################################ 
# Adjust Work-area size (RAM size) according to MCU in use: 
#STM32F103RB --> 20KB 
#set WORKAREASIZE 0x5000 
#STM32F103ZE --> 64KB 
set WORKAREASIZE 0x10000 
 
#target configuration############################################################### 
# script for stm32f1x family 
if { [info exists CHIPNAME] } { 
set _CHIPNAME $CHIPNAME 
} else { 
set _CHIPNAME stm32f1x 

if { [info exists ENDIAN] } { 
set _ENDIAN $ENDIAN 
} else { 
set _ENDIAN little 

# Work-area is a space in RAM used for flash programming 
# By default use 16kB 
if { [info exists WORKAREASIZE] } { 
  set _WORKAREASIZE $WORKAREASIZE 
} else { 
  set _WORKAREASIZE 0x4000 

# JTAG speed should be <= F_CPU/6. F_CPU after reset is 8MHz, so use F_JTAG = 1MHz 
adapter_khz 500 
adapter_nsrst_delay 100 
jtag_ntrst_delay 100 
#jtag scan chain 
if { [info exists CPUTAPID] } { 
 set _CPUTAPID $CPUTAPID 
} else { 
# See STM Document RM0008 
# Section 31.6.3 
  set _CPUTAPID 0x3ba00477 

jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID 
if { [info exists BSTAPID] } { 
# FIXME this never gets used to override defaults... 
  set _BSTAPID $BSTAPID 
} else { 
# See STM Document RM0008 
# Section 31.6.2 
# Low density devices, Rev A 
 set _BSTAPID1 0x06412041 
# Medium density devices, Rev A 
 set _BSTAPID2 0x06410041 
# Medium density devices, Rev B and Rev Z 
 
 set _BSTAPID3 0x16410041 
 set _BSTAPID4 0x06420041 
# High density devices, Rev A 
 set _BSTAPID5 0x06414041 
# Connectivity line devices, Rev A and Rev Z 
 set _BSTAPID6 0x06418041 
# XL line devices, Rev A 
 set _BSTAPID7 0x06430041 
# VL line devices, Rev A and Z In medium-density and high-density value line devices 
 set _BSTAPID8 0x06420041 
# VL line devices, Rev A 
 set _BSTAPID9 0x06428041 

jtag newtap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID1 \ 
    -expected-id $_BSTAPID2 -expected-id $_BSTAPID3 \ 
    -expected-id $_BSTAPID4 -expected-id $_BSTAPID5 \ 
    -expected-id $_BSTAPID6 -expected-id $_BSTAPID7 \ 
    -expected-id $_BSTAPID8 -expected-id $_BSTAPID9 
 
set _TARGETNAME $_CHIPNAME.cpu 
target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_TARGETNAME 
 
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 
 
# flash size will be probed 
set _FLASHNAME $_CHIPNAME.flash 
flash bank $_FLASHNAME stm32f1x 0x08000000 0 0 0 $_TARGETNAME 
 
# if srst is not fitted use SYSRESETREQ to 
# perform a soft reset 
cortex_m reset_config sysresetreq


开始烧录:

  < 1 >  在一个终端下执行:
            openocd -f openocd.cfg

出现:
Open On-Chip Debugger 0.7.0 (2013-05-15-17:28) 
Licensed under GNU GPL v2 
For bug reports, read 
    http://openocd.sourceforge.net/doc/doxygen/bugs.html 
Info : only one transport option; autoselect 'jtag' 
adapter speed: 500 kHz 
adapter_nsrst_delay: 100 
jtag_ntrst_delay: 100 
cortex_m3 reset_config sysresetreq 
Info : clock speed 500 kHz 
Info : JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3) 
Info : JTAG tap: stm32f1x.bs tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0) 
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

没有提示出错,就表示连接上STM32了 .如果出现出错,就在开发板上按下RESET 键复位,查看BOOT0和BOOT1有没有设置出错.


< 2 > 在另一个终端下,输入:
       telnet localhost 4444

依次输入:
       reset halt 
       flash probe 0 
       stm32f1x mass_erase 0 
       flash write_bank 0 /you_stm32_project_dir/main.bin 0 
       reset run

程序就烧好了,按下reset键,就开始运行了.

 要输入这么多命令太麻烦了,写个perl脚本使它一步运行.

首先安装perl-telnet
        sudo apt-get install libnet-telnet-perl

在工程目录下新建do_flash.pl文件
#!/usr/bin/perl 
use Net::Telnet; 
 
$numArgs = $#ARGV + 1; 
if($numArgs != 1){ 
   die( "Usage ./do_flash.pl [main.bin] \n"); 

 
$file = $ARGV[0]; 
$ip = "127.0.0.1"; 
$port = 4444; 
$telnet = new Net::Telnet ( 
   Port => $port, 
   Timeout=>10, 
   Errmode=>'die', 
   Prompt =>'/>/'); 
 
$telnet->open($ip); 
 
print $telnet->cmd('reset halt'); 
print $telnet->cmd('flash probe 0'); 
print $telnet->cmd('stm32f1x mass_erase 0'); 
print $telnet->cmd('flash write_bank 0 '.$file.' 0'); 
print $telnet->cmd('reset halt'); 
print $telnet->cmd('exit'); 
 
print "\n";

在根目录下的Makefile文件里面加入这段语句:
flash:all 
    ./do_flash.pl $(TOP)/main.bin

这样只要,执行make flash就可以直接运行第二步了,方便简介.


关键字:ubuntu  stm32  开发环境  程序烧录 引用地址:ubuntu下建立stm32开发环境:程序烧录openocd+openjtag

上一篇:Linux下如何搭建stm32开发环境(二)
下一篇:ubuntu下建立stm32开发环境:GCC安装以及工程Makefile建立

推荐阅读最新更新时间:2024-03-16 16:16

详细解析STM32中的堆栈机制
刚拿到STM32时,你只编写一个死循环 编译后,就会发现这么个程序已用了1600多的RAM,这要是在51单片机上,会心疼死了,这1600多的RAM跑哪儿去了,分析.map文件,你会发现是堆和栈占用的 在startup_stm32f10x_md.s文件中,它的前面几行就有以下定义: 这下明白了吧,STM32在启动的时候,RAM首先分配给使用到的全局变量,还有调用库占用的一些数据(不太清楚是什么数据),然后再将剩余的空间分配给Heap和Stack。由于内存空间是启动时实现分配好的,所以当动态分配内存的需求过多的时候,就会产生堆栈空间不足的问题。 查阅网上的资料,理解堆和栈的区别: - (1)栈区(stack):由编译器自动
[单片机]
详细解析<font color='red'>STM32</font>中的堆栈机制
基于ZigBee和STM32的室内智能照明系统的设计
在人们的传统意识中,照明系统仅以照明为目的。传统的照明系统中主要的控制方式有手动控制方式和自动控制方式。其中手动控制方式简单、有效,但是过于依赖人工操作,并且控制相对分散,不能有效管理;自动控制方式主要是由时钟元件、光电元件或两者组合的方式来实现对照明设备的控制,这种控制方式减少了对人员的依赖性,管理相 对集中,实现了照明控制的自动化,但却不能对照明系统进行调光控制。 此外,随着生活水平的不断提高,人们对日常生活的无线化、网络化、智能化、节能化的需求越来越强烈,以上两种传统的照明控制系统已经无法满足人们对日常生活品质的需求。基于上述原因提出了一种基于ZigBee和STM32的室内智能照明系统的设计。 1 系统总体设计 本系
[电源管理]
基于ZigBee和<font color='red'>STM32</font>的室内智能照明系统的设计
stm32中的数据类型定义
STM32F10X.H 1 #include core_cm3.h 2 #include system_stm32f10x.h 3 #include stdint.h 4 5 /** @addtogroup Exported_types 6 * @{ 7 */ 8 9 /*! STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ 10 typedef int32_t s32; 11 typedef int16_t s16; 12 typedef int8_t s8; 13 14 typed
[单片机]
STM32单片机(二)-ST_LINK V2连接与代码下载
硬件 如果你是买的正点原子的开发板,那跟着视频资料走就行。 如果觉得那个贵,自己也有基础,可以买一块这个stm32f103c8t6。加一个ST-Link。也就几十块。 再买些传感器,焊几个灯。做做实验够了。 我以前用过野火的板子。参加过电子设计竞赛,所以有点基础。 我用的板子:stm32f103c8t6 烧录器:传输代码的工具 ST-Link V2 需要安装驱动和资料:http://pan.baidu.com/s/1miya4OC#path=%252F 其他,传感器,LED等等。 使用 1、先把上面的驱动安装了,然后可以在设备管理器,找到你的设备 2、安装MDK5(我用的是这个,当然也
[单片机]
<font color='red'>STM32</font>单片机(二)-ST_LINK V2连接与代码下载
STM32指针的理解
指针的定义 : 自己总结为,指针是用来存放某种类型变量的地址的变量 比如 unit8 * p = 0x5555 5555 指针p 表示用来存放 unit8类型变量的地址的变量 *指针是变量 *指针是存放地址的变量 *指针是存放某种类型变量的地址的变量 百度上定义说: 它的值直接指向(points to)存在电脑存储器中另一个地方的值。 上例子中 *p 就表示0x5555 5555这个地址中存放的数 指针定义的格式:(数据类型+星号)+变量名称 比如下面两个例子 int * xxx YYY * xxx 指针的含义: 此时xxx这个变量就成为一个指针,这个
[单片机]
stm32 GPIO口配置操作
stm32里面最基本的思路就是使用外设相应寄存器之前,必须开启控制对应寄存器的时钟,读者可到技术手册中查询相应的时钟控制的相应的寄存器。 这里首先开启stm32普通io口的时钟。 GPIO 作为通用输入输出口使用时,当有外部中断设置时才需要开启AFIO时钟,否则不需要开启AFIO 时钟。 然后就是进行gpio结构体的初始化设置 GPIO 常用设置里包括三个结构体的使用如下: 1、GPIO_InitTypeDef为GPIO的基本参数设置结构体,其中GPIO_Pin表示引脚号,GPIO_Speed表示引脚的速度,GPIO_Mode表示引脚的输入输出模式选择。通过这三个基本设置实现了
[单片机]
STM32速成笔记(10)—IWDG
一、IWDG简介 独立看门狗 (Independent Watchdog, IWDG ),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。 二、STM32的IWDG 2.1 STM32的IWDG简介 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗
[单片机]
<font color='red'>STM32</font>速成笔记(10)—IWDG
STM32单片机是怎样执行中断函数中的应用的
在STM32单片机的编程当中,中断函数的名称都是xxx_IRQHandler格式的。那当编译程序的时候是怎么知道这是一个中断函数的呢? 每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。 ST提供的固件库当中,有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就可以了。 而这些名字就是一个个的中断函数入口地址。在启动代码中便有这些定义。如下图所示:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved