资源描述
改变CCS字体方法:
perferance>General>Apperance>Colors and Fonts
>Basic>Text Font
将c语言编译成汇编语言之后执行。如果c语言结构不好,则编译后
会出现编译成汇编后代码冗余,
使得执行效率不高。
板子有可能与电脑连接出问题,可以拔下重插一次。
在单片机内部flash存储空间有剩余时,可以用于数据存储空间,
并且可以使用单片机程序进行数据管理。
POR PUC是复位信号
看门狗定时器溢出发生复位
复位时设置如下:
1.RAM堆栈的指针指到最顶端
2.初始化看门狗
3.初始化外设
GIE是总中断
具有欠压复位功能
工作电流小于20UA
待机电流小于0.8UA
4个特殊功能寄存器
R0是PC指针
R1是堆栈指针
R2是状态寄存器
R3是常数发生器
12个通用寄存器R4-R15
27条内核指令
24条仿真指令
7中地址模式
无累加器
三个时钟:
ACLK辅助时钟:频率较低,低速外设
MCLK是主时钟,CPU运行的时钟,高频
SMCLK是次主时钟,高速外设
DCO是数字震荡控制器1M 8M 12M 16M共4个级别,可以通过
内置数据进行设置
内置VLO低频振荡器,频率为4-20khz。所以可以通过DCO进行分频
Timer_A频率可达系统振荡频率,用于定时器时,最小单位时间
是20ns
2553的电阻有0~15共16中。用RSEL选择。RSEL与DCO配合 ,值越大
频率越大。
LF是外接时钟
USART支持UART、SPI 共2种通讯方式
USCI支持 UART、I2C、SPI 共3种通讯方式
关于变量:
static变量是对于局部变量而言,如果不定义成静态变量,则
每次执行时都会被重新初始化,静态变量则不重新初始化。
全局变量和静态变量是存储在RAM中的。
extern是外部变量,即将一个文件中的变量在另一个文件中
使用。如在文件1中声明了变量z,在文件2中声明extern int z
就可以使用文件1的z
I/O口赋值方法与C51中的相同,可以使用OXxx或OXxxxx赋值。
对P管脚整体赋值是对寄存器的赋值操作
BIT0,BIT1,BIT2,BIT3分别表示二进制的第一位,二位,
三位为1,四位为1.表示0x01,0x02,,0x04,0x08.
P1OUT|=BIT1,是除了第一位的寄存器值被改变,其他位的值
都不变,这样可以防止对其他位做了误操作。
关于逻辑操作:
&0xff与|0x00则不改变原值
^BIT0分为^0和^1,^1则每次之前的状态都改变,^0则每次之前的
状态都不变。因此^BIT0表示^0x0001,即前15位都不改变状态
只有最后一位翻转,可以用于位翻转操作。
<<移位操作经常用于数值计算以及某些循环操作。左移n位表示
*2^n.
必须先对需要的未进行输入输出设置,之后才能进行读写操作。
模数转换器具有14路输入。
定时器与比较器配合,可以得到某个时间函数,如果知道了某
物理量随时间的变化规律,就可以进行测量。
利用定时器和RAM等存储数据的模块或数组,可以实现任意PWM波的
产生,再利用电容的充放电作用可以模拟出任何的周期性波形,方
法如下:定时器赋初值,启动定时器,计数停止后进入中断,在中
断中将下一个要计的时间加在初值上,继续计数。如此循环。每次
进入中断时都翻转一下输出电平。定下某个循环的次数作为一个大
周期。
P口要选择作为I/O口还是作为寄存器,选定后还要在方向寄存器中
确定是输入还是输出。
PXDIR为0时,要使用PxREN进行上拉下拉操作,上拉则默认输入是高
电平,下拉则默认是低电平。如P1REN|=BIT0;
不操作时都默认为下拉。可以在P1REN寄存器里找到各位状态。
上电后P1DIR全部为0,即输入状态。P1OUT 的7~1都是1,p1.0是0.
P1IN 的P1.1 P1.2为高,其他为低。
在使用时应该先分清自己是要输入还是要输出,然后可以根据需要
使用P1REN调整初始状态。
I/O口作为输出时,如果输出寄存器P1OUT是高,则对输入寄存器PIN
有影响,会直接将P1IN寄存器变为高电平,这就是那位学长说的要
注意的问题,要尽量避免,如在进行初始化时P1OUT =0X00;不应该
利用这一现象,这不正宗。
I/0口的中断注意事项:
1.寄存器名称根据芯片的寄存器名称设置,2553是IE1,IE2,不是
P1IE,P2IE (要以调试时的寄存器为准,不要看头文件中的。)
2.IE1为1是开中断,不要搞反了
3.将需要的端口的PxREN置1,即接上拉电阻。
4.标志位要软件清零
5.逻辑判断时要加括号,否则不能执行
6.不必局限于头文件中宏定义的OFIE,OFIFG等,P1,P2的所有管脚
都可以独立中断。可以独立设置。
7.PxSELx只要置1,那么中断就自动禁止,不管PxIE是什么
不同的编译软件的寄存器名称不一样,设置时需要根据实际的进行
设置,否则寄存器无效。!!!!!!!!!!
定时器是CCR0,CCR1,CCR2,CCR0的优先级最高,并且返回时不要
软件清除中断标志位,是自动复位的(相当于51的8位自动重装
定时器)。其他定时器必须软件清除中断标志位。CCR0,CCR1都是
计数值,相当于51的TH0,TL0.TH1,TL1.
关于定时器的连续工作模式和增计数模式????????
数据段的数据个数一般要超过256个才能通过8路AD转换。
MCLK的频率等于机器频率,每一个周期都能够完成一个基本操作。
一个指令周期等于1-6个机器周期,根据指令而定。可以参照MSP430
时钟设置及其总结一文。
ACLK用于低速外设
MCLK用于CPU
SMCLK用于高速外设
注意对寄存器进行位设置时的语法,可以是x|=a+b+c...
x表示寄存器名称,a,b,c表示寄存器的位名。
多机USART通信时,数据格式为 :起始位 地址 停止位 起始位 数据
停止位 起始位 数据 停止位。。。,其中在空闲模式下,连续10个
以上高电平表示空闲,在此之后的一定是地址帧。在10个之内的一定
是数据帧。
看某种类型变量是几位时,可以用使其溢出后自动赋值的方法来得到。
进入中断要有以下几条语句:
_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt,写在主函数中
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
}
简易延时要把延时数据定义成全局变量。
串口接收部分的软件设置包括对错误数据的处理
和对地址、数据的判断及处理两个部分。
如果是正确的地址帧,则自动唤醒单片机,
RXWAKE置位(只针对地址有效),如果URXWIE
软件置位则可以进入地址中断服务程序,进行
匹配。
GIE是全局中断,_BIS_SR( LPM1_bits+GIE);
通常这样用。
串口通信中的中断使能寄存器是IE2,书写并
不复杂。标志位寄存器是IFG2。
写入发送缓冲器时使得标志位复位,
发送缓冲器写入移位寄存器后标志位置位。
在发送中断打开的情况下会进入发送中断。响应
发送中断后标志位自动清零。不响应中断则不会
自动清零,需要软件清除。
(并不需要在发送中断中将标志位复位,因为
如果有继续发送的数据会在写入发送寄存器
时自动使得标志位复位。)
接收时收到完整字符并进入接收缓存后接收标志
置位。响应接收中断或读取接收缓存后使得标志
复位。
无论是软件设置标志位置位还是由于接收或发送
产生的标志位置位,都可以进入相应的中断。
2553的串口中没有ME1,ME2寄存器,即没有
串口使能寄存器。有中断使能寄存器IE1,
IE2.功能不同。
全局变量可以被任意模块改变。累计改变。
RXWAKE是可以进行检测的标志位,在地址多机
模式下,收到的字符地址位置位则唤醒 。在空闲
模式下,接收到字符前检测到线路空闲则唤醒。
唤醒了则表示接收到的字符是地址。
芯片所有的寄存器在头文件中都有解释,即
SFR_8BIT();
芯片总中断: _EINT();
在写入发送寄存器时要检测是不是空闲,即检测
UCA0TXIFG是否置位,可以用
while((IFG2&UCA0TXIFG)==0);
头文件的定义与调试中寄存器界面的顺序是一样的
UCSWRST位置位,将使UCRXIE,UCTXIE,UCRXIFG
,UCRXERR,UCBRK,UCPE,UCOE,UCFE,UCSTOE
和 UCBTOE 位复位,UCTXIFG 位置位。(这就可
以解释为什么以上点之后就可以进入发送中断)
清除UCSWRST 将释放 USCI,使其进入操作状态。
数据接收中断的优先级最高
f/波特率 其实就是每个数据位采样的次数,因此
不应该小于3.
定时器连续模式用于产生给定的时间间隔.通过
中断实现。是比较模式,不需要设置输出模式。
#pragma vector=TIMER0_A1_VECTOR是定时器中断
和CCR1~CCR4中断向量。具体是哪些还要看头文件
中的解释。如:
#define TIMER1_A1_VECTOR (12 * 1u)
/* 0xFFF8 Timer1_A CC1-4, TA1 */表示CCR1~
CCR4以及TA1.
#pragma vector=TIMER0_A0_VECTOR是CCR0中断
向量。
定时器增模式:产生PWM波(比较部分)
定时器连续模式:产生间隔中断处理一些事情,
也可用于键盘扫描,产生PWM波等(比较部分)
定时器增减模式:产生对称的波(比较部分)
定时器连续模式:结合捕获到的TACCRx来测
量时间间隔、频率、速度等(捕获部分)
以下是地址多机模式发送字符的函数格式:
void sendchar(unsigned int address)
{
unsigned int i;
UTCTL1|=TXWAKE;
TXBUF1=address;
while((UTCTL1&0X01)==0);
UTCTL1&=~TXWAKE;
for(i=0;i<=6;i++)
{
TXBUF1=Data[i];
while((UTCTL1&0X01)==0);
}
}
下位机(五个149)其中一个地址位为0x01的149接收上位机数据的程序为:
/*************************************************/
/*说明:UART点对多点多机通信主机程序。 */
/*UART以9600bps,8位数据,1位地址,1位停止模式发送。 */
/*当地址位为1时判断地址,确认呼叫,接收后续字符串,并检查结束0。 */
/********************************************/
#include<msp430x14x.h>
void InitRS_SLA1(void);
#define ADDRESS1 0X01 //定义从机的地址位
unsigned char j1,count1=0;
char Data1[20],Buffer1[20];
void InitRS_SLA1(void)
{
UCTL1&=~SWRST; //SWRST复位,USART允许
UCTL1=CHAR+MM; //8位数据位,1位停止位,地址位模式
URCTL1|=URXWIE; //只有地址字符使URXIFG置位
UBR01=0X03;
UBR11=0X00;
UMCTL1=0X4A; //使用32KHZ晶振时,波特率为9600bps
UTCTL1=0X10; //选定ACLK(32KHZ晶振)为时钟源
ME2|=0X30; //UART1发送及接收模块允许
P3SEL=0XC0; //P3.6,P3.7被UART1发送模块占用
P3DIR=0X40; //P3.6输出,P3.7输入
IE2|=URXIE1; //接收中断允许
}
interrupt[UART1RX_VECTOR] void UART1RX(void)
{
if(URCTL1&URXWIE) //接收为地址方式时,等待正确地指出现
{
if(RXBUF1==ADDRESS1)//地址正确,改变接收为数据方式,准备接受
{
URCTL1&=~URXWIE;
count1=0;
}
}
else //接收为数据方式时
{
Data1[count1]=RXBUF1; //数据存入Data数组中
if(Data1[count1++]==0) //是否到达末尾
{
URCTL1|=URXWIE; //改变接收为地址方式
for(j1=0;j1<count1;j1++)
Buffer1[j1]=Data1[j1]; //复制字符串
}
}
}
最新发现:UCDORM相当于URXWIE,即只有地址
才能使得RXIFG置位,UCTXADDR相当于TXWAKE,
即下一个要发送的字符是地址。
UCDORM在接收程序中用到,UCTXADDR在发送程序
中用到。
ADC10中的INCH_x表示所用通道的最大标号。从这
里开始进行采样。ENC=0;则在一次转化结束之后
跳到通道都没设置的初始化状态,MSC=0;则一次
转化后跳到需要触发信号触发的状态。
ADC10:单通道单次转换
一次转化以及转化结果进入ADC10MEM期间应保证
ENC=1;否则转化结果不确定。在采样保持期间ENC
可以变为0,此时结束转化。
ENC和ADC10SC可以不在同一条语句中。可以先ENC
再SC
单通道单次转换在转化结束(由于转化结果出现
或ENC=0引起)则不进行下一次转换,跳转到最初
的采样通道都没有选择的情况。
ADC10:序列通道单次转化
必须置MSC=1,否则再一次转化完成后不会继续向
下一通道采样转化,需要重新给触发信号。就像
单通道单次转换一样。
要把使用的通道选定
要把对应管脚的的复选功能打开
要软件开通各通道:ADC10AE0,ADC10AE1.因为序
列通道转换是从高A15向A0的方向采样的,由于并
不是这之间的所有通道都有采样的需要,所以要
使用通道开放功能,将需要采样的通道置1,不需
要采样的置零关闭。
ADC10:单通道多次转换
工作期间必须使得ENC=1;否则会在一次转化完成后
跳到没有定义采样通道的初始化位置。如果一次
转化完成后MSC=0;就不会继续转化,等待下一次
触发信号启动转化。
ADC10的停止方法:
①在单通道单次转换中,应检测到busy==0时令
ENC=0;
②在其他转换中直接令ENC=0;会在相应的多次
转化末时自动结束。
One-Block模式下直到所定义的一块的数据量被
传送完毕之后才会置标志位。
USCI包括USCI_Ax和USCI_Bx两个不同的模块,如果
同一模块有几个,则x从0开始编号。
I2C要注意master还是slaver,是发送器还是接收器
主从可以通过对UCMST编程确定,收发可以
通过对UCTR编程确定。
I2C自己的地址可以通过对UCBxI2COA(自己)
寄存器编程确定,对于主机还可以把要访问的
芯片地址写在UCBxI2CSA。还可以指定对于
general call(广播)是否回应。
I2C可以选择低功耗模式,使用SMCLK,系统自动
在需要SCL时启动SMCLK,以达到降低功耗的目的
但是SMCLK在其他模块也在使用,启用或关闭就会
影响其他模块的功能,建议不使用自动低功耗。
当芯片处于slave receive时,由于SCL由外部
芯片提供,所以可以工作在LPM4下。接受或发送
中断会唤醒芯片。
I2C有两个中断源,接收和发送共用一个中断向量,
四种通信状态标志共用一个中断向量。收发中断
用于收发数据,状态中断用于识别通信格式。
(UCALIFG/UCNACLKIFG/UCSTTIFG/UCSTPIFG)
以上四种状态中断与UART中的UCAxRXIFG接收中断
共用一个中断向量,数据收发与UCAxTXIFG共用一
个中断向量。
在接收到非应答或写入数据时UCBxTXIFG复位。
可以在中断中使用循环,将数据一次性发送出去。
也可以通过发送一个字节就退出发送中断,发送
结束后再次进入发送中断的方式多次发送。
从机可以将SCL拉低来暂时停止数据传输。
I2C作为主机接收数据:设置从机地址、发送起始
位,开通接收中断即可。发送起始位之后自动发送
从机地址,在从机应答后立即清除起始位UCTxSTT
I2C作为主机发送模式:设置从机地址、发送起
始位,开通发送中断即可。发送起始位之后自动
发送从机地址。在发送起始位时立即置位发送标志
进入发送中断,可以把数据进行发送。,在从机
应答后立即清除起始位UCTxSTT
要在传送完某个字节的数据之后立即结束,应该
检测UCBxTXIFG是否置位,只有在置位之后发出
STOP,才能保证数据的完整传输和快速停止。
主机发送模式下,要停止数据可以在数据发送之后
立即发送停止位。在主机接收模式下,要停止数据
可以在接收完一个字节后发送非应答位和停止位。
看门狗在复位模式下不能使用LPM4.因为看门狗
总需要一个时钟源。在中断模式下各种低功耗模式
都可以使用
看门狗在复位模式下可以保证所使用的时钟源不受
低功耗模式影响,所以尽量不要选用SMCLK,否则
在低功耗时SMCLK不会被关闭。
LFXT1CLK可高可低,高达400k—16Mhz,低至32768
XT2CLK 只能是400k—16Mhz
VLOCLK是内部非常低的振荡器,可达12Khz。
ACLK: LFXT1CLK VLOCLK
MCLK: LFXT1CLK VLOCLK XT2CLK DCOCLK
SMCLK: LFXT1CLK VLOCLK XT2CLK DCOCLK
BCSCTL3中当XTS=0时说明LFXT1CLK选择低频率,可以
选择32768HZ或VLOCLK的12Khz,这可以使用LFXT1Sx
来选择。10为VLOCLK,00为32768hz。ACLK默认使用
LFXT1CLK,且默认为32768。当VLOCLK选中后
LFXT1CLK会自动停止,直接使用VLOCLK作为ACLK.
不同的低频需要选择电容,高频或外部数字信号不
需要选择电容。XCAPx=00;但是需要选择频率范围。
电容感测:先选择某些引脚具有电容感测功能,P1
的引脚连在TA0的计数器上,P2的引脚连在TA2.
FLASH擦出操作时:先定义地址,再设置擦出模式,
再解锁,在写数据。
5529:
管脚2组为一大组,P12345678...分为PA~PD...。
所有的赋值时使用PA|=0Xxxxx的方式。仅仅对于
中断寄存P1IV,P2IV不使用PAIV的形式,
对于输入时的上拉下拉选择已经明确,是否上下拉
由PREN决定,上下或下拉选择则用PxOUT决定,1为
上拉,0为下拉。
各中断的优先级为P1.0最高,依次向下递减。
当管脚选择了复选功能,则中断功能立即失效。
SPI模式:
当接收的数据进入SBUF未及时读出即被覆盖,则
UCOE置位。
展开阅读全文