M4C123GH6PZ编程延时的问题

M4C123GH6PZ编程延时的问题

此问题尚无答案
All Replies
  • 秀才293分

    SysCtlClockSet(
    SYSCTL_OSC_INT | //??????
    SYSCTL_USE_PLL | //??PLL
    SYSCTL_SYSDIV_4 | //4???50MHz
    SYSCTL_MAIN_OSC_DIS); //?????Main_OSC

    上面的代码应该是50MHZ的系统时钟。

    SysCtlDelay的参数设置为什么才能实现0.1ms的延时呢?

    谢谢!

  • 进士3545分

    Wind

    一个SysCtlDelay的loop需要3个时钟周期,如果需要0.1秒的延时,可以这样使用:

    SysCtlDelay((SysCtlClockGet()/3)/10);

    Best Regards

    Wellin

  • 秀才293分

    感谢您的回复!我目前在做一个红外接收的程序,参考了51和STM32的程序,如果延时没有问题,那问题会出在哪里呢?

    main()中做了IO设置

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // ʹÄÜÍâÉèGPIOG

    GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_2,
    GPIO_STRENGTH_8MA,
    GPIO_PIN_TYPE_STD_WPU);// ÉèÖÃPG0Ϊ2MA£¬ÉÏÀ­ÊäÈë

    GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN); //PG0 ÉèΪºìÍâÊäÈë

    GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE); // °´¼üÖжÏÉèΪϽµÑØ´¥·¢

    GPIOPinIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2); // ʹÄÜKEYËùÔڹܽŵÄÖжÏ

    IntEnable(INT_GPIOB); // ʹÄÜGPIOG¶Ë¿ÚÖжÏ
    IntMasterEnable(); // ʹÄÜ´¦ÀíÆ÷ÖжÏ

    然后中断程序如下,但是却无法获取正确的红外编码(通过在LCD上显示接收到的数据),这是为什么呢?

    void GPIO_INT_B(void)
    {
    unsigned char num;
    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);
    IntMasterDisable();

    num=0;
    inInt = 1;
    while(1){
    SysCtlDelay((SysCtlClockGet()/3)/20000); // ÑÓʱԼ0.1ms
    num++;
    if(num>86){
    break;
    }
    }
    num = 0;
    while(0x04==RDATA){
    SysCtlDelay((SysCtlClockGet()/3)/20000); // ÑÓʱԼ0.1ms
    num++;
    if(num>44) //45*0.1ms=4.5ms
    {
    IR_GET = RDATA;
    //return;
    num=0;
    ok++;
    return;
    }
    }

    if(num>40&&num<50){
    for (four=0;four<4;four++)
    {
    for (one=0;one<8;one++)
    {
    num=0;
    while ((0x04!=RDATA)){
    SysCtlDelay((SysCtlClockGet()/3)/20000); // ÑÓʱԼ0.1ms
    num++;
    if (num>=6) //18*0.1ms=1.8ms
    {
    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);

    return;
    }
    }
    while (0x04==RDATA)
    {
    SysCtlDelay((SysCtlClockGet()/3)/20000); // ÑÓʱԼ0.1ms
    num++;
    if (num>=11) //18*0.1ms=1.8ms
    {
    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);
    //ok++;
    return;
    }
    }

    RXDDATA[four]>>=1;
    if(num>15&&num<18)
    {
    RXDDATA[four]|=0x80;
    }
    }
    }
    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);
    if (RXDDATA[2]!=~RXDDATA[3])
    {
    return;
    }
    ldata=RXDDATA[2]&0x0F;
    hdata=RXDDATA[2]>>4;
    }
    }

  • 进士3545分

    Wind

    请先检查一下程序是否能够进入中断?如果进入中断,运行至何处?

    Best Regards

    Wellin

  • 秀才293分

    感谢您的回复!

    可以进入中断的,但是似乎存在多次触发中断的问题(就是退出中断之后又立即进入中断,但是我已经在中断中清除了中断标志,并且关闭了中断)

    进入中断后可以运行到双重FOR循环中,但是无法读取正确的信息。

    奇怪的是有时候前面两个while循环也不行(分别用以延时NEC协议的开头9ms低电平和4.5ms高电平)

    使用的是hs0038a红外接收管。