基于MSP430F5529的三种点灯方式(基本、定时、外部中断),快来瞧瞧!

目录

前言

一、msp430f5529三种点灯方式

二、总结

题外话:


前言

好久没有更新一下MSP430F5529的博文了,发觉看的人有点少了,而且前段时间又因为电赛停了,就回归STM32f1的怀抱,毕竟32位的确实比16位的好,而且就用户而言,STM32肯定更占优势······今天就再次回归MSP430的怀抱,那么接下来就会先从基础的使用讲起,这里先是讲用三种方式来点亮LED

一、msp430f5529三种点灯方式

在MSP430f5529中对于LED灯,均是高电平触发,输入高电平后就点亮,输入低电平就熄灭,这个不同于51和STM32,这是比较基础的。那么接下来就主要用三种方式让你快速点灯。

1、基本方式

基本方式就是直接设置一个延时,然后令它循环1点亮,这里我们点亮LED1(P1.0), 首先设置好输出模式,P1DIR |= BIT0,这句代码的意思就是设置为输出模式,之后就是直接简单一句输出1即可实现灯的点亮,即 P1OUT |= BIT0,这句代码就是设置输出为1,若是想要输出为0,即输出P1OUT &= ~BIT0,这就是输出0。那么延时呢?如果不考虑升级时钟频率(系统初始默认1MHZ时钟频率),那么可以直接采用一句__delay_cycles(x)函数延时,但是这个x代表就是几us,所以要延时ms数字就比较大,因此可以自行修改这个自带的延时,具体参照下面代码:

#include <msp430.h> 

#define CPU_F ((double)1000000)
#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))

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// 停止看门狗
    P1DIR |= BIT0;                //设置P1.0口为输出模式

	 while (1)
	  {
	     P1OUT |= BIT0;            //P1.0输出高(LED1点亮)
	     delay_ms(1000);
	     P1OUT &= ~BIT0;             //P1.0输出低(LED1熄灭)
	     delay_ms(1000);
	  }

}

2、定时方式

定时方式,顾名思义就是要用到定时器了,那么怎么使用呢?

MSP430F5529有四个定时器,分别是Timer0_A、Timer1_A、Timer2_A、Timer0_B(两类,A类和B类,具体使用不详讲),这里为我用到了Timer0_A,那么简单来说,无非就是定时器使能,设置好各种参数(模式),开启(使能)中断,运行中断函数这些其实跟其他单片机用起来差别不大,但是运用的代码不一样

那么怎么利用定时器确定自己想要的时间?这就补上

首先系统默认情况下一般为ACLK(32768HZ)、SMCLK(1MHZ)、MCLK(1MHZ)三种,那么先设置一个参考时钟,选用TASSEL_2为SMCLK,那么TASSEL有多少种选择呢?0为TACLK(外部时钟源)1为ACLK(辅助时钟源),2为SMCLK(子系统时钟源),3为~TACLK;

下一讲再讲一下系统时钟源的问题,这里就简单说明一下 

那么时间就等于50000/1000000=0.05,之后0.05*20=1s,那么最终结果就是LED灯1S闪烁一次

剩下部分代码都有详细的注释了,相信可以很快理解。

#include <msp430.h> 

#define CPU_F ((double)1000000)
#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))

unsigned char count=0;

int main(void)//定时器口中断控制函数
{

	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;              //P1.0置为输出
	TA0CCTL0 = CCIE;            //CCR0中断使能
	TA0CCR0 = 50000;            //设定计数值
	TA0CTL =TASSEL_2+MC_1+TACLR;//SMCLK,增计数模式,清除TAR
	_bis_SR_register(LPM0_bits+GIE);//低功耗模式0,使能中断
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    count++;
    if(count==20)
    {
     count=0;
     P1OUT ^= BIT0;                          //1s改变LED1灯状态
    }
}

3、外部中断方式

看完前面两种方式,那么最后一种即为外部中断了,这里其实就是按键中断,设置按键P1.1控制LED亮灭状态,这里就是几个寄存器函数的使用了,基本都详细注释出来了,相信也比较好理解。

#include <msp430.h> 

#define CPU_F ((double)1000000)
#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))

int main(void)//io口中断控制函数
{
  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
  P1DIR |=  BIT0;                           // 设置P1.0口方向为输出
  P1OUT &= ~BIT0;
  P1REN |=  BIT1;                           // 使能P1.1上拉电阻
  P1OUT |=  BIT1;                           // P1.1口置高电平
  P1IES |=  BIT1;                           // 中断沿设置(下降沿触发)
  P1IFG &= ~BIT1;                           // 清P1.1中断标志
  P1IE  |=  BIT1;                           // 使能P1.1口中断

  __bis_SR_register(LPM4_bits + GIE);       // 进入低功耗模式4 开中断
  __no_operation();                                   // 空操作

}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
   if((P1IN&BIT1)==0)
   {
      delay_ms(50);
      P1OUT ^= BIT0;                          //改变LED1灯状态
      delay_ms(50);
      P1IFG &= ~BIT1;                         //清P1.1中断标志位
      delay_ms(50);
   }
}

二、总结

关于这一部分的学习,其实就是对基本寄存器的学习,毕竟都是从点灯开始的,下一篇我会着重讲一下时钟的配置问题,这一问题是比较重要的,因为如果不配置时钟的话,后续各种操作会因为默认1MHZ的时钟源变得相当缓慢,因此配置时钟就变得尤为重要,这一讲主要还是比较基础的认识MSP430,学习三种点灯方式,轻松入手哈哈。

到这里附上我的板子哈哈,再见各位博友,希望这一讲有帮助到你,欢迎访问其他文章,三连走起哈哈,如果觉得写得还可以,记得给博主点个赞!

题外话:

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

  • 60
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说二话的自家人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值