已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2012北京电赛MSP430辅导目录隐藏 1 430开发环境的建立 2 MSP 430 项目的建立 3 完成实验Lab o 3.1 代码修改说明 4 导入实验 o 4.1 文件操作o 4.2 修改代码o 4.3 实验1o 4.4 实验2 4.4.1 简介 4.4.2 实验现象 4.4.3 代码 4.4.4 关于设定C语言变量特定比特位 4.4.5 关于存储器映射寄存器的访问o 4.5 实验3 4.5.1 简介 4.5.1.1 关于中断 4.5.1.2 关于看门狗 Watch Dog 4.5.2 实验现象 4.5.3 代码o 4.6 实验4 4.6.1 简介 4.6.2 关于定时器的工作模式 4.6.2.1 比较模式 4.6.2.2 捕获模式 4.6.3 实验现象 4.6.4 代码o 4.7 实验5 4.7.1 简介 4.7.2 关于低功耗的数字电路 4.7.3 CPU应用开发的低功耗策略 4.7.4 实验现象 4.7.5 代码o 4.8 实验6 4.8.1 简介 4.8.2 实验现象 4.8.3 代码 5 参考文献430开发环境的建立 安装CCS V5。 安装完成后启动CCS,指定License文件 MSP 430 项目的建立 启动CCS,设定CCS项目的根目录(该目录用于保存所有的CCS项目的子目录) 例如:C:timyprojects,强烈建议目录的路径中不要有中文。 在CCS菜单,选择Project-New CCS Project 在创建项目的对话框里,设定 o Project Name:用英文设定 o Output Type:Executable o Device Family 为 MSP430 o 型号选定为 MSP430G2231 o Connection 为:TI MSP430 USB1(default) o Project Templates and Example :选择 Empty Project 完成实验Lab代码修改说明 提供的实验代码原本是用于msp430g2452芯片 我们使用的开发板是msp430g2231芯片 为了正常编译运行代码,需要进行修改 修改引用的头文件和寄存器的名称 o 所有的 TIMER0_A0_VECTOR 改为 TIMERA0_VECTOR o 所有的 TIMER0_A1_VECTOR 改为 TIMERA1_VECTOR o 所有C代码 起始部分的 #include msp430g2452.h 需要修改成 #include msp430g2231.h 导入实验文件操作 建立好CCS项目之后,CCS会给提供一个默认的main.c文件,位于项目名称的目录中,删掉此文件。 把实验提供的C文件拷贝到项目的目录中,CCS会自动检测到该文件,并且添加到项目文件列表中。 修改代码根据上文的说明,修改头文件和寄存器的名称,否则编译会报错 实验1 实验1的代码较长,一开始不需要全部弄懂 该实验的目的是熟悉项目的建立、编译和下载 修改好代码之后,进行以下操作 o Project - Build All,编译代码 o Run-Debug,下载代码,此时编译好的二进制代码下载到芯片内部,处理器Halt在main()函数的入口。 o Run-Resume,运行代码,此时会看到电路板上有一个红色和一个绿色的LED灯交替闪烁。 实验2简介 实验2的目的是设定时钟。为了低功耗,MSP430可以使用不同速率的时钟源,在计算任务密集时用高速时钟,在空闲时用低速时钟。 通过设定寄存器的值来设定选择哪个时钟源作为处理器的工作时钟。 MSP430片内自带有一个RC振荡器,称为DCO,由于集成电路工艺的精度限制,每个430芯片中,该振荡器的震荡频率不一致。所以每个430芯片的 FLASH存储器中固化了两个校正数据,分别存放于CALBC1_1MHZ和CALDCO_1MHZ 两个位置。这两个位置的数据在出厂的时候被写成校准值,但是如果用户把它们清除了(通常FLASH的擦除会把内容置为0xff),那么这颗芯片就无法再得 到准确的时钟频率了。 为了做到低功耗,所以无法设计出 实验现象 该代码正常运行后,可以看到一个绿色LED以较快的频率不停的闪烁 代码/*/ LaunchPad Lab2 - Software Toggle P1.0,/ MSP430G2xx2/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ | P1.0|-LED/*#include void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerif (CALBC1_1MHZ = 0xFF | CALDCO_1MHZ = 0xFF)while(1);/ If calibration constants erased, trap CPU!/ Configure Basic ClockBCSCTL1 = _; / Set rangeDCOCTL = _;/ Set DCO step + modulationBCSCTL3 |= LFXT1S_2;/ Set LFXT1P1DIR = BIT6; / P1.6 output (green LED)P1OUT = 0; / LED offIFG1 &= OFIFG; / Clear OSCFault flagBCSCTL2 |= _ + DIVM_3; / Set MCLKfor(;)P1OUT = BIT6; / P1.6 on (green LED)_delay_cycles(100);P1OUT = 0; / green LED off_delay_cycles(5000);关于设定C语言变量特定比特位 对于一个寄存器,它的某个特定的比特位都是有具体的意义,需要单独进行设定。 一般来说,寄存器会被映射成C程序的变量,我们通过设定这些变量的具体内容来配置寄存器。 在阅读代码时,请注意代码中预先定义的宏的值,某些数值是有特别的作用。例如0x04可以把比特2置为1(最低位是比特0),0x08可以把比特3置1,而0x04+0x08可以把比特2、3一起置为1.。 关于存储器映射寄存器的访问 首先,CPU中的寄存器都要进行编址,即所有的寄存器都要有个地址 读写这些编址的寄存器就像读写一个内存地址的内容 这种寄存器叫做存储器映射寄存器 如何在C语言中对这样的寄存器读/写呢?以Lab2中的BCSCTL2寄存器为例,下面来探究一下 Lab2.c文件中:BCSCTL2 |= SELM_1 + DIVM_3 msp430g2231.h文件中:SFR_8BIT(BCSCTL2); /* Basic Clock System Control 2 */ o #define SFR_8BIT(address) extern volatile unsigned char address o #define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */ o #define DIVM_3 (0x30) /* MCLK Divider 3: /8 */ o 从中可以看到SELM_1和DIVM_3是两个常量,而BCSCTL2的具体值没有看到 关键字释义 o extern 表示在外部定义的变量,通常是在其他的*.obj和*.lib文件中 o volatile:表示不允许编译器优化这个变量,例如以下代码: int a; int b; b = a + 1; b = b-a; 编译器扫描代码之后会发现实际上 b = 1。如果声明了a是volatile类型,会告知编译器不要随意对a的值进行假设,则a不会被优化掉。volatile 关键字通常用来声明某些外设或特殊的寄存器,通常不用来声明普通变量 比如在上面的代码中,如果a代表一个通用管脚上的电平值。那么在b = a + 1;和 b = b-a之间的时刻,a的值可能会改变,所以b变量未必恒定为1,所以要声明a变量为 volatile int a; 手册 MSP430x2xx Family Users Guide o 5.3 Basic Clock Module+ Registers o Table 5-1. Basic Clock Module+ Registers RegisterShort Form Register Type Address Initial State Basic clock system control 2BCSCTL2Read/write058hReset with PUC 编译后在Debug目录中的.map 文件,描述编译之后的内存布局情况 仔细观察,可以发现map文件主要描述 o 内存分成几个部分(MEMORY CONFIGURATION),起始位置和大小 o 区段的映射(SECTION ALLOCATION MAP) o 全局的符号表(GLOBAL SYMBOLS),名字和地址,其中有这一行:00000058 BCSCTL2 o 看到这里,应当知道了,BCSCTL2是一个地址为 0x58的全局符号,请思考这对应C语言里面的什么语法元素呢? 编译后在Debug目录中的.objects.mk 文件,有这一行LIBS:= $(GEN_CMDS_FLAG) -llibc.a,这是C语言的支持库(之一) 在ticcsv5toolscompilermsp430lib中可以发现 libc.a文件 cmd文件探索 o cmd 文件是 link command file的缩写,link是从源代码向二进制代码转换过程中的一个环节 o link前面的过程是compile,该过程把各个源代码生成obj文件,每个obj文件描述了一些逻辑,比如根据一部分变量的值来计算 o 项目的cmd文件lnk_msp430g2231.cmd中,没有关于BCSCTL2的描述,但是在最后一行里面有一行 -l msp430g2231.cmd,这说明当前cmd文件还要引用其他的cmd文件。 o 搜索,发现msp430g2231.cmd文件位于ticcsv5ccs_basemsp430include目录中 o msp430g2231.cmd中有一行:BCSCTL2= 0x0058; 关于MSP430编译器的工作原理,详细的说明在以下两个文档里面 o MSP430 Assembly Language Tools v 4.0 Users Guide o MSP430 Optimizing C/C+ Compiler v 4.0 Users Guide o 注意:如果为了快速的掌握处理器的应用开发,然后去参加比赛,你不需要过早的仔细阅读以上两个文档,因为如果不做东西,看过了也会忘记。 o 知识是慢慢积累的,为了完成任务够用就好。 那么为什么还要写这个文字? o 为了展示如何深入的探究一个问题? o 给出需要查阅哪些资料以及如何查阅这些资料的一个示范。 o 要善于用于搜索的功能(Ctrl+F) 实验3简介 实验3的目的是中断响应。 关于中断 回忆51单片机的中断,并且在430上找到类似的情况,(其他的处理器诸如各种DSP,ARM的各个系列对中断服务的设计也是类似,没有本质区别)关于处理器的中断通常有以下的情况 会有多个中断源,分别表示不同的事件发生 中断可以使电平(信号的值)的触发,也可以是边沿(信号值的改变情况)的触发 要有中断向量表,不同的中断产生的时候,处理器会进入相应的中断地址。 有些中断时可以被屏蔽(不响应它),有些中断是不可以屏蔽的,比如复位或掉电。 会有一个全局的中断使能,这个是响应中断的总开关。 每个可屏蔽的中断应当有自己的使能寄存器,这个是每个中断独立的开关。 通常每个中断信号会有自己的中断向量地址,如果中断信号很多,对于一些优先级较低的中断信号,可以共享一个中断地址,那么当处理器从这个地址执行时,如何 分辨到底是哪个中断信号有效了呢,可以在给这个中断地址配一个状态寄存器,这个寄存器的值由中断的硬件电路根据中断产生的情况写入,CPU读取这个寄存器 的值就可以知道哪个中断产生了。 通常工具链(编译器、连接器)会提供某种方法,比如扩展C语言的关键字,或是使用编译伪指令(#pragma) 关于看门狗 Watch Dog 为了防止系统死机或者是由于各种干扰造成的程序跑飞,某些单片机带有看门狗的功能,这种功能是可以启用或关闭的,但是需要注意的是系统复位后看门狗的默认状态,如果默认是开启,你必须做出相应的配置,否则它可能会将系统复位。 看门狗是这样一种电路,通常它有一个定时器,一个中断源,另外它还有连接系统复位信号的电路。 如果启用了看门狗电路,则它的计时器会进行计数,如果计时器溢出了,则会触发一个中断。 用户可以在看门狗的中断复位例程里面执行一些操作,比如把看门狗定时器清零,让它重新计数(称作喂狗),或是干脆关闭看门狗。 如果看门狗的定时器溢出了,而用户在一定的时间里没有喂狗,这时看门狗会认为系统跑飞了,于是会把系统复位。 实验现象本实验正确完成后,按下开发板的P1.3按键,有一个LED灯会点亮,再次按下会熄灭。 代码注意: 以一个或两个下划线开头的变量或函数名称表示工具链内建的符号,通常不要自行定义这种以下划线开头的变量或函数/*/ LaunchPad Lab3 - Software Port Interrupt Service/ MSP430G2xx2/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ /| | |/ -o-|P1.3 P1.0|-LED/ |/*#include void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerP1DIR |= BIT0; / Set P1.0 to output directionP1IES |= BIT3; / P1.3 Hi/lo edge_ &= BIT3; / P1.3 IFG cleared_ |= BIT3; / P1.3 interrupt enabled_BIS_SR(LPM4_bits + GIE); / Enter LPM4 w/interrupt/ Port 1 interrupt service routine#pragma vector=_interrupt void Port_1(void)if (P1IFG & BIT3)P1OUT = BIT0; / P1.0 = toggle_ &= BIT3; / P1.3 IFG cleared实验4简介本实验训练定时器的应用 关于定时器的工作模式 如果我们用硬件描述语言自己做一个计数器,我们可以有如下的功能,增加计数,减少计数,当定时器完成一次计数周期后,可以自动装载,也可保持不动,如果有多个定时器,还可能存在一个定时器的计数值需要另一个定时器的溢出事件来触发其改变(本质上是2个级联的计数器)。 处理器的定时器通常是支持上面说的所有功能,但是需要用户通过配置寄存器来选择启用那一种。 另外,对于常见的情况,有时还会使用定时间对输入信号进行比较和捕获 比较模式 最普通的定时器的工作方式就是周期性的溢出。 思考如下的工作场景 o 在定时器的一个计数周期里面,例如从0计数到MAX o 我们需要在计数值为 MAX/8的时候,执行某个代码段A o 我们需要在计数值为 MAX/6的时候,执行某个代码段B o 我们需要在计数值为 MAX/2的时候,执行某个代码段C o 我们需要在计数值为 XXX 时候,执行某个代码段 XXX 如果定时器没有比较功能,则需要CPU一直不停的查询计数器的值,然后做出判断,实际上这是一种软件形式的比较,但是这样很费电。 如果定时器有比较功能,则只需要设定合适的比较值,在满足比较条件的时刻触发中断,然后再让CPU来执行相应的代码段就好了,剩下的时间CPU可以休眠。 捕获模式 思考如下的工作场景 o 在定时器的一个计数周期里面,例如从0计数到MAX o 当某个事件第1次发生的时候,计数值为V1 o 当某个事件第2次发生的时候,计数值为V2 o 当某个事件. 用户对事件发生的时间间隔感兴趣 于是希望硬件电路可以自动的把事件发生时刻的计数值保存到某个寄存器里面,然后触发一次中断让CPU过来处理。 当然,也可以这样做,直接让这个事件触发一次中断,CPU响应这个中断,然后读取定时器的计数值。但是这样做的缺点是从这个事件发生到CPU读取到计数值 的过程中,需要执行很多条CPU的指令,此时计数器又已经计了若干的数,所以CPU读到的计数值并不是事件发生那个时刻的,而是滞后了一些,也就是说不准 确。 实验现象 该代码正常运行后,可以看到一个绿色LED以较慢的频率不停的闪烁,并且在一个周期里面,亮的时间短,暗的时间长。 代码/*/ LaunchPad Lab4 - Timer Toggle P1.6,/ MSP430G2452/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ | P1.6|-LED/*#include void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerif (CALBC1_1MHZ =0xFF | CALDCO_1MHZ = 0xFF)while(1); / If calibration constants erased, trap CPU!BCSCTL1 = CALBC1_1MHZ; / Set rangeDCOCTL = CALDCO_1MHZ; / Set DCO step + modulationBCSCTL3 |= LFXT1S_2; / LFXT1 = VLOP1DIR = 0x40; / P1.6 output (green LED)P1OUT = 0; / LED offIFG1 &= OFIFG; / Clear OSCFault flagBCSCTL1 |= DIVA_3; / ACLK = VLO/8BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; / MCLK = DCO/8, SMCLK = DCO/8/ Configure TimerATACTL = _; / Source: ACLK, UP modeCCR0 = 5100;/Timer count 5100CCR1 = 100;/Timer count 100CCTL0 = CCIE; /CCR0 interrupt enabledCCTL1 = CCIE; /CCR1 interrupt enabled_BIS_SR(GIE);for(;);/ Timer A0 interrupt service routine#pragma vector=_interrupt void Timer_A0 (void)P1OUT |= BIT6; / P1.6 output High/ Timer A1 Interrupt Vector (TA0IV) handler#pragma vector=_interrupt void Timer_A1(void)switch( TA0IV )case 2: P1OUT &= BIT6; / P1.6 output Low break;case 10: break; 实验5简介实验5关于处理器的低功耗模式 关于低功耗的数字电路 数字电路的功耗中存在两种来源,分别成为静态功耗和动态功耗 动态功耗是指当一个逻辑门的输出值发生反转时(从0到1从1到0)会消耗能量 o 究其原因是因为逻辑门等效的阻容电路的充放电。电容发生充放电就会有电荷流动 o 电阻上有电荷流过就会释放热量。 o 动态功耗与 成正比,其中f是数字电路的工作频率,C是整个电路等效出来的电容,V是供电电压。 o 从中可以看到,低功耗的数字电路应当工作在低频率、低电压下,电路的等效电容由集成电路工艺和电路尺寸决定,一旦芯片生产出来之后就无法再改变了。 o 为了降低动态功耗,现代数字电路的供电电压日益降低,为了降低等效电容,采用低介电常数(low-k)的工艺。为了让芯片在待机的情况下不费电,可以把电路的时钟关闭(clock-gating技术)使得所有的信号逻辑都保持原值。 静态功耗是指,即使电路所有的门都不发生反转,只要接上了电压和地线,那么还是会有电流从芯片的VCC和GND之间通过(称作漏电流),从而费电发热。 o 为了降低静态功耗,现代集成电路采用了电源关闭(power gating)技术和多电压技术,即当电路进入待机模式后,把电源和地线之间的通道关闭,并且把电路切换到一个较低的电压,使得电路能够保持所有信号的状 态值即可,等电路进入工作模式后再打开电源通路并且切换到较高的工作电压。 CPU应用开发的低功耗策略 总的原则是,能不动就不动,能慢动就慢动 处理器会支持多种工作速率的模式,在不同的处理任务时使用不同的时钟频率 需要硬件电路支持多个不同速率的时钟,或者支持动态改变主时钟的速率 例如:配置CPU的默认状态是休眠,当某个信号触发时,CPU唤醒进入低速率工作的检测状态,当监测到外部条件达到某个条件是,切换到高速时钟进入高速计算和控制的状态。 需要CPU能够快速的在不同的模式之间切换。 一个处理器芯片内部有不同的部件构成,通常可以有选择的把某些模块休眠(通过配置寄存器),从而省电。 为了方便开发者,编译工具会定义若干模式,从最省电的模式到最费电的模式,被开启的模块逐渐增多,这样开发者只需要使用工具链提供的函数,加以模式配置的参数,就可以一次性的配置好当前模式所有需要配置的寄存器。 需要通过阅读手册明确不同的模式中,哪些模块是被开启或关闭的,否则会得不到正确的结果。 实验现象 该代码正常运行后,可以看到一个绿色LED反复闪烁。 代码/*/ LaunchPad Lab5 - Timer Toggle P1.6 with Low Power Mode/ MSP430G2452/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ | P1.6|-LED/*#include void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerif (CALBC1_1MHZ = 0xFF | CALDCO_1MHZ = 0xFF)while(1); / If calibration constants erased, trap CPU!BCSCTL1 = CALBC1_1MHZ; / Set rangeDCOCTL = CALDCO_1MHZ; / Set DCO step + modulationBCSCTL3 |= LFXT1S_2; / LFXT1 = VLOP1DIR = 0x40; / P1.6 output (green LED)P1OUT = 0; / LED offIFG1 &= OFIFG; / Clear OSCFault flagBCSCTL1 |= DIVA_3; / ACLK = VLO/8BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; / MCLK = DCO/8, SMCLK = DCO/8/TACTL = TASSEL_2 + MC_1; / SMCLK, UP modeTACTL = TASSEL_1 + MC_1; / ACLK, UP modeCCR0 = 5100;/Timer count 5100CCR1 = 100;/Timer count 100CCTL0 = CCIE; /interrupt enabledCCTL1 = CCIE; /interrupt enabled_BIS_SR(_);/Enter Low Power Modefor(;);/ Timer A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A0 (void)P1OUT |= BIT6; / P1.6 output High/ Timer_A2 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR_interrupt void Timer_A1(void)switch( TA0IV )case 2: P1OUT &= BIT6; / P1.6 output Low break;case 10: break;实验6简介实验6关于ADC的使用 实验现象 该代码正常运行后,可以检测芯片的温度。 在while循环中放置一个断点,用手指按在430芯片上,运行程序,观察温度变量的值 代码/*/ LaunchPad Lab5 - ADC10, Sample A10 Temp and Convert to oC and oF/ MSP430G2452/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ |A10 |/*#include msp430g2452.hlong temp;long IntDegF;long IntDegC;void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop WDT /Configure ADC10 ADC10CTL1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国农业发展银行校园招聘(河北招30人)历年真题汇编附答案解析
- 2026年(通讯维修工)理论知识考试题库及参考答案【研优卷】
- 2026年县直事业单位招聘公共基础知识真题200道及完整答案(名师系列)
- 2025年萍乡市人民医院招聘编外人员(第三批)4人历年真题汇编附答案解析
- 2025年下半年四川省第九地质大队考核招聘13人笔试模拟试卷附答案解析
- 2025年下半年象山县机关事业单位公开转任公务员和公开选聘事业单位工作人员29人模拟试卷附答案解析
- 2025年滨州无棣县财金投资集团有限公司公开招聘高层次人才历年真题库带答案解析
- 2025年11月沈阳市医疗卫生系统面向部分医学院校应届毕业生公开招聘175人历年真题汇编带答案解析
- 2025中铁上海设计院集团有限公司招聘8人历年真题库带答案解析
- 2025广西南宁市良庆区那马镇卫生院(良玉社区卫生服务中心)招聘医务人员2人模拟试卷附答案解析
- 2025年天津团员考试题库
- 博物馆安全生产工作总结
- 三级安全教育考试题及答案电气
- 即时零售平台对比拆解深度:谁将赢下“最后一公里”
- 2024年公务员多省联考《申论》题(天津行政执法卷)试题及答案解析
- GB/T 18669-2025船用锚链和系泊链钢
- DG-TJ08-2134-2024 建筑装饰工程石材应用技术标准
- 养老护理员全套培训课件
- 《房屋体检机构能力评价征求意见稿》
- 2025年中考英语单词词汇检测默写(背诵版)
- 主动脉狭窄护理查房课件
评论
0/150
提交评论