|
本帖最后由 xuanke 于 2012-6-8 21:30 编辑
现在想想当年自己还是很新手,虽然现在也是。新手来引导下新手吧。大神放我一马。
MSP430学习记录 宣科自己的记录,纯手打
以后也许会更新,现在不怎么用430了、
1。各个端口寄存器
P2IN是输入寄存器 不能写入只能读取
P2OUT是输出寄存器
P2DIR是输入输出控制寄存器 PUC后复位(清零,默认输入)1输出
P1P2的八条引脚都能引起中断 P1IE P2IE 0禁止,1允许,而端口P3P4P5P6没有中断能力,就只能IO
PnSEL是功能选择寄存器 0=I/O端口,1=外围模块功能
PnIES是选择下降沿中断还是上升沿中断0=上升 1下降
2.中断的理解
所谓的中断,就是在之前设定的时间到了以后,中断MAIN函数的,运行中断函数里面的程序
中断拥有最高的优先级,当中断发生(端口中断,计时器计数器中断等)后,无条件跳转到中断,中断是独立于主程序之外的。
比如这个看萌狗:
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDT_ADLY_250; //看门狗狗250ms
IE1 = WDTIE; //看门狗定时器能够中断
P2DIR |= 0xff; // 让p1.0拉高使输出状态
_EINT(); //使能全局中断
for(;;)
{
LPM3; //#define LPM3 _BIS_SR(LPM3_bits) (SCG1+SCG0+CPUOFF)
_NOP(); //平时是低功耗运行,一旦看门狗定时器跑完250ms,就会唤醒,进入中断
}
}
知道了看门狗定时器其实也是可以用的,而且可以让机器平时处于低功耗,
一旦看门狗定时器跑完,就允许中断。
还有就是会写中断的表达方式了#pragma vector(这个是向量的意思,指向储存器位置) = WDT_VECTOR(这个就是标注是哪一个中断寄存器)
__interrupt(前面是两个下划线啊,坑爹啊) void (不能丢)wdt(void)(随便自己起名字的)
#pragma vector = WDT_VECTOR
__interrupt void wdt(void)
按键:int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0XF0;//11110000 P1.0到1.3为输入状态
P2DIR |= 0XFF;
P2OUT = 0X00;
for(;;)
{
if (key !=0x0f)
{
delay();
if ( key !=0x0f)
{ switch(key)
{
case 0x0e: P2OUT = 0XFE;break;//0x00001110
case 0x0d: P2OUT = 0xfd;break;//0x00001101
case 0x0b: P2OUT = 0xfb;break;//0x00001011
case 0x07: P2OUT = 0xf7;break;//0x00000111
} }}}}
其实就是一个输入寄存器的使用
#include <msp430x14x.h>
#define key (P1IN &0x0f)
void delay(void);
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0XF0;//11110000 P1.0到1.3为输入状态
P2DIR |= 0XFF;
// P2OUT = 0X00;
P1IE = 0x0f;//设置从P1.0~P1.3允许中断
P1IES = 0xf0;//下降沿触发
_BIS_SR(LPM3_bits + GIE);
for(;;)
{}
}
void delay(void)
{
unsigned int t;
for(t = 12000;t > 0;t--);
}
#pragma vector = PORT1_VECTOR
__interrupt void p1input(void) //利用中断写的按键处理
{
if (key !=0x0f)
{
delay();
if ( key !=0x0f)
{ switch(key)
{
case 0x0e: P2OUT = 0XFE;break;//0x00001110
case 0x0d: P2OUT = 0xfd;break;//0x00001101
case 0x0b: P2OUT = 0xfb;break;//0x00001011
case 0x07: P2OUT = 0xf7;break;//0x00000111
}}}}
利用中断写的按键处理,机器平时处于低功耗,允许中断,一旦检测到有按键按下,就进入按键。
3、串口:
先写上串口;
一、首先430f149的P3.4,P3.5是uart0的复合用脚,当设置
P3SEL = 0x30;就是设置使用内部的串口模块
二、设置好了,就是打开这些功能了,ME1寄存器就是控制打开发送和接受控制寄存器。
使其USART0的发送和接收使能,只要设置ME1 = UTXE0 + URXE0;
【在这里补充说明一下,由于430头文件的强大,UTXE0就是U0TXE ,URXE0 就是U0RXE全称就是USART0 TX ENABLE,包括像UCTL0就是U0CTL,在编程时候也可以替换的,这样方便记忆。】
三、一般我们发送接收的都是8位的数据位,所以在UCTL0寄存器里面设置:UCTL0 |= CHAR;【为什么是char呢,我个人理解是一般发送的都是字符型(char型)的数据,在C语言中char是8位的】
四、然后一般那些外围的模块和内部资源都要在一定的频率下才能运行,所以毫无例外的要设置其工作的时钟频率了,所以:
UTCTL0 |= SSEL0;就是UCLK = ACLK;这个在结构图里面可以查
到,我找找。。。恭喜自己,我找到了 所以只要
设置SSEL0和SSEL1即可。
五、设置波特率了,430设置波特率及其容易,只要设置两个寄存器即可UBR00和UBR10。比如设置UBR00 = 0x0D;UBR10 = 0x00;
就是设置了波特率为2400,好吧,我承认这个比较难理解,我慢慢说。
首先,UBR00,UBR10,这两个寄存器可以理解是一个控制串口0 的16位的寄存器,
UBR00控制低八位,而UBR10控制高八位。从低到高分别对应着2的0次方,2的1次方,2的2次方,一直到2的15次方。
所以UBR00,UBR10等于 0x00, 0x0d;也就是0000 0000 0000 1101,也就是 = 13。
而串口模块的时钟频率我设置为ACLK,也就是32768hz,然后32768除以13,就等于2400,也就是波特率啦。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|