msp430单片机入门知识.ppt_第1页
msp430单片机入门知识.ppt_第2页
msp430单片机入门知识.ppt_第3页
msp430单片机入门知识.ppt_第4页
msp430单片机入门知识.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章MSP430单片机入门基础,前沿,1、MSP430系列单片机系统工程设计与实践这本书是我见过的最好的关于单片机的书,非常值得逐字逐句的彻底学习一遍。2、与51不同,MSP430单片机是RISC处理器,通过对比两者的区别,可以建立起代码移植的思想。3、MSP430单片机属于混合信号处理器,资源极其丰富,有利于全面学习硬件知识。,青岛大学-TI大学生创新中心傅强,2,1.1初识MSP430单片机,MSP430:低功耗之王,水果电池驱动1、为什么我们在乎功耗?凡是以电池为电源的电子设备都看重低功耗。几乎所有的单片机会标榜自己有低功耗方面的设计。2、MSP430为什么可以成为低功耗之王?在硬件上,cpu和不用的模块可以休眠在软件上,必须设计恰当的休眠和唤醒430是实现低功耗的必要条件,非充分条件。,青岛大学-TI大学生创新中心傅强,3,1.1.1MSP430单片机的应用前景,便携设备,高集成度、小型化。野外安置的终身电池设备。无需额外供电的自供电设备。高精度测量、控制领域。当普通单片机用。,青岛大学-TI大学生创新中心傅强,4,1.1.2MSP430单片机的特点,多时钟系统CPU时钟、功能模块时钟、休眠唤醒时钟软件设置时钟16位RISC处理器,单指令周期模块化结构各模块完全独立,不需要cpu干涉避免了cpu与外部模块复杂的数据通信学会最贵的430,等于会用了全系列430,青岛大学-TI大学生创新中心傅强,5,采用冯诺依曼结构(普林斯顿结构),程序指令存储器和数据存储器统一编址。举例:实现存储器中两数据相乘,要经过3个步骤,通过总线取两个数据和取出指令(干什么)到CPU。如果是哈佛结构,数据总线和指令总线分开。430可以在ram里跑程序,加上具有flash控制器,可实现固件更新。rom中的升级代码-复制到ram运行-擦除rom-升级rom,1.1.2MSP430单片机的特点,青岛大学-TI大学生创新中心傅强,6,科普:ROM、RAM、DRAM、SRAM、EEPROM、FLASH,我们现在用的51,都是flashrom的,但是内部没有flash控制器,所以需要EEPROM存实时数据。Msp430带flash控制器,单片机自己就能擦写flash,所以不用EEPROM。,青岛大学-TI大学生创新中心傅强,7,MSP430FE425A资源8M/s处理速度512RAM(数据)+16KBFlash(程序代码)内置Flash控制器,剩余Flash可存数据。内置时钟管理单元,可内部倍频3路同步采样、差分输入、32倍程控增益放大器的16位ADC温度传感器1.2V基准源和输出缓冲器128段LCD驱动器增强UART串口看门狗BasicTimer定时器16位TimeA定时器,3路捕获和2路PWM内置BOR复位电路16个双向可中断IO口内置电能计量模块后缀带A的,比如FE425A带硬件乘法器,青岛大学-TI大学生创新中心傅强,8,1.1.3MSP430单片机最小系统,一般单片机最小系统需要什么?电源、晶振、复位、下载/仿真接口MSP430FE425自带片内数控时钟(DCO),掉电复位电路(BOR)一般讲究一点都需要“电源监视芯片”内部时钟一般不如晶振精确可以外接手表晶振32.768k,然后倍频JTAG、SBW、可下载+调试,BSL只能下载,青岛大学-TI大学生创新中心傅强,9,1.2MSP430单片机开发软件入门,一般用IAR430软件工程管理、程序编辑、代码编译下载、仿真调试工程管理:管理外部函数、头文件。程序编辑:写代码编译:替程序员处理所有打杂的事情C-汇编调试:真正的考验水平的地方,不是所有单片机都支持调试,这是要硬件支持的。,青岛大学-TI大学生创新中心傅强,10,全速执行、单步执行。执行到光标处设置断点(在程序中加一个空操作,然后用来设断点)查看变量寄存器查看调用函数关系,青岛大学-TI大学生创新中心傅强,11,1.3MSP430单片机C语言基础,在写C语言的过程中,尽量消除不同CPU的差异,或者将差异集中到一个地方做修改,那么就能方便的实现代码移植。我们现在写C程序,就必须按此要求严格要求自己。这样才能一通百通,才能减少重复劳动。,青岛大学-TI大学生创新中心傅强,12,1.3.1变量,我们为什么要定义各种变量?定义短字节变量有哪些好处和坏处?定义长字节变量有哪些好处和坏处?一些特殊的关键字constunsignedcharTable7=1,2,3,4,5,6,7staticinta;/本地全局变量volatileintb;/不被优化_no_initintc;/不对其初始化为什么要慎重使用全局变量?,青岛大学-TI大学生创新中心傅强,13,1.3.2数学运算,尽可能避免浮点数运算。运算慢、非常慢。占用RAM多。所以应尽量避免使用浮点数float。防止定点数溢出。longintx;inta;x=a*1000;/a和1000都是int型,a65溢出应改为x=a*long(1000)或x=(long)a*1000,青岛大学-TI大学生创新中心傅强,14,小数的处理例如,温度的最后计算公式为:Deg_C=ADC*1.32/1.25-273为避免浮点数可改为:Deg_C=(long)ADC*132/125-273如需保留1位小数,则:Deg_C=(long)ADC*1320/125-2730/扩大10倍程序中加上明确注释在显示时,将小数点移位即可减小乘除法取平均时,尽量取2、4、8等2次幂,这样可以用移位代替乘除(可编译器自动)后缀带A的型号有硬件乘法器(自动使用),青岛大学-TI大学生创新中心傅强,15,1.3.3位操作,精简指令处理器如何写IO口?P2OUT=P2OUT|0 x01;/P2.0置高按位或P2OUT|=0 x01;/一般均简写成这样P2OUT,青岛大学-TI大学生创新中心傅强,16,1.3.4寄存器操作,如何理解寄存器操作?如果设计模拟电路算是天才干的事情,那么操作单片机的寄存器就算是傻瓜干的事情。处理器把能干的事全干了,需要人过问的事情,通过一系列开关让人来选择,所以这是傻瓜就能干的事情越是功能强大的处理器,需要配置的寄存器越多。处理器说明书就是用来查寄存器功能的,青岛大学-TI大学生创新中心傅强,17,宏定义帮助我们理解抽象的数字,查说明书,找到控制串口收发的是IE1寄存器的最高两位,我们可以用下面的赋值。IE1|=BIT6/开串口收中断IE1|=BIT7/开串口发中断为便于记忆和理解,头文件中有如下宏定义:#defineURXIE0(0 x40)/在MSP430 x42x.h#defineUTXIE0(0 x80)/头文件中已有IE1|=URXIE0+UTXIE0以后我们接触高级处理器的程序中,大部分都是这么写,不会像51里面直接写TMOD=0 x20这样,青岛大学-TI大学生创新中心傅强,18,特别注意:使用“|=”赋值不会影响其他位,但要搞清楚是不是要先对标志位清0。例如:PWM控制器输出模式有3个控制位,可以表示8种模式。头文件中定义了OUTMODE_0OUTMODE_7宏定义,000-111。TACCTL1|=OUTMODE_3;/011.TACCTL1|=OUTMODE_6;/110实际效果是111,也就是模式7,青岛大学-TI大学生创新中心傅强,19,1.3.5中断,中断的作用是快速响应事件430中几乎所有“资源”都带中断,为的是休眠cpu后,唤醒CPU。Cpu发送指令给模块,然后休眠。模块执行完毕后,中断唤醒CPU。中断向量表位于ROM最高段0 xFE000 xFFFF(512B)特别注意!430的中断没有中断嵌套的优先级#pragmavector=BASICTIMER_VECTOR_interruptvoidBT_ISR(void).,青岛大学-TI大学生创新中心傅强,20,Msp430 x42x头文件中的中断向量表#defineBASICTIMER_VECTOR(0*2u)/*0 xFFE0基础定时器)PORT2_VECTOR(1*2u)/*0 xFFE2P2*/PORT1_VECTOR(4*2u)/*0 xFFE8P1*/TIMERA1_VECTOR(5*2u)/*0 xFFEATimerACCR1/2*/TIMERA0_VECTOR(6*2u)/*0 xFFECTimerACCR0*/USART0TX_VECTOR(8*2u)/*0 xFFF0串口发送*/USART0RX_VECTOR(9*2u)/*0 xFFF2串口接收*/WDT_VECTOR(10*2u)/*0 xFFF4WatchdogTimer*/SD16_VECTOR(12*2u)/*0 xFFF816位ADC*/NMI_VECTOR(14*2u)/*0 xFFFCNon-maskable*/RESET_VECTOR(15*2u)/*0 xFFFEReset*/,青岛大学-TI大学生创新中心傅强,21,中断的具体过程,事先将中断服务程序入口地址装入中断向量表。中断发生后,如果中断被允许(可屏蔽中断),CPU将当前程序地址和CPU状态寄存器SR压入堆栈。跳转到中断服务程序入口,备份寄存器入堆栈。开始执行中断服务程序。退出中断前,恢复寄存器。CPU取回SR寄存器,跳转回中断前主程序地址。,青岛大学-TI大学生创新中心傅强,22,退出中断时唤醒CPU,进中断前CPU休眠,那么退出中断后CPU仍然休眠。可以在中断子程序中修改堆栈中的SR,使得中断结束后,CPU不休眠。#pragmavector=BASICTIMER_VECTOR_interruptvoidBT_ISR(void)._low_power_mode_off_on_exit();/此函数经汇编优化,青岛大学-TI大学生创新中心傅强,23,中断标志位,同类中断合并成一个总的中断。由软件判断中断标志位flag来确定具体中断。什么是标志位?不急用、待查询。#pragmavector=PORT1_VECTOR_interruptvoidP1_ISR(void)if(P1IFG,青岛大学-TI大学生创新中心傅强,24,1.3.6内部函数,头文件instrinsic.h和in430.h_low_power_mode_0();或LPM0_low_power_mode_off_on_exit();_delay_cycles(longintcycles);_enable_interrupt();或_EINT();_diaable_interrupt();或_DINT;_no_operation();或_NOP();_swap_bytes(x);_bcd_add_short(unsignedint,unsignedint),青岛大学-TI大学生创新中心傅强,25,1.3.7库函数,IAREW430提供100个库函数Ctype.h字符处理类Math.h数学类Stdio.h输入和输出类Stdlib.h通用子程序类String.h字符串处理类库函数是C语言通用的,内部函数与特定处理器有关。,青岛大学-TI大学生创新中心傅强,26,1.4文件管理,将大程序划分为若干小的C文件,最常用的划分方法是按功能模块划分(对象)。,/*DataProcess.c*/intSum(inta,intb,intc)inty;y=a+b+c;return(y);floatAverage(inta,intb,intc)floaty;y=a+b+c;return(y/3);,/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternfloatAverage(inta,c);,/*main.c*/#include“DataProcess.h”.voidmain().Tem=Average(tem1,tem2,tem3);Weight=Sum(W1,W2,W3);.,青岛大学-TI大学生创新中心傅强,27,全局变量的处理,隶属关系模糊的全局变量单独建global.c隶属于某模块的,写在模块c文件中,/*global.c*/intBattVoltage;unsignedintSystemStatus;intTemperature;,/*global.h*/ExternintBattVoltage;ExternunsignedintSystemStatus;ExternintTemperature;,/*DataProcess.c*/UnsignedcharOverflowFlag;intSum(inta,intb,intc)inty;y=a+b+c;If(y65535)OverflowFlag=1;return(y);,/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternunsignedcharOverflowFlag;,青岛大学-TI大学生创新中心傅强,28,1.5代码优化,编译器可自动对代码进行优化速度快,但占rom多速度慢,占rom少可选优化等级,等级越高,占rom越小调试阶段最好关闭优化要是不优化还有变量改变,则加volatile,青岛大学-TI大学生创新中心傅强,29,1.6风格,对于写程序代码,有3个层次首先,计算机要能读其次,要自己能读最后,要别人能读,青岛大学-TI大学生创新中心傅强,30,1.6.1变量命名规则,变量名要有含义,不要随便用abcxyz变量名最好是名词词性,1-4个单词每个单词首字母大写IntInputVoltage;IntTemperature;必须出现空格时,用下划线代替IntDegree_C;IntDegree_F;单词较长,适当简写intNumOfInputChr;IntDeg_F;多个模块都有的变量,按“模块名_变量名”CharADC_Status;IntUART1_RxcharCnt;约定俗成的变量不要改动I、j作为循环变量,p、q作为指针,s、t表示字符串,青岛大学-TI大学生创新中心傅强,31,1.6.2函数命名规则,模块名_不及物动词模块名_及物动词+名词首字母大写专用名词全部大写长单词缩写返回值是布尔型的,对返回1还是0的表意清晰,UnsignedintADC16_Sample();CharLCD_Init();CharRTC_Get();VoidPWM_SetPeriod();VoidFlash_WriteChar();VoidUART_GetChar();CharKey_GetKey();CharTouchPad_GetKey();,TransmitTxRecetiveRxCountCntTo2,CharUART_CheckTxBuff();/检查缓冲区CharUART_IsTxBuffFull();/缓冲区是否已满,青岛大学-TI大学生创新中心傅强,32,1.6.3表达式,好的表达式可以朗读出来消除歧义,运算优先级拿不准就加括号,表达式复杂就拆开。,If(UART_IsTxBuffFull()UART_ClearTxBuff();ElseUART_PutChar(0 x55);,i=5;j=+i;结果i=6,j=6等效于i=5;i=i+1;j=i;i=5;j=i+;结果i=6,j=5等效于i=5;j=i;i=i+1;,青岛大学-TI大学生创新中心傅强,33,1.6.4风格一致性,For(i=0;iDOT;i-)/对全部6位显示数据进行判断if(DispBuffi=0)DispBuffi=;/消隐小数点前的无效0elsebreak;,青岛大学-TI大学生创新中心傅强,35,功能函数的注释,/*名称:LCD_DisplayDigit()*功能:在LCD上任意位置显示一个数字*入口参数:Digit:待显示数字(09)Location:显示位置从左至右对应76543210*出口参数:无*说明:调用该函数不影响LCD其他位的显示。*范例:LCD_DisplayDigit(3,0);/在第一位(右侧最低位)显示3LCD_DisplayDigit(2,1);/在第二位显示2LCD_DisplayDigit(1,2);/在第三位显示1-显示结果:123*/voidLCD_DisplayDigit(charDigit,charLocation)charDigitSeg;/存放字形笔划的变量char*pLCD;/存放LCD显存指针的变量DigitSeg=LCD_TabDigit;/得到待显示数字的字形笔划pLCD=/在LCDM1之后Location个单元显示出数字,青岛大学-TI大学生创新中心傅强,36,1.6.6宏定义,宏定义给予常数可读性宏定义全部大写,以区别变量数据加括号,注释使用/*/,#defineTXBUFF_SIZE(128)/*发送缓冲区大小*/#defineLCD_ROW(128)/*点阵液晶行数*/#defineLCD_CLUMN(128)/*点阵液晶列数*/#defineLCD_BUF_SIZE(LCD_CLUMN*LCD_ROW/8)/*点阵液晶缓冲区大小*/,UnsignedcharTxBuffTXBUFF_SIZE;/定义发送缓冲区CharIsTxBuffFull()if(NumOfTxChars=TXBUFF_SIZE)return(1);/缓冲区是否满?elsereturn(0);,青岛大学-TI大学生创新中心傅强,37,使用宏定义时,要防止定点数溢出,宏定义的用途广泛增强程序的可移植性进行软件版本的管理,#defineVOLT_RATE(1000)/*比例系数*/.longVoltage;IntInputValue;.Voltage=InputValue*VOLT_RATE;/*可能溢出*/,#defineVOLT_RATE(long(1000)/*比例系数,强行整成long*/,青岛大学-TI大学生创新中心傅强,38,1.7可移植性,可移植性是嵌入式软件设计的重要思想用到不同的硬件,比如LCD到数码管用到不同的处理器,比如51到430,ARM编程时应尽量消除硬件差异无法消除的差异,集中到小的局部来修改,青岛大学-TI大学生创新中心傅强,39,1.7.1消除CPU差异,例如用宏定义消除IO口操作的差异此后的程序不用修改,直接用LED_ON和LED_OFF来操作IO口,#include”MSP430 x42x.h”#defineLED_ONP2OUT|=BIT0#defineLED_OFFP2OUT#defineLED_ONP2.0=1;#defineLED_OFFP2.0=0;,青岛大学-TI大学生创新中心傅强,40,1.7.2消除硬件差异,用宏定义消除硬件差异例如LCD或数码管的IO口,顺序经常会改变,/*宏定义,数码管ag、DP各段对应的比特,更换硬件只用改动以下8行*/#definea0 x01#defineb0 x02#definec0 x04#defined0 x08#definee0 x10#definef0 x20#defineg0 x40#defineDP0 x80,/*宏定义自动生成段码表,不要改动*/ConstcharLCD_Tab=a+b+c+d+e+f,/0b+c,/1a+b+d+e+g,/2a+b+c+d+g,/3b+c+f+g,/4a+c+d+f+g,/5a+c+d+e+f+g,/6a+b+c,/7a+b+c+d+e+f+g,/8a+b+c+d+f+g,/9#undefa.,青岛大学-TI大学生创新中心傅强,41,用函数来消除硬件差异,例如控制电机的启和停直流电机设置IO口高低电平即可步进电机要输出一定规则的脉冲序列大型交流电机需要用串口控制变频器我们把具体操作“封”在函数里,Moter_ON().Moter_OFF().,青岛大学-TI大学生创新中心傅强,42,1.7.3软件层次划分,大量复杂的调用函数需要有清晰的层次关系,菜单/人机界面,Key_GetKey();Key_WaitKey();,键盘缓冲区【FIFO】,定时扫描并判断按键,LCD_Clear();LCD_DisplayNumber();LCD_DisplayDecimal();LCD_InsertChar();LCD_DeleteChar();,显示缓冲区【数组】,LED定时循环扫描,LED显存映射,应用层,功能函数层,硬件隔离层,硬件驱动层,青岛大学-TI大学生创新中心傅强,43,应用层:最终功能,往往和人的感官有关功能层:功能函数,表达具体要干什么硬件隔离层:宏定义、缓冲区、函数封装硬件隔离层(硬件抽象层HardwareAbstractLayer,HAL)是非常重要的环节。功能函数只操作硬件隔离层的数据,与具体硬件无关。硬件驱动层:和具体硬件有关的代码,硬件驱动层从硬件隔离层获得“指示”,或是将“结果”发送至硬件隔离层。,青岛大学-TI大学生创新中心傅强,44,软件划分层次的好处,每个层的函数只对上下层“可见”,这样设置好接口参数后,各单元软件可独立开发。改动硬件时,只需配置相应的底层驱动,修改硬件隔离层,而整个大软件功能可以不变。软件的可移植性增强。功能层的函数无需关心硬件如何实现,以及何时何处被应用层调用,专心做好自己的事情就行。将大型软件任务分块,团队合作。只要明确了模块功能,接口规范,就能分派任务。,青岛大学-TI大学生创新中心傅强,45,1.7.4接口,VoidRTC_Tick(intDivSec)/硬件无关的走时函数,DivSec入口charDays;/每月的天数变量DSEC+;/定时中断加数DISABLE_INT;/宏定义关总中断If(DSEC=DivSec)SECOND+;DSEC=0/校正中断时间If(SECOND=60)MINUTE+;SECOND=0If(MINUTE=60)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论