430学习笔记

2020-04-18 07:12

一,MSP430G2553单片机的各个功能模块 (一),IO口模块,

1,我们所用的MSP430G2553有两组IO口,P1和P2。

2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN, IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。 3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。

4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。 注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。程序如下:

void IO_interrupt_init() //IO中断初始化函数 {

P1REN |= BIT4+BIT5+BIT6+BIT7; // pullup 内部上拉电阻使能

//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断

P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来

//0:下拉,1:上拉

P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能 P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断 //P1IES &= ~BIT3; //上升沿触发中断 P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零 }

5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉

6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。

7,当使用msp430g2553的IO口时要注意,因为g2553的IO口寄存器的操作,不像51,它不能单独针对某一位进行操作,必须对整个寄存器进行操作。所以就不像51,g2553不可以定义bit型的数据。所以在使用msp的IO口时要注意对需要位的操作,而不要影响其他无关的位,可以 用 | & ^等按位操作的符号。在使用IO口控制其他外围模块时也要注意要使用的IO口的定义,可以用如下的定义方法: #define CLR_RS P2OUT&=~BIT0; //RS = P2.0 #define SET_RS P2OUT|=BIT0;

#define CLR_RW P2OUT&=~BIT1; //RW = P2.1 #define SET_RW P2OUT|=BIT1;

#define CLR_EN P2OUT&=~BIT2; //EN = P2.2 #define SET_EN P2OUT|=BIT2;

#define DataPort P1OUT

8,g2553的P27和P26脚分别接外部晶体的输出和输入脚XOUT和XIN,默认是自动设为了晶振管脚功能,但是当想把它们用为普通的IO时,也可以,设置对应的SEL设为普通的IO即可,如下:

P2DIR |= BIT6+BIT7; //把P26和P27配置为普通IO 并为输出脚 默认为晶振的输入和输出引脚 作为dac0832的

P2SEL &= ~(BIT6+BIT7); //cs和wr控制端 P2SEL2 &= ~(BIT6+BIT7);

(二),时钟系统

1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。 2,msp430的时钟源有: (1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz; (2),外接高速晶振XT2CLK:8MHz; (3),内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在0~16MHz; (4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz; 3,时钟模块:430的时钟模块有MCLK SMCLK ACLK : (1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK XT2CLK DCO VLO可选,默认为DCO。 (2),子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK XT2CLK DCO VLO可选,默认为DCO。 (3),辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK VLO。

4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。 DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:

DCOCTL = CALDCO_12MHZ; //DCO设为12MHz 这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波 BCSCTL1 = CALBC1_12MHZ; 用这种方法可以设置1,8,12,16MHz 宏定义如下:

#ifndef __DisableCalData

SFR_8BIT(CALDCO_16MHZ); SFR_8BIT(CALBC1_16MHZ); SFR_8BIT(CALDCO_12MHZ); SFR_8BIT(CALBC1_12MHZ);

SFR_8BIT(CALDCO_8MHZ); SFR_8BIT(CALBC1_8MHZ); SFR_8BIT(CALDCO_1MHZ); SFR_8BIT(CALBC1_1MHZ);

#endif 5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频: #include

//1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000

#define CPU_F ((double)1630)//cpu frequency1630 //CPU的实际MCLK大约为13.05/8=1.63KHz

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

void main(void) {

volatile unsigned int i; // Volatile to prevent removal

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 低频时钟选择为VLO ACLK选为VLO

IFG1 &= ~OFIFG; // Clear OSCFault flag 清除振荡器错误中断标志

__bis_SR_register(SCG1 + SCG0); // Stop DCO SCG1禁止SMCLK SCG0禁止DCO

BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8

//因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO 8分频 所以CPU的MCLK大约为1.5KHz

P1DIR = 0xFF; // All P1.x outputs P1OUT = 0; // All P1.x reset P2DIR = 0xFF; // All P2.x outputs P2OUT = 0; // All P2.x reset

P1SEL |= BIT0+BIT4; // P1.0 P1.4options 功能选择为外围模块

//p1.0输出ACLK,来自VLO,p1.4输出SMCLK, 因为禁止了SMCLK,所以P1.4脚无

波形输出

//VLO典型值为12KHz 实际用示波器测得为:13.05KHz 左右波动 //所以CPU的实际MCLK大约为13.05/8=1.63KHz

for (;;) {

P1OUT ^= BIT6; // P1.6 闪烁 delay_ms(1000); } }

6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(int n); 可以达到比较精确的延迟,如下:

//more_ //1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000 #define CPU_F ((double)12000000)//cpu frequency12000000

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //2空函数

#define nop() _NOP();

7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。

(三),定时器Timer_A

1,MSP430g2553具有两个16位的定时器:Timer0_A Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。 2,产生PWM,例子如下:

#include

void Timer_A0_1_init() //TA0.1输出PWM {

TACTL|= TASSEL_1+MC_1;//ACLK,增计数 CCTL1=OUTMOD_7;//输出模式为复位/置位 CCR0=328;//时钟频率为32768HZ,100HZ

//CCR1=164;//时钟频率为32768HZ,占空比CCR1/CCR0=50%

CCR1=109;//占空比CCR1/CCR0=1/3 TA0.1由P1.2 P1.6输

出 }

void Timer_A1_2_init() //TA1.2输出PWM {

TA1CTL|= TASSEL_1+MC_1;//ACLK,增计数

TA1CCTL2=OUTMOD_7;//输出模式为复位/置位,注意CCTL2要写为TA1CCTL2

TA1CCR0=164;//时钟频率为32768HZ,波形32768/CCR0=199HZ TA1CCR2=41;//占空比CCR2/CCR0=1/4,注意CCR2要写成TA1CCR2 TA1.2由P2.4 P2.5输出 }

void Timer_A1_1_init() //TA1.1输出PWM {

TA1CCTL1=OUTMOD_7;

TA1CCR1=123; //占空比CCR1/CCR0=3/4,注意CCR1要写成TA1CCR1 TA1.1由P2.1 P2.2输出 }

void IO_init() {

P1SEL|=BIT2+BIT6;

P1DIR|=BIT2+BIT6;//P1.2 P1.6输出 TA0.1 OUT1

P2SEL|=BIT4+BIT5;

P2DIR|=BIT4+BIT5;//P2.4 P2.5输出 TA1.2 OUT2

P2SEL|=BIT1+BIT2;

P2DIR|=BIT1+BIT2; //P2.1 P2.2输出 TA1.1 OUT1 }

void main(void) {

WDTCTL=WDTPW+WDTHOLD;

IO_init();

Timer_A0_1_init(); Timer_A1_2_init(); Timer_A1_1_init();

_BIS_SR(CPUOFF); // Enter LPM0 进入低功耗模式0


430学习笔记.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:苏教版科学六下《有趣的食物链》教案及反思(2)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: