需要实现
PA12 捕捉输入
PA13 设定1KHz方波 Duty50% 输出
然后把PA12跟PA13接在一起测量1KHz方波
数据得到 CRLR0=0x31
CFLR0=0x63
发觉PWMA->CCR0.CAPIF0=1; 设置为1的时候,PWM CNR应该要重新计时
但没有重新计数,因为CRLR0=0x31和CFLR0=0x63这两个数据没有一致
#include "NUC1xx.h"
void Initsystem(void);
void PwmInit(void);
int a,b;
main(void)
{
Initsystem();
PwmInit();
PWMA->CCR0.CAPIF0=1;
while(1)
{
while(!PWMA->CCR0.CAPIF0);
PWMA->CCR0.CAPIF0=1;
if(PWMA->CCR0.CFLRI0)//Calculate High Level
{
PWMA->CCR0.CFLRI0=0;
b=PWMA->CFLR0;
}
if(PWMA->CCR0.CRLRI0)//Calculate Low Level
{
PWMA->CCR0.CRLRI0=0;
a=PWMA->CRLR0;
}
while(!PWMA->CCR0.CAPIF0);
PWMA->CCR0.CAPIF0=1;
if(PWMA->CCR0.CFLRI0)//Calculate High Level
{
PWMA->CCR0.CFLRI0=0;
b=PWMA->CFLR0;
}
if(PWMA->CCR0.CRLRI0)//Calculate Low Level
{
PWMA->CCR0.CRLRI0=0;
a=PWMA->CRLR0;
}
while(!PWMA->CCR0.CAPIF0);
PWMA->CCR0.CAPIF0=1;
if(PWMA->CCR0.CFLRI0)//Calculate High Level
{
PWMA->CCR0.CFLRI0=0;
b=PWMA->CFLR0;
}
if(PWMA->CCR0.CRLRI0)//Calculate Low Level
{
PWMA->CCR0.CRLRI0=0;
a=PWMA->CRLR0;
}
}
}
void Initsystem()
{
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;
SYSCLK->CLKSEL0.HCLK_S = 0;
LOCKREG();
}
void PwmInit(void)
{
SYSCLK->CLKSEL1.PWM01_S=0; //00=external, 01=32.768k, 10=HCLK, 11=22.1184M
SYSCLK->APBCLK.PWM01_EN=1; //Enable PWM clock
GPIOA->PMD.PMD12=0; // 設定PA.12 為輸入模式
PWMA->PCR.CH0MOD = 1;
PWMA->CSR.CSR0=4;
PWMA->PPR.CP01=119;
PWMA->CCR0.CAPCH0EN=1; // 致能
PWMA->CCR0.CRL_IE0=1; // 致能正緣
PWMA->CCR0.CFL_IE0=1; // 致能負緣
PWMA->CNR0=99; // 設定PWM週期
PWMA->CAPENR=1; // 致能PWM捕捉輸入模式
SYS->GPAMFP.PWM0_AD13=1; // 設定PA.12 為PWM功能
PWMA->PCR.CH0EN=1; // PWM start
PWMA->PCR.CH1MOD = 1;
PWMA->CSR.CSR1=4;
PWMA->CNR1=99;
PWMA->CMR1=49;
SYS->GPAMFP.PWM1_AD14=1;
PWMA->PCR.CH1EN=1;
PWMA->POE.PWM1=1;
}
2022/09/06 18:04
请做如下检查,作为捕获的PWM要设置为周期模式,初值应设置大一点,以防止数到0了还没有捕捉到跳边沿的情况,不行的话可以到我们官网下载最新的BSP,里面有capture的例程