LOVEBABY 发表于 2015-10-14 19:28:38

MSP432P401R的systick应用有问题,帮看

#include <msp432p401r.h>
#include "CS.h"

static uint8_tfac_us=0;                                                        //us延时倍乘数                          
static uint16_tfac_ms=0;

void Delay_Init()
{
SYSTICK_STCSR |=SYSTICK_STCSR_CLKSOURCE;
fac_us =CS_getMCLK()/1000000;
fac_ms = (uint16_t)(fac_us*1000);

}
void CS_HFXTCLK()
{
CSKEY=CSKEY_VAL;             //解锁时钟寄存器
CSCTL2 |=HFXT_EN;               //HFXT 打开
do{
    CSCLRIFG |=   CLR_HFXTIFG | CLR_DCORIFG;//清中断标志位
    SYSCTL_NMI_CTLSTAT &= ~ SYSCTL_NMI_CTLSTAT_CS_SRC;    //禁止NMI中CS中断
    }
while(SYSCTL_NMI_CTLSTAT & SYSCTL_NMI_CTLSTAT_CS_FLG);
   CSCTL1 |=(DIVA__32 | SELA__LFXTCLK)|(DIVS__32 | SELS__HFXTCLK)|(DIVM__32 | SELM__HFXTCLK);//选择
CSKEY =0;                      //锁住时钟寄存器

}
void Delay_ms(uint16_t nms)////   nms<=0xffffff*1000/SYSCLK
{
   uint32_t temp;
   SysTick->LOAD = (uint32_t)nms*fac_ms;         //时间加载
   SysTick->VAL= 0X00;               //清空计数器
   SysTick->CTRL = 0X01;               //开始倒数
do
{
    temp= SysTick->CTRL ;
}while((temp&0x01)&&!(temp&(1<<16)));//等到时间到达

   SysTick->CTRL = 0X00;               //关闭计数器
   SysTick->VAL= 0X00;               //清空计数器
}
void main(void)
{volatile uint32_t i;

    WDTCTL = WDTPW | WDTHOLD;               // Stop WDT
   
    P1DIR|=BIT0 ;                        //P1.0设置为输出
    P2DIR |=BIT0+BIT1+BIT2;             //P2.0,P2.1设置为输出

   CS_HFXTCLK();
   Delay_Init();

   while(1)
   {
      P2OUT ^= BIT0 ;
   Delay_ms(1500);   
   P2OUT ^= BIT2 ;
   Delay_ms(500);
   
   P2OUT ^= BIT1 ;
   Delay_ms(300);   
   P1OUT ^= BIT0 ;
   Delay_ms(2000);
   }
}
页: [1]
查看完整版本: MSP432P401R的systick应用有问题,帮看