- /*
- **
- ** 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;
- }
|