SysCtlClockSet(
SYSCTL_OSC_INT | //??????
SYSCTL_USE_PLL | //??PLL
SYSCTL_SYSDIV_4 | //4???50MHz
SYSCTL_MAIN_OSC_DIS); //?????Main_OSC
上面的代码应该是50MHZ的系统时钟。
SysCtlDelay的参数设置为什么才能实现0.1ms的延时呢?
谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SysCtlClockSet(
SYSCTL_OSC_INT | //??????
SYSCTL_USE_PLL | //??PLL
SYSCTL_SYSDIV_4 | //4???50MHz
SYSCTL_MAIN_OSC_DIS); //?????Main_OSC
上面的代码应该是50MHZ的系统时钟。
SysCtlDelay的参数设置为什么才能实现0.1ms的延时呢?
谢谢!
Wind
一个SysCtlDelay的loop需要3个时钟周期,如果需要0.1秒的延时,可以这样使用:
SysCtlDelay((SysCtlClockGet()/3)/10);
感谢您的回复!我目前在做一个红外接收的程序,参考了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;
}
}
感谢您的回复!
可以进入中断的,但是似乎存在多次触发中断的问题(就是退出中断之后又立即进入中断,但是我已经在中断中清除了中断标志,并且关闭了中断)
进入中断后可以运行到双重FOR循环中,但是无法读取正确的信息。
奇怪的是有时候前面两个while循环也不行(分别用以延时NEC协议的开头9ms低电平和4.5ms高电平)
使用的是hs0038a红外接收管。