打印

msp430f5529产生脉冲问题

[复制链接]
1866|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ty10910040121|  楼主 | 2014-10-11 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚学msp430不久,想写一个脉冲产生的程序,脉宽(高电平持续时间在10us—40us),脉宽间距(低电平持续时间在100ms以上);我用的时钟为25Mhz;我利用官网精确延时函数写的;
        P3OUT |= BIT0;
            delay_us(20);
            P3OUT &= ~BIT0;
            delay_ms(100);
问题:程序理论出的结果是每隔100ms会出现20us的尖峰;但是在示波器上观察的结果却有尖峰有丢失;甚至每隔好几百微妙才会出现一个20us的尖峰;请问各位;这是什么原因;是示波器的显示不完整,还是程序问题;之前已经排除了时钟不足的原因

相关帖子

沙发
dirtwillfly| | 2014-10-11 21:02 | 只看该作者
能上传你的完整的程序吗?
根据现在提供的信息,不容易判断是什么原因。

使用特权

评论回复
板凳
ty10910040121|  楼主 | 2014-10-13 18:54 | 只看该作者
dirtwillfly 发表于 2014-10-11 21:02
能上传你的完整的程序吗?
根据现在提供的信息,不容易判断是什么原因。 ...

#include <msp430.h>

#define CPU_F ((double)25000000)
#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))
#define Fuse_High (P3OUT |= BIT0)
#define Fuse_Low  (P3OUT &= ~BIT0)

void Fuse(void);


void SetVcoreUp (unsigned int level)
{

  PMMCTL0_H = PMMPW_H;
  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
  while ((PMMIFG & SVSMLDLYIFG) == 0);
  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
  PMMCTL0_L = PMMCOREV0 * level;
  if ((PMMIFG & SVMLIFG))
  while ((PMMIFG & SVMLVLRIFG) == 0);
  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
  PMMCTL0_H = 0x00;
}

void UCS(void)
{
        P1SEL &= ~BIT1;
        P1DIR |= BIT1;
        P1SEL |= BIT0; //ACLK
        P1DIR |= BIT0;
        P2SEL |= BIT2; //SMCLK
        P2DIR |= BIT2;
        P7SEL |= BIT7; //MCLK
        P7DIR |= BIT7;
        P5SEL |= BIT4|BIT5;
        UCSCTL6 |= XCAP_3;
        UCSCTL6 &= ~XT1OFF;//打开XT1,否则XT1LFOFFG可能报错
        SetVcoreUp(1);
        SetVcoreUp(2);
        SetVcoreUp(3); //提高Vcore电压到最高级,以满足倍频需求该函数位于HAL_PMM.H中
        __bis_SR_register(SCG0);//该语法为固定格式,意为将括号内的变量置位,SCG0与系统工作模式有关,此时MCLK暂停工作
        UCSCTL0 = 0;   //先清零,FLL运行时,该寄存器系统会自动配置
        UCSCTL1 = DCORSEL_6;
    UCSCTL2 = FLLD_1 | 380;//FLLD=1,FLLN=380,则频率为2*(380+1)*32.768=24.969MH
        __bic_SR_register(SCG0);
        __delay_cycles(782000);//系统自带的精确延时,单位us
        while (SFRIFG1 & OFIFG) {
                UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                SFRIFG1 &= ~OFIFG;
        }
         UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
}
void Fuse(void)
{
            Fuse_High;
            delay_us(10);
            Fuse_Low;
            delay_ms(100);
}


/*
* main.c
*/
void main(void) {

        P3DIR |= BIT0;
        P3OUT &= ~BIT0;
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
    UCS();
    while(1)
    {
      Fuse();
    }
}

有些程序是直接在网上和官方的例程,我没有做修改,希望版主解答,可不可以用中断这样做,能不能提一个大概的思路,谢谢

使用特权

评论回复
地板
dirtwillfly| | 2014-10-13 21:15 | 只看该作者
额,是复制来的程序啊。建议使用别人的程序前,先弄懂每句的意思和程序的思路

使用特权

评论回复
5
ty10910040121|  楼主 | 2014-10-13 21:55 | 只看该作者
dirtwillfly 发表于 2014-10-13 21:15
额,是复制来的程序啊。建议使用别人的程序前,先弄懂每句的意思和程序的思路 ...

恩恩,好的,谢谢!

使用特权

评论回复
6
angerbird| | 2014-10-17 17:43 | 只看该作者
这个主要看下代码里面的问题的吧。。

使用特权

评论回复
7
ruichin| | 2016-5-23 14:49 | 只看该作者
搭配MSP430的32.768KHZ晶振,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝