/*
**
** Main.c
**
**
**********************************************************************/
/*
Last committed: $Revision: 00 $
Last changed by: $Author: $
Last changed date: $Date: $
ID: $Id: $
**********************************************************************/
/*与启动文件和ld配置文件匹配,SystemInit()函数不可删除*/
#ifndef __NO_SYSTEM_INIT
void SystemInit (void) {}
#endif
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
/***************************************************************************************
M051输入捕获demo代码,外接12MHz晶体,超级终端115200波特率可显示输出信息.
注:需要短接P2.0和P2.1引脚。
P2.1(PWM1)输出PWM波形,P2.0(捕获器0)捕获PWM1输出波形的低电平和高电平周期。
****************************************************************************************/
#include "common.h"
/***************************************************************************************
描述 : Capture中断处理函数
****************************************************************************************/
void PWMA_IRQHandler(void)
{
uint16_t uiLow_Pulse, uiHigh_Pulse;
uint32_t u32status;
u32status = CCR0A; //获取Capture通道0控制寄存器的值
CCR0A |= CAPIF0; //清除Capture0中断标志
uiLow_Pulse = CNR0A - CRLR0A; //计算低脉冲宽度
uiHigh_Pulse = CNR0A - CFLR0A; //计算高脉冲宽度
if (u32status & CFLRI0) //如果Capture0捕获到一个下降沿,表示一个完整的PWM周期捕获完成
printf("Low Duty: %4d/%d, High Duty: %4d/%d\n", uiLow_Pulse, uiLow_Pulse + uiHigh_Pulse, uiHigh_Pulse, uiLow_Pulse + uiHigh_Pulse);
}
int main(void)
{
Un_Lock_Reg(); //解锁被保护的寄存器位,以便用户访问
PWRCON |= XTL12M_EN; //使能外部12MHz晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等12M晶振时钟稳定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //选外部12MHz晶振为系统时钟
Lock_Reg(); //重新锁被保护的寄存器位
UART_Init();Show_Pass();
Send_String_To_PC("press Enter to start...\n");
getchar();
P2_MFP = P2_MFP & (~(P20_AD8_PWM0 | P21_AD9_PWM1)) | (PWM0 | PWM1); //设置P2.0,P2.1为PWM0和PWM1功能
P2_PMD = P2_PMD & (~(Px0_PMD | Px1_PMD)) | (Px1_OUT | Px0_QB); //配置P2.0和P2.1为准双向模式和输出模式
APBCLK |= PWM01_CLKEN; //使能PWM0,1时钟
CLKSEL1 = (CLKSEL1 & (~PWM01_CLK)) | PWM01_12M; //选择外部12M晶振输入作为Capture0和PWM1时钟源
PPRA = 0x000000FF; //设置PWM0,1时钟预分频值为(255+1)=256
CSRA = 0x00000033; //设置PWM0,1时钟分频值为16
PCRA |= (CH0_AU_RL | CH1_AU_RL); //设置Capture0和PWM1为自动重载模式
CNR0A = 0xFFFF; //设置Capture0重载寄存器的值
CCR0A &= ~INV0_ON; //禁止Capture0反向功能
CCR0A |= CAPCH0EN; //使能PWM通道0捕捉功能
CAPENRA |= CAPCH0_ON; //使能Capture0通道输入有效
PIERA |= PWMIE0; //使能PWM通道0中断
CCR0A |= CFL_IE0; //使能Capture0下降沿锁定中断
CCR0A |= CRL_IE0; //使能Capture0上升沿锁定中断
NVIC_ISER = PWMA_INT; //使能NVIC PWM0~3中断
CNR1A = 255; //设定PWM1输出周期为256个PWM时钟周期
CMR1A = 63; //设定PWM1输出高电平周期为64个PWM时钟周期
POEA = PWM1_OE; //PWM1输出使能
PCRA |= (CH0EN | CH1EN); //使能PWM0,1下数计数器开始计数
while(1);
return 1;
}
|