03:时钟与中断代码(LED闪烁与波形)【MSP430F5529】

目录

定时器与中断

代码一:LED闪烁

功能描述

代码实现(有详细注释)

代码二:波形测试

功能描述

代码实现(有详细注释)

测试输出


定时器与中断

        系统正常运行,当发生某个特定具有优先级的事件,系统目前正在运行的任务暂停,去执行中断事件服务函数,一般可在中断服务函数中进行一个计数操作,或者完成某个完整的工作。

        而定时器与中断有什么关系呢,它可以设置的是一个检测频率,检测某个事件是否发生。若设置定时器为1S,则1s执行一次中断判断事件是否发生,发生,则执行中断服务函数内部逻辑。

代码一:LED闪烁

功能描述

        要实现的功能是:LED每500ms切换一次状态,即500ms亮、500ms灭,循环。

        先对LED、对定时器进行初始化,然后写入中断函数。

         * 使用TA0,CCR0
         * TACK = SMCLK/1 = 1M, 1/1M = 1us,计数500ms,即配置TA0CCR0 = 500000。

        当定时器到500000时,即时间过去了500ms,这个时候判断中断服务函数的条件,执行函数内部的逻辑,使LED灯的电平发生翻转。

代码实现(有详细注释)


#include <msp430.h> 
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   //关闭“看门狗”
   
    //LED初始化
    P4DIR |= BIT7;              //初始化为输出
    P4OUT &= ~BIT0;             //初始化低电平

    //定时器初始化
    TA0CCTL0 = CCIE;            //使能CCR0中断
    TA0CCR0 = 500000;            //设置计数值,500000*1us=500ms
    TA0CTL = TASSEL_2 + MC_1 + TACLR;       //选择时钟源,选择工作模式

    __bis_SR_register(LPM0_bits + GIE);     //全局中断,使用‘_EINT();’也可

}

//中断服务函数
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    P4OUT ^= BIT7;  //每500ms,引脚输出取反
}

代码二:波形测试

功能描述

        设置一个定时器中断,并在中断服务例程中切换两个引脚的输出状态,从而产生PWM(脉宽调制)信号。这种技术广泛应用于电机控制、LED亮度调节等领域

代码实现(有详细注释)

#include"msp430.h"

void main(void)
{
    WDTCTL = WDTPW+WDTHOLD;

    P1DIR |= BIT1;                         //设置P1.0为输出
    P8DIR |= BIT2;

    TA0CCTL0 = CCIE;                      //使能中断
    TA0CCR0 = 5000;
    TA0CTL = TASSEL_2 + MC_1 + TACLR;     //设置TA0,时钟源为SMCLK,计数模式为增计数,清零

    __bis_SR_register(LPM0_bits + GIE);   //进入低功耗,打开全局中断
    __no_operation();
}

#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)      //任意选定管脚输出PWM波
{
    P1OUT ^= BIT1;
    P8OUT ^= BIT2;
}

测试输出

修改TA0CCR0的值,如下,测量P1.2的输出波形,

TA0CCR0 = 500          //T=500us,f = 1053Hz
TA0CCR0 = 1000         //T=1000us,f = 523.6Hz
TA0CCR0 = 5000         //T=5000us,f = 105.3Hz
TA0CCR0 = 20000        //T=50000us,f = 10.5Hz

       1. 当TA0CCR0 = 500时,T=500us,示波器测试结果如下图:

        2.当TA0CCR0 = 1000时,T=1ms,示波器测试结果如下:

        3.当TA0CCR0 = 5000时,T=5ms,示波器测试结果如下:

        4.当TA0CCR0 =20000时,T=20ms,示波器测试结果如下:

2024/06/03:更新吐槽

隔了蛮久,现在是做硬件工程师,回来看看以前写的,一眼发现这个脉冲,过冲蛮厉害的,波形不稳定,哈哈哈哈,吐槽一会。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
以下是使用MSP430F5529生成50Hz正弦波的示例代码: ```c #include <msp430.h> #include <math.h> #define PI 3.14159265 #define BUFFER_SIZE 100 volatile int buffer[BUFFER_SIZE]; volatile int buffer_index = 0; volatile int timer_count = 0; void setupTimer() { TA0CCTL0 = CCIE; // Enable Timer A0 interrupt TA0CCR0 = 20000; // Set Timer A0 period (20,000 cycles for 50Hz) TA0CTL = TASSEL_2 + MC_1 + TACLR; // Use SMCLK, Up mode, Clear TAR } void setupDAC() { // Configure DAC output pin P6SEL |= BIT6; // Configure DAC12 DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; DAC12_0DAT = 0; } void generateSinWave() { float amplitude = 2047.5; // Half of the DAC range (4095 / 2) float frequency = 50; // 50Hz float time_step = 1.0 / frequency; float time = timer_count * time_step; int sin_value = amplitude * sin(2 * PI * frequency * time) + amplitude; DAC12_0DAT = sin_value; } void main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer setupTimer(); setupDAC(); __bis_SR_register(GIE); // Enable global interrupts while (1) { generateSinWave(); } } #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void) { timer_count++; if (timer_count >= BUFFER_SIZE) { timer_count = 0; } } ``` 这段代码使用了MSP430F5529定时器和DAC模块来生成50Hz正弦波。在`generateSinWave`函数中,通过计算当前时间和正弦函数来生成DAC输出的值。定时器中断每20,000个周期触发一次,用于更新计数器和调用`generateSinWave`函数。最后,在主循环中不断生成正弦波形。 请注意,这只是一个基本的示例代码,您可能需要根据您的具体需求进行修改和优化。还请确保正确配置MSP430F5529时钟和引脚设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千城千景

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

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

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

打赏作者

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

抵扣说明:

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

余额充值