Не могу найти свой сигнал на логическом анализаторе keil uVision для LPC2148

Я пытаюсь запустить свою программу PWM на keil для lpc2148. Это имеет 10% рабочий цикл. Однако я вижу сигнал на Port0 (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
}

screenshot Пожалуйста, помогите.


person newbie99    schedule 12.03.2021    source источник
comment
моя вина. Спасибо, что поправили, сэр.   -  person newbie99    schedule 12.03.2021
comment
Ваш main() будет работать до завершения, а затем завершится - что произойдет потом, не определено. Вы должны войти в цикл (возможно, с инструкцией _WFI для снижения энергопотребления). Ожидать, что время выполнения войдет в цикл при существовании, а не просто сбросить, ненадежно.   -  person Clifford    schedule 12.03.2021
comment
... проигнорируйте предложение _WFI - это для Cortex-M - кто знал, что вы все еще можете получить устройства ARM7TDMI ?!   -  person Clifford    schedule 12.03.2021


Ответы (1)


Инструмент логического анализатора отладчика Keil отслеживает определенные глобальные переменные с помощью трассировки SWO. В вашем коде нет глобальных переменных, и вы не указали, что отслеживаете.

На реальном оборудовании можно отслеживать только глобальные переменные. Периферийные регистры и контакты ввода-вывода можно отслеживать только в режиме моделирования, как указано в https://www.keil.com/support/man/docs/uv4/uv4_db_dbg_logicanalyzer_restrictions.htm

Чтобы получить трассировку, которая следует за вашей ШИМ, вам нужно будет реализовать обработчик прерывания ШИМ, который либо копирует состояние выходного вывода в глобальную переменную, либо (лучше) считывает регистр PWMIR и копирует его в глобальную переменную и/или устанавливает global в состояние, определяемое регистром PWMIR. Затем вы отслеживаете глобальную переменную, а не напрямую булавку.

Например:

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
}
person Clifford    schedule 12.03.2021
comment
Сэр, я добавил PORT0 в свой логический анализатор, а затем применил маску 0x00200000 для наблюдения за сигналом P0.21. Я вижу только нулевой сигнал. В то время как на PORT0 я действительно мог видеть, как P0.21 постоянно поднимался и опускался. - person newbie99; 12.03.2021
comment
@ newbie99: Хорошо, тогда у вас есть ответ - вы не можете контролировать контакт ввода-вывода. Есть обходной путь - будем редактировать. - person Clifford; 12.03.2021