历史上的今天
返回首页

历史上的今天

今天是:2025年03月31日(星期一)

正在发生

2020年03月31日 | Linux下的avr系列的编译烧录调试方法

2020-03-31 来源:eefocus

本文环境如下:


OS系统:ubuntu 12.04(原为10.04最近升级了)


编译器 :avr-gcc


烧录软件 :avrdude


调试软件:avarice ,GDB和ddd (可视界面)


开发板:


1.xplain(xmega128a1)无法调试,只能烧录,因为官方没有公开其调试的协议。


2.Mega16开发板。


仿真器or烧录器:dragon和usbasp(使用较多)


程序编写:Vim(升级版的记事本,很好用,很推荐)


关于使用前的准备和说明


至于为什么要使用linux下开发avr,原因主要是因为比较有趣。其次便是win下的环境用起来其实并不是很方便。IAR是付费软件(但是的确好用),Avr-studio虽然是免费版,不过优缺点是太过庞大,并且是以vc2010为基础开发,这个也就算不上真正的免费了。至于win-avr其实蛮不错的。win下也可以搭建如下环境。


准备:


软件安装,软件安装建议使用ubuntu的软件中心,比较方便。需要avr-gcc,avrdude,avarice,gdb,ddd即可了。文本编辑什么都行。可以集成在codeblocks和eclipse里面。Codeblocks如此做用起来感觉不错,eclipse需要配置,但原理都是一样的。


对于命令行可以如下安装


sudo apt-get install gcc-avrbinuilts-avr avr-libc

sudo apt-get installvim

sudo apt-get installavrdude


强烈建议顺便安上手册


sudo apt-get installavrdude-doc

sudo apt-get installavarice

sudo apt-get installgdb

sudo apt-get installddd


然后就都安装完毕了。下一步就可以开始了。

开始之前需要先写一个.c的程序


代码会在文章最后和附件里提出。这是一个很简单让一个led亮的程序。


之后介绍一个makefile的东西,此物是简化操作流程的一个东西。让敲好多行命令才能完成的只需简单的一句话就行了。附件里会包含一个makefile的模板,是winavr下模板改的可用版。具体的内容是如何实现的,可以翻阅官方makefile手册和百度,谷歌。


简单介绍Makefile里面的几个命令,有过经验可以无视


AVRDUDE_PROGRAMMER = usbasp

#dragon_jtag

AVRDUDE_PORT = usb   # programmer connected to serial device

AVRDUDE_WRITE_FLASH = -Uflash:w:$(TARGET).hex

AVRDUDE_FLAGS = -p $(MCU) -P$(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)

AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)

AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)

AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)


上面这些都是定义变量,makefile里的


program: $(TARGET).hex $(TARGET).eep

     $(AVRDUDE)$(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)


当我们输入make program时就会执行上面这句之前的都不用关心了。翻译过来就变成了(如果叫main.hex)


avrdude -P usb -p m16 -c usbasp -U flash:w:main.hex

就是说用usb下的usbasp烧录m16的flash,内容为main.hex


如果用dragon的话一般用jtag就是-c dragon_jtag。具体可以查看avrdude手册。


了解之后先打开终端,找到.c文件目录下。Makefile文件放在同一目录下


根据需要更改其内容


输入make

便会输出一些信息,最后会有提示编译成功


之后就可以烧录了


烧录之前看一下烧录器是否在


输入lsusb

显然,usbasp存在。那么输入sudo make program

会在很快的时间内烧录成功,比win快的多。最后提示你烧录成功

至于debug,usbasp没有这个功能。需要用dragon的jtag。


住:Debug其实不是很推荐使用,虽然比较高效,建议利用串口的信息输入输出(以后会介绍),这是因为在进入系统的嵌入后,常规的debug经常会无法使用。


实际的命令会是


avarice -g -j usb --erase --program --filemain.hex :4242


不过如果makefile里已经写好的话直接输入sudo make debug就可以了


下面为命令的结果

现在属于等待GDB,可视化的话就是DDD的状态中了


比如在gdb.conf中添加


file main.elf


target remotelocalhost:4242


启动DDD


ddd–-debugger “avr-gdb -x gdb.conf”

也可以手起动,然后配置,ui界面比较友好。


还有一句话。makefile里面已经把上步骤都做好了~当然会根据需求要求更改的。尤其是debug的时候。


总结:本文所说有些简略了,Linux开发的困难主要在于搭建环境,因此需要多看一下相关的官方手册。


测试代码:


main.c


// avr-gcc application builder : 2011-11-1 

// Target : M16

// Crystal: 12.000Mhz

 

#include

#include

#define SET(a,b) a|(1<#define CLR(a,b) a &~(1<void port_init(void)

{

 DDRA  = 0xff;//将PA0定义为输出

 PORTA = 0xff;

 PORTB = 0x00;

 DDRB  = 0x00;

 PORTC = 0x00; //m103 output only

 DDRC  = 0x00;

 PORTD = 0x00;

 DDRD  = 0x00;

}

 

//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 //CLI(); //disable all interrupts

 port_init();

 MCUCR = 0x00;

 GICR  = 0x00;

 TIMSK = 0x00; //timer interrupt sources

// SEI(); //re-enable interrupts

 //all peripherals are now initialized

}

 

//

void main(void)

{

 init_devices();

 //insert your functional code here...

 PORTA = CLR(PORTA,3);

 while(1);  //程序挂起

}

 

Makefile:


 


# Hey Emacs, this is a -*- makefile -*-

#----------------------------------------------------------------------------

# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.

# Linux GCC using is changed by Galaxy2416

# Released to the Public Domain

#

# Additional material for this makefile was written by:

# Peter Fleury

# Tim Henigan

# Colin O'Flynn

# Reiner Patommel

# Markus Pfaff

# Sander Pool

# Frederik Rouleau

# Carlos Lamas

#

#----------------------------------------------------------------------------

# On command line:

#

# make all = Make software.

#

# make clean = Clean out built project files.

#

# make coff = Convert ELF to AVR COFF.

#

# make extcoff = Convert ELF to AVR Extended COFF.

#

# make program = Download the hex file to the device, using avrdude.

#                Please customize the avrdude settings below first!

#

# make debug = Start either simulavr or avarice as specified for debugging, 

#              with avr-gdb or avr-insight as the front end for debugging.

#

# make filename.s = Just compile filename.c into the assembler code only.

#

# make filename.i = Create a preprocessed source file for use in submitting

#                   bug reports to the GCC project.

#

# To rebuild project do "make clean" then "make all".

#----------------------------------------------------------------------------



# MCU name

MCU = atmega16

#atxmega128a1



# Processor frequency.

#     This will define a symbol, F_CPU, in all source code files equal to the 

#     processor frequency. You can then use this symbol in your source code to 

#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done

#     automatically to create a 32-bit value in your source code.

#     Typical values are:

#         F_CPU =  1000000

#         F_CPU =  1843200

#         F_CPU =  2000000

#         F_CPU =  3686400

#         F_CPU =  4000000

#         F_CPU =  7372800

#         F_CPU =  8000000

#         F_CPU = 11059200

#         F_CPU = 14745600

#         F_CPU = 16000000

#         F_CPU = 18432000

#         F_CPU = 20000000

F_CPU = 8000000



# Output format. (can be srec, ihex, binary)

FORMAT = ihex



# Target file name (without extension).

TARGET = main



# Object files directory

#     To put object files in current directory, use a dot (.), do NOT make

#     this an empty or blank macro!

OBJDIR = .



# List C source files here. (C dependencies are automatically generated.)

SRC = $(TARGET).c 


# List C++ source files here. (C dependencies are automatically generated.)

CPPSRC = 



# List Assembler source files here.

#     Make them always end in a capital .S.  Files ending in a lowercase .s

#     will not be considered source files but generated files (assembler

#     output from the compiler), and will be deleted upon "make clean"!

#     Even though the DOS/Win* filesystem matches both .s and .S the same,

#     it will preserve the spelling of the filenames, and gcc itself does

#     care about how the name is spelled on its command-line.

ASRC =



# Optimization level, can be [0, 1, 2, 3, s]. 

#     0 = turn off optimization. s = optimize for size.

#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)

OPT = s



# Debugging format.

#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.

#     AVR Studio 4.10 requires dwarf-2.

#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.

DEBUG = dwarf-2



# List any extra directories to look for include files here.

#     Each directory must be seperated by a space.

#     Use forward slashes for directory separators.

#     For a directory that has spaces, enclose it in quotes.

EXTRAINCDIRS = 



# Compiler flag to set the C Standard level.

#     c89   = "ANSI" C

#     gnu89 = c89 plus GCC extensions

#     c99   = ISO C99 standard (not yet fully implemented)

#     gnu99 = c99 plus GCC extensions

CSTANDARD = -std=gnu99



# Place -D or -U options here for C sources

CDEFS = -DF_CPU=$(F_CPU)UL



# Place -D or -U options here for ASM sources

ADEFS = -DF_CPU=$(F_CPU)



# Place -D or -U options here for C++ sources

CPPDEFS = -DF_CPU=$(F_CPU)UL

#CPPDEFS += -D__STDC_LIMIT_MACROS

#CPPDEFS += -D__STDC_CONSTANT_MACROS




#---------------- Compiler Options C ----------------

#  -g*:          generate debugging information

#  -O*:          optimization level

#  -f...:        tuning, see GCC manual and avr-libc documentation

#  -Wall...:     warning level

#  -Wa,...:      tell GCC to pass this to the assembler.

#    -adhlns...: create assembler listing

CFLAGS = -g$(DEBUG)

CFLAGS += $(CDEFS)

CFLAGS += -O$(OPT)

CFLAGS += -funsigned-char

CFLAGS += -funsigned-bitfields

CFLAGS += -fpack-struct

CFLAGS += -fshort-enums

CFLAGS += -Wall

CFLAGS += -Wstrict-prototypes

#CFLAGS += -mshort-calls

#CFLAGS += -fno-unit-at-a-time

#CFLAGS += -Wundef

#CFLAGS += -Wunreachable-code

#CFLAGS += -Wsign-compare

CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)

CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))

CFLAGS += $(CSTANDARD)



#---------------- Compiler Options C++ ----------------

#  -g*:          generate debugging information

#  -O*:          optimization level

#  -f...:        tuning, see GCC manual and avr-libc documentation

#  -Wall...:     warning level

#  -Wa,...:      tell GCC to pass this to the assembler.

#    -adhlns...: create assembler listing

CPPFLAGS = -g$(DEBUG)

CPPFLAGS += $(CPPDEFS)

CPPFLAGS += -O$(OPT)

CPPFLAGS += -funsigned-char

CPPFLAGS += -funsigned-bitfields

CPPFLAGS += -fpack-struct

CPPFLAGS += -fshort-enums

CPPFLAGS += -fno-exceptions

CPPFLAGS += -Wall

CPPFLAGS += -Wundef

#CPPFLAGS += -mshort-calls

#CPPFLAGS += -fno-unit-at-a-time

#CPPFLAGS += -Wstrict-prototypes

#CPPFLAGS += -Wunreachable-code

#CPPFLAGS += -Wsign-compare

CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)

推荐阅读

史海拾趣

成都芯进(CrossChip)公司的发展小趣事

2023年6月,成都芯进电子宣布完成超1亿元A轮融资。这一轮融资的成功,不仅为公司的发展提供了充足的资金保障,也吸引了更多知名产业机构和投资基金的关注。公司借此机会扩大了研发团队和生产规模,进一步提升了产品的研发和生产能力。

AITSEMI公司的发展小趣事

随着产品线的不断完善,AITSEMI公司开始积极寻求市场机会,并逐步在全球范围内建立销售网络。通过与各大消费电子品牌的紧密合作,AITSEMI的芯片产品成功应用于音频功放和电源管理等领域,为全球消费者提供了更优质的产品体验。同时,公司还积极拓展医疗、工业控制、照明等新兴市场,为公司的持续增长提供了强大的动力。

乔光电子(FTR)公司的发展小趣事

AITSEMI公司成立于XXXX年,创立之初便以研发高性能模拟与混合信号IC为核心目标。面对当时市场上对高性能、高性价比集成电路的迫切需求,AITSEMI团队凭借深厚的技术积累和敏锐的市场洞察力,成功开发出了一系列具有竞争力的产品,为公司的初步发展奠定了坚实的基础。

FOX [Fox Electronics]公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

Bytesonic Corporation公司的发展小趣事

随着台湾本土市场的逐渐饱和,Bytesonic Corporation开始将目光投向更广阔的大陆市场。1996年7月,公司在中国广东省东莞市石街镇成立了分公司,迈出了进军大陆市场的第一步。这一决策不仅为公司带来了更多的商机,也为其在亚洲乃至全球市场的布局打下了坚实的基础。

Henkel公司的发展小趣事

为了进一步加强对大陆市场的投资和管控,Bytesonic Corporation在1998年5月在英属维尔京群岛成立了控股公司——剑桥电子有限公司。这一举措不仅提升了公司的资本运作能力,也为其在全球范围内的业务拓展提供了更多的便利。

问答坊 | AI 解惑

机电领域中伺服电机的选择原则

提出的选择原则是将电机特性与负载特性分离开 ,并用图解的形式表示 ,这种表示方法使得驱动 装置的可行性检查和不同系统间的比较更方便 ,另外 ,还提供了传动比的一个可能范围.…

查看全部问答>

一本dsp2812的好书

最近刚刚从图书馆借到一本新书《dsp控制技术实践》。中国电力出版社出版,2009.5出版的。专门讨论dsp2812的片子的使用,比ti的中文手册薄多了,看起来挺舒服的。推荐给大家。…

查看全部问答>

最近在学Ardence RTX实时系统软件,有很多不懂的地方,下面是一个定时器程序,不太明白?

  最近在学Ardence RTX实时系统软件,有很多不懂的地方,下面是一个定时器程序,不太明白?请路过大虾们帮忙看看。 下面是源代码,包括两个文件,一个头文件,一个源文件。如下所示: /////////////////////////////////////////////////////// ...…

查看全部问答>

重开一贴...eVC 测试代码

各位大哥大姐好,工作就是问题叠问题,小弟我又来了... 开发板上有几个跳线,我写了一个测试的程序,却出问题了,大家帮忙看看... 跳线驱动部分内容: BOOL Addr_Init() { //地址映射 } BOOL WINAPI  DllEntry(HANDLE hI ...…

查看全部问答>

linux移植问题(ARM,2410)

我用make zImage编译好2.6.13的内核文件后,把/arch/arm/boot/zImage 文件烧进板子后,linux解压出错.错误信息如下: VIVI   version   0.1.4   (root@localhost.localdomain)   (gcc   version ...…

查看全部问答>

板子上把芯片尺寸画大了怎么办?

请问,板子上把芯片尺寸画大了怎么办? 我不小心把板子上面芯片的尺寸单位看错了,板子做出来芯片尺寸大了N多... 请问怎么解决? 有没有转接器之类的?可以把LQFP 48封装的线引出来啊??…

查看全部问答>

关于QEI的问题

最近正在学习luminary,用的是周立功的easyArm8962的板子,在qei的实验例程中有这么两句话:SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_6,   GPIO_DIR_MODE_HW);GPIODirModeSet( ...…

查看全部问答>

Smart Debug网络与串口调试工具(原创)

最新版本号: 1.0.1.111031        更新日期: 2011.10.26 下载地址1 http://stu.cidp.edu.cn/SmartDebug.rar 下载地址1 下载地址2 http://www.vdisk.cn/down/index/8990713A3710 下 ...…

查看全部问答>

关于热电偶的信号调理电路的问题

我要做多路的温度采集,用的是K型热电偶,电源用电荷泵转换模块,信号调理部分想用AD620和OP07做二级放大,现在有几个地方不太有把握,请做过的帮忙! 一是电源,我现在用12v电瓶供电,用电荷泵转换成+/-12v,这样的电压有一定的纹波,对信号的采 ...…

查看全部问答>