当前位置:首页 > 程序设计
  • pic单片机高手实用篇,pic单片机程序设计

    pic单片机高手实用篇,pic单片机程序设计

    pic单片机在学习和工作中均扮演着重要角色,在往期文章中,小编曾对pic单片机汇编指令加以介绍,以帮助大家更好掌握pic单片机。而在本文中,将介绍pic单片机程序设计内容,以助大家写出更为优美的pic单片机程序,主要内容如下。 1、PIC单片机程序的基本格式 先介绍二条伪指令: EQU ——标号赋值伪指令 ORG ——地址定义伪指令 PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。 TITLE This is …… ;程序标题 ;-------------------------------------- ;名称定义和变量定义 ;-------------------------------------- F0    EQU  0 RTCC   EQU  1 PC    EQU  2 STATUS  EQU  3 FSR   EQU  4 RA    EQU  5 RB    EQU  6 RC    EQU  7 ┋ PIC16C54 EQU 1FFH ;芯片复位地址 PIC16C56 EQU 3FFH PIC16C57 EQU 7FFH ;----------------------------------------- ORG PIC16C54 GOTO MAIN   ;在复位地址处转入主程序 ORG   0          ;在0000H开始存放程序 ;----------------------------------------- ;子程序区 ;----------------------------------------- DELAY MOVLW 255 ┋ RETLW 0 ;------------------------------------------ ;主程序区 ;------------------------------------------ MAIN MOVLW B‘00000000’ TRIS RB       ;RB已由伪指令定义为6,即B口 ┋ LOOP BSF RB,7 CALL DELAY BCF RB,7 CALL DELAY ┋ GO TO LOOP ;------------------------------------------- END       ;程序结束 注:MAIN标号一定要处在0页面内。 2、PIC单片机程序设计基础 1) 设置 I/O 口的输入/输出方向 PIC16C5X单片机的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O 控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。 MOVLW 0FH  ;0000 1111(0FH) 输入 输出 TRIS 6    ;将W中的0FH写入B口控制器, ;B口高4位为输出,低4位为输入。 MOVLW 0C0H ; 11 000000(0C0H) RB4,RB5输出0 RB6,RB7输出1 2) 检查寄存器是否为零 如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例: MOVF 10,1      ;F10→F10,结果影响零标记状态位Z BTFSS STATUS,Z    ;F10为零则跳 GOTO NZ        ;Z=0即F10不为零转入标号NZ处程序 ┋          ;Z=1即F10=0处理程序 3) 比较二个寄存器的大小 要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。 例如F8和F9二个寄存器要比较大小: MOVF 8,0       ;F8→W SUBWF 9,0      ;F9—W(F8)→W BTFSC STATUS,Z   ;判断F8=F9否 GO TO F8=F9 BTFSC STATUS,C    ;C=0则跳 GO TO F9>F8       ;C=1相减结果为正,F9>F8 GOTO F9< F9       ;C=0相减结果为负,F9  ┋ PIC单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。 MOVLW  TABLE     ;表头地址→F10 MOVWF  10 ┋ MOVLW  1        ;1→W,准备取“1”的线段值 ADDWF  10,1      ;F10+W =“1”的数据地址 CALL  CONVERT MOVWF  6        ;线段值置到B口,点亮LED ┋ CONVERT MOVWF  2        ;W→PC TABLE RETLW  0C0H      ;“0”线段值 RETLW  0F9H      ;“1”线段值 ┋ RETLW  90H       ;“9”线段值 9)“READ……DATA,RESTORE”格式程序 “READ……DATA”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以F10为数据表起始地址,F11做数据指针。 POINTER  EQU  11   ;定义F11名称为POINTER ┋ MOVLW   DATA MOVWF   10     ;数据表头地址→F10 CLRF   POINTER   ;数据指针清零 ┋ MOVF   POINTER,0 ADDWF 10,0      ;W =F10+POINTER ┋ INCF    POINTER,1  ;指针加1 CALL CONVERT      ;调子程序,取表格数据 ┋ CONVERT MOVWF   2    ;数据地址→PC DATA  RETLW   20H    ;数据 ┋ RETLW 15H      ;数据 如果要执行“RESTORE”,只要执行一条“CLRF POINTER”即可。 10) PIC单片机 延时程序 如果延时时间较短,可以让程序简单地连续执行几条空操作指令“NOP”。如果延时时间长,可以用循环来实现。下例以F10计算,使循环重复执行100次。 MOVLW D‘100’ MOVWF 10 LOOP  DECFSZ 10,1   ;F10—1→F10,结果为零则跳 GOTO LOOP ┋ 延时程序中计算指令执行的时间和即为延时时间。如果使用4MHz振荡,则每个指令周期为1μS。所以单周期指令时间为1μS,双周期指令时间为2μS。在上例的LOOP循环延时时间即为:(1+2)*100+2=302(μS)。在循环中插入空操作指令即可延长延时时间: MOVLW  D‘100’ MOVWF  10 LOOP   NOP NOP NOP DECFSZ 10,1 GOTO LOOP ┋ 延时时间=(1+1+1+1+2)*100+2=602(μS)。 用几个循环嵌套的方式可以大大延长延时时间。下例用2个循环来做延时: MOVLW   D‘100’ MOVWF   10 LOOP  MOVLW   D‘16’ MOVWF   11 LOOP1  DECFSZ   11,1 GOTO    LOOP1 DECFSZ   10,1 GOTO LOOP ┋ 延时时间=1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(μS) 以上便是小编此次带来的全部内容,希望大家喜欢。

    时间:2019-11-25 关键词: pic单片机 单片机 程序设计

  • 长春市高新东卓汽车电子:多领域全发展

    长春市高新东卓汽车电子:多领域全发展

     2019年,东卓公司凭借着敏锐的嗅觉、雄厚的实力和拼搏的精神,抓住发展机遇,成立了吉林省首家协作机器人生产企业——长春市遨博机器人有限公司,再度领跑行业。公司开展协作机器人的研发、生产和技术服务,为传统制造企业提供全方位的智能制造解决方案。相关产品和技术服务已获得了德国大陆集团的认可,在大陆汽车电子(中国区)全部6家工厂开始批量应用。在第十二届东北亚博览会上,东卓的相关产品和业务受到了省市领导们的关注,并对公司的产品给予了充分的认可。 自2010年成立以来,东卓就培养和吸纳了一大批致力于电子设计,程序设计和SMT贴装技术等方面的高精尖人才,与位列国内外销售第一矩阵的汽车制造品牌企业保持着 在汽车娱乐功能、汽车安全功能、控制系统等产品和技术方面的长期、稳定合作,赢得了客户的高度好评。公司先后获得国家高新技术企业、吉林省科技小巨人、长春市科技小巨人、软件认证企业、市级技术中心等资质认定。   东卓在目光专注于助推科技前行的同时,还关注着被人工智能替代的劳动者未来的就业需求和发展方向,与优秀的海归教师团队共同成立了长春高新智能制造培训学校。学校以培养智能制造领域的综合应用人才为办学宗旨,在提高学员智能制造相关技能的同时,还为其讲解世界知名企业生产运营升级的成功经验,以期为国家培养先进的技术型管理人才。学校以“繁星四射、智慧长青”为校训,为中国智造早日实现,贡献着东卓人的力量。学校已与省内10所高校进行战略合作,每年可输出2000~3000名机器人技术人才。 与此同时,东卓还积极投身慈善事业,多次参与社会资助,购买孤儿的手工作品、农产品,并为省孤儿学校的孩子们捐赠大量医疗药品。为祖国未来的花朵贡献着自己的一份力量。 发展汽车电子技术和业务,成为长春汽车电子行业的翘楚;成立智能制造技术培训学校,现已与工信部合作共建智能技术人才培养基地;开展协作机器人的研发生产,得到了行业内龙头企业的应用和认可。     对于开拓进取、成己达人的东卓来说,荣誉和佳绩是蒸蒸日上的基石,更是继往开来的动力。东卓不断激发东卓人的创新意识,持续加大科研投入,并成功申报了8项实用新型专利及20余项软件著作权。同时战略性的延展产业布局,与北京航空航天大学、吉林大学等著名科研院校进行战略合作,全力打造“产学研”一体化的企业运营模式。     9年来,东卓勇于创新的脚步从未停歇,追求卓越的梦想从未磨灭,用铿锵有力的成长步履,书写了浓墨重彩的诗篇。现在,东卓正在购地建厂,进一步扩能增产,计划明年9月将完成搬迁入驻。 历经9年的上下求索与砥砺前行,长春市高新东卓汽车电子有限公司(以下简称“东卓”)已发展成为一个业务广、跨度大、服务好,以汽车、医疗、航天等多领域为服务主体的品牌企业。面对新形势,站在新起点,东卓已经具备了挑战未来、卓越创新的全部必要条件,向尽早实现东北卓越的电子制造生产厂的梦想,成为“东北富士康”的目标奋力前行。

    时间:2019-08-30 关键词: 电子设计 smt贴装技术 程序设计

  • 10S计时汇编语言程序设计

    辛辛苦苦编了一个10s循环计时的程序,原理图和程序如下:   ORG 0000H AJMP MAIN ORG 000BH AJMP INTT0 ORG 0030H MAIN:CLR P2.7 CLR P2.6 MOV DPTR,#TAB CLR A MOV R2,#0H MOV R3,#0H MOV TMOD,#01H MOV TH0,#4CH MOV TL0,#00H SETB EA SETB ET0 SETB TR0 HERE: CJNE R2,#14H,HERE MOV R2,#0H PUSH ACC MOVC A,@A+DPTR MOV P0,A POP ACC INC A INC R3 CJNE R3,#0AH,HERE MOV R3,#00H ;此处用DJNZ 更方便,只不过R3的初始值要设置为0AH,同时取消INC R3指令(此行上面第二行) CLR A AJMP HERE ORG 80H INTT0:MOV TH0,#4CH MOV TL0,#00H INC R2 RETI TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END

    时间:2019-08-13 关键词: 汇编语言 10s计时 程序设计

  • 16×16位定点数加、减法模块程序设计

    (1)包含必要的头文仵及定义全局变量。  (2)双字节加法子程序,入口地址为accb+acca,出口地址为accb。  

    时间:2019-03-08 关键词: 减法 模块 点数 设计教程 程序设计

  • 浮点数加减法模块程序设计

    (1)包含必要的头文件及定义全局变量。  

    时间:2019-03-07 关键词: 模块 加减法 浮点数 设计教程 程序设计

  • PIC系列单片机程序设计基础二

    http://f9       ;c=0相减结果为负,f9         ┋   4) 循环n次的程序   如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以f10做计数器,使程序循环8次。       count equ 10     ;定义f10名称为count(计数器)          ┋       movlw 8       movwf count loop   ;循环体    loop           ┋       decfsz count,1    ;count减1,结果为零则跳       goto loop       ;结果不为零,继续循环           ┋       ;结果为零,跳出循环   5)“if……then……”格式的程序   下面以“if x=y then goto next”格式为例。       movf x,0      ;x→w       subwf y,0     ;y—w(x)→w       btfsc status,z   ;x=y 否       goto next      ;x=y,跳到next去执行。          ┋       ;x≠y   6)“for……next”格式的程序   “for……next”程序使循环在某个范围内进行。下例是“for x=0 to 5”格式的程序。f10放x的初值,f11放x的终值。       start  equ  10       daend  equ  11           ┋       movlw 0       movwf start     ; 0→start(f10)       movlw 5       movwf daend     ;5→daend(f11)   loop           ┋      incf start,1     ;start值加1      movf start,0      subwf daend,0     ;start=daend ?(x=5否)      btfss status,z      goto loop        ;x<5,继续循环           ┋       ;x=5,结束循环   7)“do while……end”格式的程序   “do while……end”程序是在符合条件下执行循环。下例是“do while x=1”格式的程序。f10放x的值。      x  equ  10        ┋      movlw  1      movwf  x     ;1→x(f10),作为初值   loop        ┋      movlw 1      subwf x,0      btfss status,z   ;x=1否?      goto loop      ;x=1继续循环        ┋        ;x≠1跳出循环   8) pic单片机查表程序   查表是程序中经常用到的一种操作。下例是将十进制0~9转换成7段led数字显示值。      设led为共阳,则0~9数字对应的线段值如下表:十进数 线段值 十进数 线段值 0 c0h 5 92h 1 c9h 6 82h 2 a4h 7 f8h 3 b0h 8 80h 4 99h 9 90h      pic单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入w,接着调用子程序,子程序的第一条指令将w置入pc,则程序跳到数据地址的地方,再由“retlw”指令将数据放入w返回到主

    时间:2019-02-26 关键词: 基础 嵌入式开发 系列 单片机 程序设计

  • PIC单片机与16位串行D/A转换器程序设计

    pic单片机与16位串行d/a转换器程序设计如下所示:  欢迎转载,信息来源维库电子市场网()

    时间:2019-02-19 关键词: 转换器 pic 嵌入式开发 单片机 程序设计

  • PIC系列单片机程序设计基础三

    http://  pic单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入w,接着调用子程序,子程序的第一条指令将w置入pc,则程序跳到数据地址的地方,再由“retlw”指令将数据放入w返回到主程序。下面程序以f10放表头地址。       movlw  table     ;表头地址→f10         movwf  10          ┋       movlw  1        ;1→w,准备取“1”的线段值       addwf  10,1      ;f10+w =“1”的数据地址       call  convert       movwf  6        ;线段值置到b口,点亮led          ┋   convert movwf  2        ;w→pc table       retlw  0c0h      ;“0”线段值       retlw  0f9h      ;“1”线段值          ┋       retlw  90h       ;“9”线段值   9)“read……data,restore”格式程序   “read……data”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以f10为数据表起始地址,f11做数据指针。       pointer  equ  11   ;定义f11名称为pointer          ┋       movlw   data       movwf   10     ;数据表头地址→f10       clrf   pointer   ;数据指针清零          ┋       movf   pointer,0         addwf 10,0      ;w =f10+pointer          ┋      incf    pointer,1  ;指针加1      call convert      ;调子程序,取表格数据          ┋   convert movwf   2    ;数据地址→pc   data  retlw   20h    ;数据          ┋      retlw 15h      ;数据   如果要执行“restore”,只要执行一条“clrf pointer”即可。   10) pic单片机 延时程序   如果延时时间较短,可以让程序简单地连续执行几条空操作指令“nop”。如果延时时间长,可以用循环来实现。下例以f10计算,使循环重复执行100次。      movlw d‘100’      movwf 10   loop  decfsz 10,1   ;f10—1→f10,结果为零则跳      goto loop       ┋   延时程序中计算指令执行的时间和即为延时时间。如果使用4mhz振荡,则每个指令周期为1μs。所以单周期指令时间为1μs,双周期指令时间为2μs。在上例的loop循环延时时间即为:(1+2)*100+2=302(μs)。在循环中插入空操作指令即可延长延时时间:       movlw  d‘100’       movwf  10   loop   nop       nop       nop       decfsz 10,1       goto loop        ┋   延时时间=(1+1+1+1+2)*100+2=602(μs)。   用几个循环嵌套的方式可以大大延长延时时间。下例用2个循环来做延时:       movlw   d‘100’       movwf   10   loop  movlw   d‘16’       movwf   11   loop1  decfsz   11,1       goto    loop1       decfsz   10,1       goto loop       ┋   延时时间=1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(μs)   11) pic单片机rtcc计数器的使用   rtcc是一个脉冲计数器,它的计数脉冲有二个来源,一个是从rtcc引脚输入的外部信号,一个是内部的指令时钟信号。可以用程序来选择其中一个信号源作为输入。rtcc可被程序用作计时之用;程序读取rtcc寄存器值以计算时间。当rtcc作为内部计时器使用时需将rtcc管脚接vdd或vss,以减少干扰和耗电流。下例程序以rtcc做延时:       rtcc  equ  1       ┋       clrf  rtcc    ;rtcc清0       movlw  07h       option    ;选择预设倍数1:256→rtcc   loop  movlw  255   ;rtcc计数终值       subwf  rtcc,0       btfss status,z   ;rtcc=255?       goto loop        ┋   这个延时程序中,每过256个指令周期rtcc寄存器增1(分频比=1:256),设芯片使用4mhz振荡,则:   延时时间=256*256=65536(μs)   rtcc是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。   12) 寄存器体(ban

    时间:2019-02-18 关键词: 基础 嵌入式开发 系列 单片机 程序设计

  • PIC单片机程序设计的基本格式

    http://  为了快速掌握pic单片机源程序的基本结构,这里给出一个典型的程序结构框架。建立源程序时首先用伪指令title提供程序的标题,接着给出整个程序的总说明,并用列表伪指令list指定所用单片机型号和文件输出格式,再利用include伪指令读入mpasm中提供的定义文件如《p16f84?inc》,然后对片内常用资源进行定义,再给出一般程序的基本结构框架。现举例如下。   title“this is……”;程序标题   ;程序说明   list p=16f84,f=1nhx8m   ;   include <p16f84.inc>   -config_rc_qsc &_wdt_0ff…   ;资源定义和变量定义   status equ 03   fsr equ 04   porta equ 05   portb equ 06   j equ 01f   k equ 01e   ;…………………       org 0000 ;       goto main ;跳过中断矢量       org 0004        goto intsrv;子程序入口地址   ;……………………………………   main       ;从0005h开始放主程序       call initports ;端口初始化       call inittimers;定时器初始化       …   intsrv …     ;中断服务程序区   svbrth…      ;子程序区     end      ;程序结束符   当然,在编写程序时可根据实际情况加以调整。下面是一份实际程序清单,要求将数据88h写入pic16f84单片机内部eeprom的20h单元,而后再从20h单元将其读出。   list p=16f84,f=inhx8m   ;……………………………   status equ  03  ;定义寄存器   eedata equ  08   eeadr equ  09   intcon equ  0bh   eecon1 equ  88h   eecon2 equ  89h   ;…………………………   rd    equ  0    ;定义位   wr  equ  1   rp0   equ  5   gie  equ  7   ;…………………………        org  0        goto wrstart   ;……………………………        org  10h   wrstart         ;写入操作开始        clrw      ;清w,使w=0        bcf status,rp0 ;选bank0        movlw 20h        movwf eeadr   ;地址→eeadr        movlw 88h        movwf eedata  ;写入数据→                 ;eedata        bsf status,rp0 ;选bank1        bsf eecon1,2 ;写操作使能允许        bcf intcon,gie ;关闭所有的中断        movlw 0x55        movwf eecon2  ;55h→eecon2        movlw 0xaa        movwf eecon2  ;aah→eecon2       bsf eecon1,wr ;启动写操作        bsf intcon,gie ;恢复开中断   rdstart          ;读出操作开始        bcf status,rp0        movlw 20h        movwf eeadr   ;地址→eeadr        bsf status,rp0        bsf eecon1,rd ;启动读操作        bcf status,rp0        movf eedata,w ;将eeprom                 ;数据读入w   end

    时间:2019-01-11 关键词: pic 嵌入式处理器 格式 单片机 程序设计

  • 基于 DSP 的网络通信程序设计

    摘要:通过分析网卡基本通信过程控制和数字信号处理器(dsp)对网卡直接编程方法,成功设计基于dsp的网络通信程序,从而最终实现dsp系统数字化和网络化的融合。 关键词:dsp 网络通信程序 通信协议 网卡dsp芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以dsp为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升dsp系统的应用价值和市场前景。将dsp技术与网络技术相结合,必须解决两个关键问题:一是实现dsp与网卡的硬件接口技术,二是基于dsp的网络通信程序设计。dsp与网卡的硬件接口技术参考文献[1]有比较详尽的论述,以下主要讨论基于dsp的网络通信程序设计。1 通信协议的制定协议是用来管理通信的法规,是网络系统功能实现的基础。由于dsp可以实现对网卡的直接操作,对应于osi网络模型,网卡包含了物理层和数据链路层的全部内容,因此,规定了数据链路层上数据帧封装格式,就可以为基于dsp的局域网络中任意站点之间的通信提供具体规范。因为以太网是当今最受欢迎的局域网之一,在以太网中,网卡用于实现802.3规程,其典型代表是novell公司的ne2000和3com公司的3c503等网卡,所以研究工作中的具体试验平台是以dsp为核心构成的以太局域网,主要用于语音的实时通信,所使用的网卡为novell公司的ne2000网卡。ne2000网卡的基本组成请见参考文献[2],其核心器件是网络接口控制器(nic)dp8390。该器件有三部分功能:第一是ieee802.3mac(媒体访问控制)子层协议逻辑,实现数据帧的封装和解封,csma/ca(带碰撞检测功能的载波侦听多址接入)协议以及crc校验等功能;第二是寄存器堆,用户对ne2000网卡通信过程的控制主要通过对这些寄存器堆中各种命令寄存器编程实现;第三是对网卡上缓冲ram的读写控制逻辑。dp8390发送和接收采用标准的ieee802.3帧格式。ieee802.3参考了以太网的协议和技术规范,但对数据包的基本结构进行了修改,主要是类型字段变成了长度字段。所以,以dsp为核心的局域网内通信数据包基本格式如图1所示。dsp读出数据包和打包从目的地址开始。目的地址用来指明一个数据帧在网络中被传送的目的节点地址。ne2000支持3种目的地址:单地址、组地址及广播地址。单地址表示只有1个节点可以接收该帧信息;组地址表示最多可以有64个字节接收同一帧信息;而广播地址则表示它可以被同一网络中的所有节接收。源地址是发送帧节点的物理地址,它只能是单地址。目的地址和源地址指网卡的硬件地址,又称物理地址。在源地址之后的2个字节表示该帧的数据长度,只表示数据部分的长度,由用户自己填入。数据字段由46~1500字节组成。大于1500字节的数据应分为多个帧来发送;小于46字节时,必须填充至46字节。原因有两个:一是保证从目的地址字段到帧校验字段长度为64字节的最短帧长,以便区分信道中的有效帧和无用信息;二是为了防止一个站发送短帧时,在第一个比特尚未到达总线的最远端时就完成帧发送,因而在可能发生碰撞时检测不到冲突信号。ne2000对接收到的从目的地址字段后小于64字节的帧均认为是“碎片”,并予以删除。在数据字段,根据系统的具体功能要求,用户可以预留出若干个字节以规定相应的协议,以便通信双方依据这些字节中包含的信息实现不同的功能。2 基于dsp的网络通信程序设计如果基于网络操作系统,用户可以利用一些软件对网络操作系统的支持,很容易地编写出优秀的网络通信程序,但这些程序必须依附于网络操作系统。而在dsp环境下,必须深入了解网络接口控制器(nic)的工作原理[2],通过对网络直接编程,实现局域网内任意站点之间的通信而完全抛开网络操作系统。dsp对网卡的通信过程控制就是dsp对dp8390中各种寄存器进行编程控制,完成数据分组的正确发送和接收。dp8390的所有内部寄存器都是8位,映像到4个页面。每个页面有16个可供读写的寄存器地址(ra=00h~0fh)。页面的选择由命令寄存器ca控制。第0页寄存器用于收发过程,第1页寄存器主要用于dp8390的初始化,第2页寄存器则用于环路诊断。dsp对寄存器的操作是将寄存器作为dsp的端口设备,其实际物理端口地址(ppa)为网卡基本i/o端口地

    时间:2018-12-19 关键词: DSP 网络通信 总线与接口 程序设计

  • 智能仪器电源的MCU控制程序设计

    智能仪器电源的MCU控制程序设计

    智能仪器电源的MCU控制程序设计介绍一种仪器仪表电源供电程序的设计方法,提供了硬件框图及软件程序。  关键词:电源;程序设计;单片机 2.UAV of BUAA, Beijing 100083, China)?   在备用电源供电的情况下,如果交流电220V又重新恢复,则K断开,DCAC=1,“交流”指示灯亮,“电池”指示灯灭,不发出报警声,ALARM=0。  另外,在仪器工作的同时,备用电源是否充电由CHARGE来控制。当电池电压小于某个参数值时,CHARGE=1,开始充电,“充电”灯亮。它还可以对备用电源的充电时间进行控制,对其输出电压进行检测,随时进行报警提示,以保证仪器的可靠工作。?         根据交流掉电启用备用电源时要报警,而当交流恢复供电时不报警的实际要求,在程序设计时,用一个标志单元CDCAC和一个临时单元CDCAC1的内容来判断仪器仪表是否交流掉电、是否报警。  此MCU的电源控制系统设计实用可靠,程序全部用汇编语言编写,实时性强。该设计已经成功地用在智能医疗仪器(如:智能输液泵)中,对于其他智能仪器的开发也有借鉴的作用。

    时间:2018-12-17 关键词: 仪器 智能 电源 嵌入式处理器 程序设计

  • PIC单片机端口RB中断的程序设计

    在本例中采用了模块化的编程方法,程序的规划、编写、拼装、调试、修改、  程序流程如图1~图7所示。  图1 主程序流程  图2 中断服务子程序流程  图3 低发音子程序流程  图4 高发音子程序流程  图5 高声1s子程序流程  图6 3声发音子程序流程  图7 延时1s子程序流程  程序的模块化设计是较常用的编程方式,这可以给阅读和交流带来便利。  (1)定义端口及寄存器地址。  (2)定义复位向量和中断向量。  (3)主程序。  (4)int中断处理函数。  (5)r13中断处理函数。  (6)低音调发声子程序。  (7)高音调发声子程序。  (8)发声1s子程序。  (9)关trm0延时子程序。  (10)断续发声3次报警子程序。  (11)关软件延时子程序。  欢迎转载,信息来源维库电子市场网()

    时间:2018-12-17 关键词: pic 端口 总线与接口 单片机 程序设计

  • PIC单片机与PC机串行通信模块的程序设计

    1 串口通信程序设计  (1)pc机串口中断响应函数。 (2)单片机中串口的调试程序 (1)包含必要的头文件及定义程序需要到全局变量。  欢迎转载,信息来源维库电子市场网()

    时间:2018-12-14 关键词: 通信 模块 总线与接口 单片机 程序设计

  • S3C2440的UART程序设计

    //************UART查询**************extern void Init_check_uart(){rGPHCON |= 0xa0;rGPHUP = 0x0;rULCON0 = 0x03;rUCON0 = 0x05;rUFCON0 = 0x00;rUMCON0 = 0x00;rUBRDIV0 = 53;//PCLK=50MHz,波特率57600dely(10);}extern void send_char(unsigned char c){while(!(rUTRSTAT0 &0x04));rUTXH0 = c;}extern void send_str(unsigned char *str){int i=0;while(str[i]){send_char((unsigned char) str[i++]);}}//************UART中断**************void __irq uart0_irq(void){unsigned long irqOffSet;Led_all_on();dely(350);Led_all_off();dely(350);irqOffSet = rINTOFFSET;// 取得中断号rSUBSRCPND |= 1

    时间:2018-11-27 关键词: uart s3c2440 程序设计

  • Franklin C-51语言程序设计基础

    1.1Franklin C-51数据类型 Franklin C-51编译器支持下列数据类型:数据类型长度值域bit 1 字节0 或 1signed char1 字节-128~+127unsigned char1 字节0~255signed int2 字节-32768~+32867unsigned int2 字节0~65535signed long4 字节-2147483648~+2147483647unsigned long4 字节0~4294967295float 4 字节±1.176E-38~±3.40E+38指针 1~3 字节对象地址sbit 1 位0 或 1sfr 1 字节0~255sfr16 2 字节0~65535 编译的数据类型(如结构)包含上表所列的数据类型。由于8051系列是8位机,因而不存在字节校准问题。这意味着数据结构成员是顺序放置的。 数据类型的转换:当计算结果隐含着另外一种数据类型时,数据类型可以自动进行转换,例如,将一个位变量赋给一个整型变量时,位型值自动转换为整型值,有符号变量的符号也能自动进行处理。这些转换也可以用C语言的标准指令进行人工转换。1.2 数据类型的物理结构1.2.1 bit “bit”类型只有1位,不允许有位指针和位数组。位对象始终位于8051 CPU的可寻址RAM空间。如果程序控制流允许,L51将位对象交迭。1.2.2signed/unsigned char;data/idata/pdata 指针“char”类型标量和基于存贮器的“data/idata/pdata”指针具有1个字节长度(8 bits)。1.2.3signed/unsigned int/short;xdata/code 指针“int”和“short”类型标量及指向xdata/code区域的指针具有2字节长度(16bits)。整型值(或偏移)0x1234以下面方式保存在内存中:地址: +0 +1内容: 0x120x341.2.4signed/unsigned long“long”类型标量长为4个字节(32 bits),值0x12345678以下面方式放置:地址: +0 +1 +2 +3内容: 0x12 0x34 0x56 0x781.2.5“一般”指针“一般”指针包括3个字节:2字节偏移和1字节存贮器类型:地址:+0 +1 +2内容: 存贮器类型偏移高位 偏移低位第一个字节代表了指针的存贮器类型,存贮器类型编码如下:存贮器类型 IDATA XDATA PDATADATACODE值 12 3 4 5使用其它类型值可能导致不可预测的程序动作。XDATA类型的0x1234地址作为指针表示如下:地址:+0+1 +2内容: 0x02 0x12 0x34当用常数作指针时,必须注意正确定义存贮器类型和偏移。下例将值0x41写入绝对地址为0x8000的外部数据存贮器:#defineXBYTE ((char *)0x20000L)XBYTE[0x8000]=0x41;上例中用其它常数索引或索引变量也起作用。这样,各种存贮器类型的绝对地址可以一种非常有效的方式访问。但有一个例外,即SFR。注意:绝对地址定义为“long”型常量,低16位包含偏移,高8位表明了xdata类型。为了表示这种指针,必须用长整数来定义存贮器类型。C51编译器不检查指针常数,用户必须选择有实际意义的值。1.2.6float“float”类型为4个字节(32位),使用的格式与IEEE-754标准(32位)具有24位精度,尾数的高位始终为“1”,因而不保存,位的分布如下:l 1位符号l 8位指数位l 23位尾数符号位是最高位,尾数为最低的位,内存中按字节存贮如下:地址:+0 +1 +2+3内容:MMMM MMMM MMMM MMMME MMM MMMMS EEE EEEE其中:S:符号位,1=负,0=正E:指数(在两个字节中),偏移为127M:23位尾数,最高位“1”浮点值——12.5的十六进制为0xC1480000,它按下面方式存贮:地址:+0+1+2+3内容: 0x00 0x00 0x48 0xc18051不包括捕获浮点错误(例外)的中断向量。用户软件因此必须对错误条件作出适当反应。下面推荐一种方法(也可以用其它可靠办法):“union”用来保存浮点值,这个“union”必须包括一个“float”和一个“unsigned long”,以根据IEEE对错误作出响应。除了通常浮点值外,IEEE标准可能出错的条件以下面二进制值表示,为检查可能出现的计算错误,可在计算后进行检查。因为当执行一个运算时考虑了每个运算符的错误状态并且该状态被送到结果中。 NaN0xFFFFFFF不是一个数+INF0x7F80000正无穷(正溢出)-INF0XFF80000负无穷(负溢出)1.3C-51 的扩充定义1.3.1特殊功能寄存器的声明 MSC-51 系列包括多种寄存器,其中一些具有特殊功能,如定时器,端口的控制寄存器等,为了能够直接访问这些寄存器,C51编译器提供了一种定义的自主形式,这是必要的,因为这些定义与标准C语言是不兼容的。为了支持这些特殊功能寄存器(SFR)的声明,引入了关键词“sfr”,语法如下:sfr-dcl:sfr sfr_name=int_constant例:sfr p0=0x80;sfr p1=0x90;必须注意的是“sfr”后不是一个地址而是一个名字。因此上例中名字P0和P1(port0和port1)定义为特殊功能寄存器并被赋予相应的绝对地址,名字可按意愿自由选取,源文件中不应有先定义的sfr名字。“=”号后的地址必须是常数,不允许带有运算符的表达式,这个常数表达式必须在特殊功能寄存器的地址范围内,位于0X80到0XFF之间。8051系列寄存器数量和类型是极其不同的,因此建议将所有特别的“sfr”声明放入一个头文件,头文件包括8051一些系列成员中的SFR定义。进一步的定义可由用户用一文件编辑器产生。1.3.2对SFR的16位数据访问 在新的8051系列产品中,SFR在功能上经常组合为16位的,为了有效的访问这类SFR,使用定义“sfr16”,当“SFR”的高端直接位于低端后时,对SFR16位的访问是可能的。例如8052的定时器2就是这种情况,16位声明的语法与“sfr”相同,SFR低地址部分必须作为sfr16的地址:例:sfr16 T2=0xCC /*Timer2:T2L=0CCH,T2H=0CDH */ sfr16 RCAP2=0xCA/*RCAP2L=0CAH,PCAP2H=0CBH */本例中,T2(由T2L和T2H组成)和RCAP2(由RCAP2L和RCAP2H组成)被定义为16位SFR,即使在这种情况下,声明中的名字后仍不是赋值语句,而是一个SFR地址,高字节必须直接位于低字节之后,这种声明适用于所有新的SFR,但不能用于Timer0和Timer1。1.3.3SBIT:特殊功能位声明在典型的8051应用问题中,经常需要单独访问SFR中的位,C51扩充功能使之成为可能,特殊位,象SFR一样,不与标准C语言兼容,使用保留字“sbit”可访问位寻址对象。与SFR声明一样,用保留字“sbit”声明某些特殊位接受符号名,“=”后语句将绝对值地址赋给变量名,这种地址分配有三种方法:方法1:sfr_name^int_constant当字节是特殊功能寄存器的地址可用这个方法。sfr_name必须是已定义的SFR的名字,“^”后的语句定义了基地址上的特殊位的位置,该位置必须是一个0~7的数。例: sfr PSW=0xD0; sfr LE=0xA8; sbit OV=PSW^2; sbit CY=PSW^7;方法2:int_constant^int_constant这种方法以一整常数作基地址,该值必须在0x80~0xFF之间,并能被8整除,确定位的位置方法同上。例: sbit OV=0xD0^2;sbit CV=0xD0^7;sbit EA=0xA8^7;方法3: int_constant这种方法是将位的绝对地址赋给变量,地址必须位于0x80~0xFF之间。例: sbit OV=0xD2; sbit CY=0xD7; sbit EA=0xAF;特殊功能位代表了一个独立的声明类,它不能与其它声明和位域互换。1.3.4BIT:位标量声明除了通常的C数据类型外,C51编译器支持“bit”数据类型,对此有下列扩充与限制:(1)函数可包含类型为“bit”的参数,也可将其作为返回值。bit bfunc(bit b0,bit b1){/*……*/return(b1);}注:使用禁止中断(#pragma disable)或包含明确的寄存器组切换(using n)的函数不能返回位值,在这种情况下,编译器会识别出来并产生一个错误信息。(2)位标量声明的语法及C声明的语义sta

    时间:2018-11-21 关键词: c franklin 51语言 程序设计

  • PIC单片机中的程序设计

    PIC单片机(Peripheral Interface Controller)是一种用来开发去控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。本内容讲述了PIC单片机中的程序设计方面的学习 1、PIC单片机程序的基本格式  先介绍二条伪指令:  EQU ——标号赋值伪指令  ORG ——地址定义伪指令  PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:   PIC16C54/55:1FFH   PIC16C56:3FFH   PIC16C57/58:7FFH  一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。  TITLE This is …… ;程序标题  ;--------------------------------------  ;名称定义和变量定义  ;--------------------------------------  F0    EQU  0  RTCC  EQU  1  PC    EQU  2  STATUS  EQU  3  FSR   EQU  4  RA    EQU  5  RB    EQU  6  RC    EQU  7         ┋  PIC16C54 EQU 1FFH ;芯片复位地址  PIC16C56 EQU 3FFH  PIC16C57 EQU 7FFH  ;-----------------------------------------  ORG PIC16C54 GOTO MAIN   ;在复位地址处转入主程序  ORG   0          ;在0000H开始存放程序  ;-----------------------------------------  ;子程序区  ;-----------------------------------------  DELAY MOVLW 255      ┋      RETLW 0  ;------------------------------------------  ;主程序区  ;------------------------------------------  MAIN     MOVLW B‘00000000’     TRIS RB       ;RB已由伪指令定义为6,即B口      ┋  LOOP     BSF RB,7 CALL DELAY             BCF RB,7 CALL DELAY      ┋     GO TO LOOP  ;-------------------------------------------     END       ;程序结束   注:MAIN标号一定要处在0页面内。  2、PIC单片机程序设计基础  1) 设置 I/O 口的输入/输出方向  PIC16C5X单片机的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O 控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。    MOVLW 0FH  ;0000 1111(0FH)            输入 输出    TRIS 6    ;将W中的0FH写入B口控制器,            ;B口高4位为输出,低4位为输入。    MOVLW 0C0H ; 11 000000(0C0H)              RB4,RB5输出0 RB6,RB7输出1  2) 检查寄存器是否为零  如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:    MOVF 10,1      ;F10→F10,结果影响零标记状态位Z    BTFSS STATUS,Z    ;F10为零则跳    GOTO NZ        ;Z=0即F10不为零转入标号NZ处程序       ┋          ;Z=1即F10=0处理程序  3) 比较二个寄存器的大小  要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。  例如F8和F9二个寄存器要比较大小:    MOVF 8,0       ;F8→W    SUBWF 9,0      ;F9—W(F8)→W    BTFSC STATUS,Z   ;判断F8=F9否    GO TO F8=F9    BTFSC STATUS,C    ;C=0则跳    GO TO F9>F8       ;C=1相减结果为正,F9>F8    GOTO F9

    时间:2018-11-15 关键词: pic 单片机 程序设计

  • PIC单片机人机接口模块4×4行列式键盘的程序设计

    程序的主流程如图1所示。  图1 程序的主流程  程序主要分为两个部分:一个部分不停地监测是否有按键按下,另一个部分查看哪一个键按下。  在初始状态下,4个列输出端口输出低电平,即rd0~rd3输出低电平,然后持续监测4个行输入端口rd4~rd7的状态是不是高电平。  如果没有按键按下,则rd4~rd7的状态是高电平;如果有按键按下,则被按下的键对应的行输入端口的电平就会被拉低,rd4~rd7会有低电平出现,对4个行输入端口rd4~rd7的电平的监测即为对按键的监测。  在4个行输入端口rd4~rd7上出现低电平时,就转到查询程序see。键盘扫描子程序流程如图2所示,按键查询子程序流程如图3所示。  图2 键盘扫描子程序流程  图3 按键查询子程序流程  查询程序see分以下5个步骤。  · 在4个列输出端口rd0~rd3上输出,判断哪一个端口输入低电平。  · 在4个列输出端口rd0~rd3上输出0111,查看4个行输入端口rd4~rd7是否有低电平出现;如果有低电平出现,则可以确定哪个键按下,跳出查询程序:否则进入下一项。  · 在4个列输出端口rd0~rd3上输出1011,查看4个行输入端口rd4~rd7是否有低电平出现;如果有低电平出现,可以确定哪个键按下,并跳出查询程序;否则进入下一项。  · 在4个列输出端口rd0~rd3上输出1101,查看4个行输入端口rd4~rd7是否有低电平出现;如果有低电平出现,可以确定哪个键按下,跳出查询程序;否则进入下一顼。  · 在4个列输出端口rd0~rd3上输出1110,查看4个行输入端口rd4~rd7是否有低电平出现;如果有低电平出现,可以确定哪个键按下,跳出查询程序;否则进入下一项。  程序清单如下。  (1)主程序。  完成初始化,对4×4的键盘输入进行扫描,然后将其输入通过端口d的低4位输出,显示时先闪两下再输出。  (2)键盘扫描子程序。  test为出口参数,若有键按下则子程序返回时test=0ffh,若没有键按下,则子程序返回时test=0。  (3)按键查询子程序。  当有按键按下时,运行该程序。value中存放被按下的按键的键值,s0~515的键值为0~15。  (4)延时自程序。  count1存放外部循环次数,count2存放内部循环次数。  欢迎转载,信息来源维库电子市场网()

    时间:2018-11-06 关键词: 人机 行列式 总线与接口 单片机 程序设计

  • 基于ARM嵌入式系统的RFID驱动程序设计

    摘 要: 针对RFID系统的应用需求,基于ARM9微处理器的S3C2440嵌入式系统,实现了nRF905无线收发器的数据传输,为RFID系统提供了底层软硬件接口。硬件使用基于S3C2440微控制器的嵌入式平台和单片无线收发器nRF905;软件使用ARM-Linux内核,利用上层应用程序发送接收数据,底层驱动程序进行硬件间的数据传输。关键词: RFID;nRF905;设备驱动程序;ARM-Linux;s3c2440微控制器 RFID具有读取速度快、读取距离远、储存信息量大、标签上数据可加密、使用寿命长、工作环境适应性强等多种优点,已经在各领域广泛应用[1]。 将RFID技术与嵌入式系统相结合,将射频识别模块嵌入到嵌入式系统中,在嵌入式Linux下通过设计驱动程序实现射频模块的收发功能。嵌入式RFID系统增加了RFID技术的通用性和可移植性,丰富了嵌入式系统通信接口外设功能,提升了嵌入式技术在无线通信领域的发展空间。 当前的嵌入式系统中并不支持RFID系统,所以要进行硬件和软件两方面的扩展。硬件方面主要根据nRF905无线收发器的电气特性进行接口扩展,利用基于ARM9嵌入式平台的扩展口对nRF905进行控制;软件方面利用Linux内核良好的移植性和扩展性,编写驱动程序控制射频模块的收发功能,在底层驱动以收集和分组数据并传递给上层应用程序,由上层应用程序与用户进行交互。本文所研究的基于嵌入式系统的RFID驱动,将为嵌入式RFID系统提供底层软硬件接口程序,为嵌入式内核增添RFID管理机制,为上层应用程序提供良好服务,降低嵌入式RFID的开发难度,缩短开发周期,从而降低其成本,使RFID的应用更加普及。1 硬件电路的实现 图1是nRF905无线收发器接口扩展的硬件电路原理图,硬件电路的实现主要基于

    时间:2018-11-01 关键词: RFID ARM 嵌入式系统 驱动开发 程序设计

  • PIC单片机人机接口模块独立式按键的程序设计

    下面是查询方式下的键盘程序,程序中没有使用散转指令,也没有软件防抖动措施,只包括按键查询、键功能程序转移。fp0~fp7为功能程序入口地址标号,prom0~prom7分别为每个按键的功能程序。  程序清单(设i/o口为p1口)如下:  由此程序可以看出,各按键由软件设置了优先级,优先级顺序依次为0~7。  本节所讲的模块中,在按键按下或弹起时经常会出现一些毛刺,所以在首次检测到输入的值后应添加一个延时程序delay。  这个延时程序延时100ms左右,延时后再检测输入的值,如果改变了,则证明此时按键按下或弹起时读出的值是不准确的,再调用延时程序delay,延时100ms之后,再继续查看。  本例采用4mhz的品振,时钟周期是250ms,由于pic单片机的指令周期是4倍时钟周期,即1μs,要延时100ms,可以设置两层循环,另外,跳转指令goto需要两个指令周期,自减1并且判断指令decfsz需要一个指令月期,所以要进行100000/(2+1)约为33333个指令周期。  现设内部循环为256次,则外部循环约为130次,因为本例对延时的精度要求并不很高,所以本例中的设计只进行了近似的计算,程序流程如图所示。  图 程序流程  (1)主程序。  首先设置端口c为输入口,端口d为输出口,然后循环检测端口c的状态,若有键按下,则延时去抖动,再由端口d显示。  (2)延时子程序  入口参数:count1存放外部循环次数,count2存放内部循环次数。  欢迎转载,信息来源维库电子市场网()

    时间:2018-10-29 关键词: 按键 人机 总线与接口 单片机 程序设计

  • 基于VxWorks的NANDFLASH驱动程序设计

    基于VxWorks的NANDFLASH驱动程序设计

      0 引 言  目前,随着电子技术的不断发展,计算机技术也得到飞速的发展,产生了很多新技术。但就计算机的基本结构来说,还是基本采用了冯·诺依曼结构。然而冯·诺依曼结构的一个中心点就是存储一控制,所以存储器在计算机系统中的作用是非常重要的。嵌入式计算机作为计算机中的一个类别,对执行速度和系统可靠性都有较强的要求,这也决定了嵌入式系统不仅要有实时性很强的操作系统,同时也需要一种安全、快速的存储设备。同时,嵌入式系统经常会涉及到海量数据的存储,这就要求存储设备必须具有可靠性高,功耗低,容量大,掉电数据不丢失等特点,而NAND FLASH芯片正好具有这些优点。  VxWorks是嵌入式领域内公认的最有特色的高性能实时操作系统之一。它以其良好的可靠性和卓越的实时性,被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等。  目前,在VxWorks实现上,涉及文件系统的文章不少,但一般都是针对容量较小,操作相对简单的NORFLASH实现的。本文讨论了如何在以AMCC公司的Power PC芯片PPC440epx为核心的嵌入式平台上,利用三星公司的大容量NAND FLASH实现文件系统的具体办法。  1 三星NAND FLASH芯片K9F2G08QOM  K9F2G08QOM芯片的容量为256 M×8 b="2" Gb的数据区,再加上64 Mb的备用区。一块这种芯片被分为2 048个块,每个块又分为64页,每页由2 KB的数据区加上64 B的备用区组成。如图1所示,列地址为12 b(A11~A0)。当A12为0时,A10~A0确定对每页中2 KP;数据的访问;当A12为1时,访问的是64 B的备用区。由于NANDFLASH芯片在出厂时就可能出现坏块(块中的某个或多个bit不能有效的进行读写),为了将其标注出来,三星公司保证每个坏块的第一页和第二页备用区第一个byte的数据没有被初始化为0xFF。设计人员要确保在对该芯片进行擦除之前,先将这个信息保留起来(建一个坏块表)。行地址为17 b(A28~A12)。它确定了对2 048块×64页=128 K个页中的某一页进行访问。为了简化NAND FLASH芯片的管脚,其地址和数据信息共享8个I/O管脚,因此,其29 B的地址信息被设计为5个周期进行传输。具体操作如表1所示。  注:起始地址是列地址;L表示必须置为低电平  对NAND FLASH的操作流程比较简单,即在第一个周期里送操作相关的命令字,然后送地址,以及相应的数据,最后送确认字。需要说明的是,由于地址、命令和数据都共用8个I/O管脚来进行传输,因此在硬件上必须要有专用的管脚来区分传输类型(在传输命令的时候,命令锁存使能信号CLE有效;在传输地址的时候,地址锁存使能信号ALE有效)。具体的命令字、时序和操作流程在K9F2G08Q0M的数据手册上有较详细的描述,在此不一一详述。  2 PPC440epx的NAND FLASH接口  AMCC公司的PPC440epx芯片是一款性能指标较高的嵌入式CPU芯片,其主频可以达到667 MHz,拥有DDR2接口,可支持千兆以太网,USB 2.0接口,支持浮点运算,同时还支持NAND FLASH芯片。  PPC440epx使用一个NAND FLASH Controller作为外部NAND FLASH与其外部总线通信的接口电路,该控制器最多可以支持4个NAND FLASH芯片,每个芯片的容量可以为4~256 MB,每页的大小可以为512 B+16 B或者2 KB+64 B。NDFC(NANDFLASH Controller)的存在使得对NAND FLASH的操作变的非常简单。根据前面对K9F2G08Q0M的介绍可知,对NAND FLASH的操作需要在硬件上产生ALE,CLE信号来区分传输类型。NDFC给程序设计人员提供两种实现时序的方法:硬件实现,软件实现。如果是前者, NDFC提供了几个寄存器:命令寄存器、地址寄存器、数据寄存器、配置寄存器和状态寄存器。通过对这几个寄存器执行相应的读/写操作就可以产生相应的时序。例如,如果需要对NAND FLASH写命令字80H,则只需将80H写人命令寄存器即可。NDFC自动将80H送到I/O7~I/O0上,同时置CLE为有效状态。而软件实现方法是根据K9F2G08Q0M的时序要求,通过对硬件控制寄存器中相应的bit写1或者0,使得对应的控制信号为高电平或者低电平。设计人员可以根据自己的情况,选择实现方法。这里推荐采用硬件实现的方法。不过,在有问题时,可采用软件实现的方法来进行调试。  3 TrueFFS简介  TureFFS(Ture Flash File System)是M-Systems公司为VxWorks操作系统定制的实现FLASH块设备的接口。通过使用TFFS,应用程序对FLASH的读写就像对拥有MS-DOS文件系统的磁盘设备操作一样。对于上层设计人员,TFFS屏蔽了底层多种多样FLASH设备的具体细节。同时,由于FLASH存储芯片自身的一些特性(如擦除、编程次数有限并且操作时间较长;容易进入过度编程状态等),TFFS采用虚拟块、损耗均衡、碎片回收、错误恢复等机制来提高 FLASH的使用寿命,确保数据完整,优化性能。  4 TrueFFS的实现  4.1 TrueFFS的基本结构  TrueFFS由1个核心层和3个功能层组成,它们是翻译层(Translation Layer)、MTD(Memory Tech-nology Drivers Layer)层和Socket层,其结构框图如图2所示。  (1)交互功能。它包含了控制FLASH映射到块、wear-lev-eling、碎片回收和数据完整性所需的智能化处理功能。目前,有三种不同的翻译层模块可供选择。选择哪一种层需要看所用的FLASH介质是采用NOR-based,还是NAND-based,或者SSFDC-based技术而定。  (2)MTD(Memory Technology Driver)层实现具体的FLASH芯片底层程序设计,包括读、写、擦、ID识别、映射等功能,以及一些与FLASH芯片相关的参数设置。  (3)Socket层提供了TrueFFS和硬件之间的接口服务,负责电源管理、检测设备插拔、硬件写保护、窗口管理和向系统注册Socket等;  (4)核心层将其他3层有机结合起来,另外还处理全局问题,如信号量、碎片回收、计时器和其他系统资源等。  在VxWorks中,由于翻译层和核心层以二进制形式提供给设计人员的,因此实现TFFS的主要工作集中在对MTD层和Socket层的设计上。  4.2 Socket层的实现  如果VxWorks中包含TFFS,在系统启动后,先完成内核的初始化,之后开始进行I/O的初始化操作。系统调用UsrRoot()函数,该函数再调用 tffsDrv()函数,这样就产生如图3所示的调用流程。调用这些函数的目的之一就是注册socket驱动函数。最后的注册操作都是由 xxxRegister()函数完成(这个函数和sysTff-sInit()函数的定义都在sysTffs.c中)的。该函数是通过更新 FLSocket结构体来完成注册操作的。该结构体的定义以及相关细节可以通过阅读VxWorks的帮助文件获得,在此不详述。  sysTffs.C文件的编写,可以参考其他的BSP来完成。config目录下的任何一个BSP都有该文件,设计人员可以复制其中一个到自己的BSP目录下。例如:复制wrPpmc440gp目录下的sysTffs.c文件,再根据自己的硬件电路修改FLASH BASE ADRS以及FLASHSIZE的宏定义,同时添加宏定义:#define INCLUDE_MTD_NAND。其他地方一般不需要改动。  4.3 MTD层驱动程序的实现  要创建一个TFFS块设备,首先应该调用函数tffsDevCreate(),这样就产生了如图4所示的一系列的调用函数。系统通过这一系列的调用函数来确认具体的MTD层程序。确认过程在flIdentifyFlash()函数中完成。flIdentifyFlash()通过逐个执行 xxxIdentify()表中的程序来确定合适的MTD。如果系统只有一种FLASH,则只需写一个Identify()函数可。与Socket层类似,MTD层的核心工作也是针对一个数据结构(FLFLASH)而进行的初始化操作。通过初始化操作来注册FLASH芯片的处理函数,具体的实现是在函数 xxxldentify()中完成的。  根据前面的介绍知道,MTD层的主要功能是实现对FLASH芯片的读、写、擦、ID识别、映射等操作。而对不同FLASH芯片的相应操作是有一定差别的,所以使用不同的FLASH芯片时,MTD层的程序设计也是不一样的。开发人员的工作是根据系统使用的具体FLASH芯片来完成相应的程序设计。  Tornado提供了几种FLASH的TrueFFS MTD层驱动的参考设计。在installDir\target\src\drv\tffs中,主要包括Intel,AMD等公司的几种FLASH的 TrueFFS MTD层驱动。虽然没有需要的K9F2G08驱动程序,但可以根据其结构来设计自己的MTD程序。具体做法是在BSP目录下建立一个MTD层驱动文件,将其取名为K9F2G08Mtd.C。在该文件中首先编写函数nandMTDIdentify(),如下所示为程序片段:  完成上述代码后,剩下的工作就是完成在函数nandMTDIdentify()中引用的readFlashID(),nand-MTDRead()。 nandMTDWrite(),nandMTDErase(),nandMTDMap()这几个函数的代码编写。由于不同的FLASH芯片,时序不同,因此这几个函数的实现也不同。必须根据芯片K9F2G08的数据手册上时序的要求,对PPC440epx的相应寄存器进行读/写操作,以完成这些功能。由于篇幅原因,这几个函数的具体代码就不再赘述。建议在Boot Loader工作正常后,先在应用程序中对这些函数进行调试。这样就可以利用单步和断点等工具进行调试,并且在修改后可立即通过网络下载程序。  4.4 TrueFFS的配置  在完成上述代码的编写后,还要做如下工作:在配置文件config.h中增加定义INCLUDE_TFFS和IN-CLUDE_DOSFS,使得 TrueFFS组件和DOS文件系统被包含进来。并且要在MakeFile文件MACH_EXTRA一项中添加K9F2G08Mtd.o,这样可将 TureFFS文件驱动程序加入系统。另外,还要在tffsConfig.c文件中的mtdTable[]表中添加上述的函数nandMTDI- dentify。  5 结 语  在此介绍如何在由AMCC公司的CPU芯片PPC440epx、三星公司的NAND FLASH构成的硬件平台上和VxWorks软件平台上,实现TrueFFS。按照上述设计流程,实现了NAND FLASH的驱动程序设计。能够对K9F2G08进行正常的读、写、擦、ID识别、映射等操作。同时,在VxWorks操作系统上,实现了 TrueFFS。这样就提高FLASH使用寿命,确保数据完整,优化了FLAsH的性能。以此为基础的系统在某机载设备上得到成功运用。

    时间:2018-10-26 关键词: VxWorks nandflash 程序设计

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包