1、MSP430g2553培训辅导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、.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,强烈建议目录
3、的路径中不要有中文。 在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芯片
4、 为了正常编译运行代码,需要进行修改 修改引用的头文件和寄存器的名称 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会自动检测到该文件,并且添加到项目文件列表中。 修改代码根据上文的说明,
5、修改头文件和寄存器的名称,否则编译会报错 实验1 实验1的代码较长,一开始不需要全部弄懂 该实验的目的是熟悉项目的建立、编译和下载 修改好代码之后,进行以下操作 o Project - Build All,编译代码 o Run-Debug,下载代码,此时编译好的二进制代码下载到芯片内部,处理器Halt在main()函数的入口。 o Run-Resume,运行代码,此时会看到电路板上有一个红色和一个绿色的LED灯交替闪烁。 实验2简介 实验2的目的是设定时钟。为了低功耗,MSP430可以使用不同速率的时钟源,在计算任务密集时用高速时钟,在空闲时用低速时钟。 通过设定寄存器的值来设定选择哪个时钟源
6、作为处理器的工作时钟。 MSP430片内自带有一个RC振荡器,称为DCO,由于集成电路工艺的精度限制,每个430芯片中,该振荡器的震荡频率不一致。所以每个430芯片的 FLASH存储器中固化了两个校正数据,分别存放于CALBC1_1MHZ和CALDCO_1MHZ 两个位置。这两个位置的数据在出厂的时候被写成校准值,但是如果用户把它们清除了(通常FLASH的擦除会把内容置为0xff),那么这颗芯片就无法再得 到准确的时钟频率了。 为了做到低功耗,所以无法设计出 实验现象 该代码正常运行后,可以看到一个绿色LED以较快的频率不停的闪烁 代码/*/ LaunchPad Lab2 - Software
7、 Toggle P1.0,/ MSP430G2xx2/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ | P1.0|-LED/*#include void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timer if (CALBC1_1MHZ = 0xFF | CALDCO_1MHZ = 0xFF) while(1); / If calibration constants erased, trap CPU! / Configure Basic Clock BCSCTL1 = _; / Set rang
8、e DCOCTL = _; / Set DCO step + modulation BCSCTL3 |= LFXT1S_2; / Set LFXT1 P1DIR = BIT6; / P1.6 output (green LED) P1OUT = 0; / LED off IFG1 &= OFIFG; / Clear OSCFault flag BCSCTL2 |= _ + DIVM_3; / Set MCLK for(;) P1OUT = BIT6; / P1.6 on (green LED) _delay_cycles(100); P1OUT = 0; / green LED off _de
9、lay_cycles(5000); 关于设定C语言变量特定比特位 对于一个寄存器,它的某个特定的比特位都是有具体的意义,需要单独进行设定。 一般来说,寄存器会被映射成C程序的变量,我们通过设定这些变量的具体内容来配置寄存器。 在阅读代码时,请注意代码中预先定义的宏的值,某些数值是有特别的作用。例如0x04可以把比特2置为1(最低位是比特0),0x08可以把比特3置1,而0x04+0x08可以把比特2、3一起置为1.。 关于存储器映射寄存器的访问 首先,CPU中的寄存器都要进行编址,即所有的寄存器都要有个地址 读写这些编址的寄存器就像读写一个内存地址的内容 这种寄存器叫做存储器映射寄存器 如何在
10、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)
11、 /* 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 关键字通常用来声明某些外设或特殊的寄存器,通常不用来声明普通变量 比如在上
12、面的代码中,如果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 2BCSCTL2
13、Read/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 文件,有这一
14、行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.c
15、md,这说明当前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 注意:如果为了快速的掌握处理器的应用开发,然后去参加比赛,你不需要过早的仔细阅
16、读以上两个文档,因为如果不做东西,看过了也会忘记。 o 知识是慢慢积累的,为了完成任务够用就好。 那么为什么还要写这个文字? o 为了展示如何深入的探究一个问题? o 给出需要查阅哪些资料以及如何查阅这些资料的一个示范。 o 要善于用于搜索的功能(Ctrl+F) 实验3简介 实验3的目的是中断响应。 关于中断 回忆51单片机的中断,并且在430上找到类似的情况,(其他的处理器诸如各种DSP,ARM的各个系列对中断服务的设计也是类似,没有本质区别)关于处理器的中断通常有以下的情况 会有多个中断源,分别表示不同的事件发生 中断可以使电平(信号的值)的触发,也可以是边沿(信号值的改变情况)的触发 要
17、有中断向量表,不同的中断产生的时候,处理器会进入相应的中断地址。 有些中断时可以被屏蔽(不响应它),有些中断是不可以屏蔽的,比如复位或掉电。 会有一个全局的中断使能,这个是响应中断的总开关。 每个可屏蔽的中断应当有自己的使能寄存器,这个是每个中断独立的开关。 通常每个中断信号会有自己的中断向量地址,如果中断信号很多,对于一些优先级较低的中断信号,可以共享一个中断地址,那么当处理器从这个地址执行时,如何 分辨到底是哪个中断信号有效了呢,可以在给这个中断地址配一个状态寄存器,这个寄存器的值由中断的硬件电路根据中断产生的情况写入,CPU读取这个寄存器 的值就可以知道哪个中断产生了。 通常工具链(编译
18、器、连接器)会提供某种方法,比如扩展C语言的关键字,或是使用编译伪指令(#pragma) 关于看门狗 Watch Dog 为了防止系统死机或者是由于各种干扰造成的程序跑飞,某些单片机带有看门狗的功能,这种功能是可以启用或关闭的,但是需要注意的是系统复位后看门狗的默认状态,如果默认是开启,你必须做出相应的配置,否则它可能会将系统复位。 看门狗是这样一种电路,通常它有一个定时器,一个中断源,另外它还有连接系统复位信号的电路。 如果启用了看门狗电路,则它的计时器会进行计数,如果计时器溢出了,则会触发一个中断。 用户可以在看门狗的中断复位例程里面执行一些操作,比如把看门狗定时器清零,让它重新计数(称作
19、喂狗),或是干脆关闭看门狗。 如果看门狗的定时器溢出了,而用户在一定的时间里没有喂狗,这时看门狗会认为系统跑飞了,于是会把系统复位。 实验现象本实验正确完成后,按下开发板的P1.3按键,有一个LED灯会点亮,再次按下会熄灭。 代码注意: 以一个或两个下划线开头的变量或函数名称表示工具链内建的符号,通常不要自行定义这种以下划线开头的变量或函数/*/ LaunchPad Lab3 - Software Port Interrupt Service/ MSP430G2xx2/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ /| | |/ -o-|P1.3 P1.0|-LED/
20、|/*#include void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timer P1DIR |= BIT0; / Set P1.0 to output direction P1IES |= 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 ro
21、utine#pragma vector=_interrupt void Port_1(void) if (P1IFG & BIT3) P1OUT = BIT0; / P1.0 = toggle _ &= BIT3; / P1.3 IFG cleared 实验4简介本实验训练定时器的应用 关于定时器的工作模式 如果我们用硬件描述语言自己做一个计数器,我们可以有如下的功能,增加计数,减少计数,当定时器完成一次计数周期后,可以自动装载,也可保持不动,如果有多个定时器,还可能存在一个定时器的计数值需要另一个定时器的溢出事件来触发其改变(本质上是2个级联的计数器)。 处理器的定时器通常是支持上面说的所有
22、功能,但是需要用户通过配置寄存器来选择启用那一种。 另外,对于常见的情况,有时还会使用定时间对输入信号进行比较和捕获 比较模式 最普通的定时器的工作方式就是周期性的溢出。 思考如下的工作场景 o 在定时器的一个计数周期里面,例如从0计数到MAX o 我们需要在计数值为 MAX/8的时候,执行某个代码段A o 我们需要在计数值为 MAX/6的时候,执行某个代码段B o 我们需要在计数值为 MAX/2的时候,执行某个代码段C o 我们需要在计数值为 XXX 时候,执行某个代码段 XXX 如果定时器没有比较功能,则需要CPU一直不停的查询计数器的值,然后做出判断,实际上这是一种软件形式的比较,但是这
23、样很费电。 如果定时器有比较功能,则只需要设定合适的比较值,在满足比较条件的时刻触发中断,然后再让CPU来执行相应的代码段就好了,剩下的时间CPU可以休眠。 捕获模式 思考如下的工作场景 o 在定时器的一个计数周期里面,例如从0计数到MAX o 当某个事件第1次发生的时候,计数值为V1 o 当某个事件第2次发生的时候,计数值为V2 o 当某个事件. 用户对事件发生的时间间隔感兴趣 于是希望硬件电路可以自动的把事件发生时刻的计数值保存到某个寄存器里面,然后触发一次中断让CPU过来处理。 当然,也可以这样做,直接让这个事件触发一次中断,CPU响应这个中断,然后读取定时器的计数值。但是这样做的缺点是
24、从这个事件发生到CPU读取到计数值 的过程中,需要执行很多条CPU的指令,此时计数器又已经计了若干的数,所以CPU读到的计数值并不是事件发生那个时刻的,而是滞后了一些,也就是说不准 确。 实验现象 该代码正常运行后,可以看到一个绿色LED以较慢的频率不停的闪烁,并且在一个周期里面,亮的时间短,暗的时间长。 代码/*/ LaunchPad Lab4 - Timer Toggle P1.6,/ MSP430G2452/ -/ /| XIN|-/ | | |/ -|RST XOUT|-/ | |/ | P1.6|-LED/*#include void main(void) WDTCTL = WDTP
25、W + WDTHOLD; / Stop watchdog timer if (CALBC1_1MHZ =0xFF | CALDCO_1MHZ = 0xFF) while(1); / If calibration constants erased, trap CPU! BCSCTL1 = CALBC1_1MHZ; / Set range DCOCTL = CALDCO_1MHZ; / Set DCO step + modulation BCSCTL3 |= LFXT1S_2; / LFXT1 = VLO P1DIR = 0x40; / P1.6 output (green LED) P1OUT
26、= 0; / LED off IFG1 &= OFIFG; / Clear OSCFault flag BCSCTL1 |= DIVA_3; / ACLK = VLO/8 BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; / MCLK = DCO/8, SMCLK = DCO/8 / Configure TimerA TACTL = _; / Source: ACLK, UP mode CCR0 = 5100; /Timer count 5100 CCR1 = 100; /Timer count 100 CCTL0 = CCIE; /CCR0 interrupt ena
27、bled CCTL1 = 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 究其原因是因为逻辑门等效的阻容电路的充放电。电容发生充放电就会有电荷流动
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1