Arm 在LPC2148的keil uVision逻辑分析仪上找不到我的信号

Arm 在LPC2148的keil uVision逻辑分析仪上找不到我的信号,arm,embedded,microcontroller,keil,lpc,Arm,Embedded,Microcontroller,Keil,Lpc,我正在尝试在keil上运行lpc2148的PWM程序。这有10%的占空比。但是,我可以在端口0上看到信号(P0.21)。 这是我的密码。我很有信心这是对的 #include<lpc214x.h> int main() { PINSEL0=0x00000000; // P0.0 to P0.15 pins of PORT0 as GPIO PINSEL1=0x00000400; // P0.21 Pin of PORT0 as PWM PINSEL2=0x00000000; //

我正在尝试在keil上运行lpc2148的PWM程序。这有10%的占空比。但是,我可以在端口0上看到信号(P0.21)。 这是我的密码。我很有信心这是对的

#include<lpc214x.h>

int main()

{
PINSEL0=0x00000000; // P0.0 to P0.15 pins of PORT0 as GPIO
PINSEL1=0x00000400; // P0.21 Pin of PORT0 as PWM
PINSEL2=0x00000000; // P1.16 to P1.31 pins of PORT1 as GPIO
/*Configure the PLL block and set the CCLK and PCLK at 60 MHz */
PLL0CON=0x01;
PLL0CFG=0x24;
PLL0FEED=0xaa;
PLL0FEED=0x55;
while (!(PLL0STAT & 0x00000400));
PLL0CON=0x03;
PLL0FEED=0xaa;
PLL0FEED=0x55;
VPBDIV=0x01;
/* Setup and initialize the PWM block */
PWMPCR=0x00; // Single Edge PWM Mode
PWMPR=60000-1; // Resolution of PWM is set at 1 mS
PWMMR0=10; // Period of PWM is 10 mS
PWMMR5=1; // Pulse width of PWM5 is 1 mS
PWMMCR= (1<<1); // PWMTC is reset on match with PWMMR0
PWMLER= (1<<5)| (1<<0); // Update Match Registers PWMMR0 and PWMMR5
PWMPCR= (1<<13); // Enable PWM5 output
PWMTCR= (1<<1); // Reset PWM TC and PWM PR
PWMTCR= (1<<0)| (1<<3); // Enable PWM Timer Counters and PWM Mode
//PWMMR5 = 1;
//PWMLER = (1<<5); //Update Latch Enable bit for PWMMR5
}
#包括
int main()
{
PINSEL0=0x00000000;//端口0的P0.0到P0.15引脚作为GPIO
PINSEL1=0x00000400;//端口0的P0.21引脚作为PWM
PINSEL2=0x00000000;//端口1的P1.16到P1.31引脚作为GPIO
/*配置PLL块,并将CCLK和PCLK设置为60 MHz*/
PLL0CON=0x01;
PLL0CFG=0x24;
PLL0FEED=0xaa;
PLL0FEED=0x55;
而(!(PLL0STAT&0x00000400));
PLL0CON=0x03;
PLL0FEED=0xaa;
PLL0FEED=0x55;
VPBDIV=0x01;
/*设置并初始化PWM模块*/
PWMPCR=0x00;//单边PWM模式
PWMPR=60000-1;//PWM的分辨率设置为1ms
PWMMR0=10;//脉宽调制周期为10ms
PWMMR5=1;//PWM5的脉冲宽度为1ms
PWMMCR=(1Keil调试器的“逻辑分析器”工具通过SWO跟踪监视特定的全局变量。您的代码没有全局变量,您也没有说明要监视什么

在真正的硬件上,只能监控全局变量。外围寄存器和I/O引脚只能在模拟中按照

要获得跟随PWM的跟踪,需要实现一个PWM中断处理程序,该处理程序将输出引脚的状态复制到全局或(更好)读取
PWMIR
寄存器,并将其复制到全局变量和/或将全局变量设置为
PWMIR
寄存器推断的状态。然后直接监视全局变量而不是pin

例如:

volatile bool pwmout = 0 ;
volatile bool pwmmatch = 0 ;

__irq void PWM_ISR( void )
{
    pwmmatch = PWMIR  ;

    if( (PWMIR & 0x0001) != 0 )  // MR0 = 1
    {
        pwmout = 1 ;
    }
    else if ( PWMIR & 0x0020 )  // MR5 = 1
    {
        pwmout = 0 ;
    }
    PWMIR = 0 ; // clear interrupt

    VICVectAddr = 0x00000000;
}
然后,您可以在逻辑分析仪中监控
pwmout
和/或
pwmmatch

我不熟悉您的特定微控制器,因此上面可能需要一些调整。显然,您还需要启用中断处理程序-类似于:

VICVectAddr0 = (unsigned) PWM_ISR; /* PWM ISR Address */
VICVectCntl0 = (0x00000020 | 8); /* Enable PWM IRQ slot */
VICIntEnable = VICIntEnable | 0x00000100; /* Enable PWM interrupt */
VICIntSelect = VICIntSelect | 0x00000000; /* PWM configured as IRQ */
但我只是复制现有的例子——没有保证

最后,在
main()
的末尾添加一个无限循环,以防止
main()
终止到谁知道在哪里:

for(;;)
{
    // do nothing
}

我的不好。谢谢您的更正,先生。您的
main()
将运行到完成,然后终止-然后发生的事情是未定义的。您应该进入一个循环(可能使用
\u WFI
指令以降低功耗)。期望运行时在exist上进入循环而不是简单地重置是不可靠的…忽略
\u WFI
建议-这是针对Cortex-M的-谁知道您仍然可以获得ARM7TDMI设备?!先生,我已经将端口0添加到我的逻辑分析器中,然后我将掩码应用为0x00200000以观察P0.21信号。我只能看到零信号。而在端口0上,我实际上可以看到P0.21不断地变高变低。@newbie99:好的,那么你有你的答案-你不能监视I/O引脚。有一个解决办法-将进行编辑。