SysCtlClockSet(
SYSCTL_OSC_INT | //??????
SYSCTL_USE_PLL | //??PLL
SYSCTL_SYSDIV_4 | //4???50MHz
SYSCTL_MAIN_OSC_DIS); //?????Main_OSC
上面的代码应该是50MHZ的系统时钟。
SysCtlDelay的参数设置为什么才能实现0.1ms的延时呢?
谢谢!
Wellin Zhang:
Wind
一个SysCtlDelay的loop需要3个时钟周期,如果需要0.1秒的延时,可以这样使用:
SysCtlDelay((SysCtlClockGet()/3)/10);
Wind:
回复 Wellin Zhang:
感谢您的回复!我目前在做一个红外接收的程序,参考了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; }}
Wellin Zhang:
回复 Wind:
Wind
请先检查一下程序是否能够进入中断?如果进入中断,运行至何处?
Wind:
回复 Wellin Zhang:
感谢您的回复!
可以进入中断的,但是似乎存在多次触发中断的问题(就是退出中断之后又立即进入中断,但是我已经在中断中清除了中断标志,并且关闭了中断)
进入中断后可以运行到双重FOR循环中,但是无法读取正确的信息。
奇怪的是有时候前面两个while循环也不行(分别用以延时NEC协议的开头9ms低电平和4.5ms高电平)
使用的是hs0038a红外接收管。