```c
#include "CH57x_common.h" // 引入CH57x通用头文件
__align(4) UINT32 CapBuf[100]; // 定义一个长度为100的UINT32类型数组,用于存储捕获数据
volatile UINT8 capFlag = 0; // 定义一个全局变量capFlag,用于标记捕获完成
void DebugInit(void)
{
GPIOA_SetBits(GPIO_Pin_9); // 设置GPIOA的第9位输出高电平
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // 配置GPIOA的第8位为输入模式,上拉电阻使能
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // 配置GPIOA的第9位为推挽输出模式,输出电流5mA
UART1_DefInit(); // 初始化UART1串口
}
int main()
{
UINT8 i;
/* 配置串口调试 */
DebugInit(); // 调用DebugInit函数进行调试初始化
PRINT( "Start @ChipID=%02X
", R8_CHIP_ID ); // 打印芯片ID
#if 0 /* 定时器0,设定100ms定时器进行IO口闪灯, PB3-LED */
GPIOB_SetBits( GPIO_Pin_3 ); // 设置GPIOB的第3位输出高电平
GPIOB_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA ); // 配置GPIOB的第3位为推挽输出模式,输出电流5mA
TMR0_TimerInit( FREQ_SYS/10 ); // 设置定时器0的时间为系统频率除以10,即100ms
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启定时器0的周期结束中断
NVIC_EnableIRQ( TMR0_IRQn ); // 使能定时器0的中断
#endif
#if 1 /* 定时器3,PWM输出 */
GPIOA_ResetBits( GPIO_Pin_2 ); // 清除GPIOA的第2位的输出状态
GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA ); // 配置GPIOA的第2位为推挽输出模式,输出电流5mA
TMR3_PWMInit( High_Level, PWM_Times_1 ); // 初始化定时器3的PWM功能,高电平有效,占空比为1倍
TMR3_PWMCycleCfg( 3200 ); // 设置定时器3的PWM周期为3200个时钟周期,即100ms
TMR3_PWMActDataWidth( 1000 ); // 设置定时器3的PWM占空比为1000个时钟周期,即50%
#endif
#if 1 /* 定时器1,CAP捕捉, */
PWR_UnitModCfg( DISABLE, UNIT_SYS_LSE ); // 关闭LSE晶振单元,以便使用其他功能
GPIOA_ResetBits( GPIO_Pin_10 ); // 清除GPIOA的第10位的输出状态
GPIOA_ModeCfg( GPIO_Pin_10, GPIO_ModeIN_PU ); // 配置GPIOA的第10位为输入模式,上拉电阻使能
TMR1_CapInit( Edge_To_Edge ); // 初始化定时器1的捕获功能,边沿触发
TMR1_CAPTimeoutCfg( 0xFFFFFFFF ); // 设置定时器1的捕获超时时间为最大值
TMR1_DMACfg(ENABLE, (uint32_t)&CapBuf[0], (uint32_t)&CapBuf[100], Mode_Single); // 配置定时器1的DMA传输,将捕获数据存储到CapBuf数组中
TMR1_ITCfg(ENABLE, TMR1_2_IT_DMA_END); // 开启定时器1的DMA完成中断
NVIC_EnableIRQ( TMR1_IRQn ); // 使能定时器1的中断
while( capFlag == 0 ); // 等待捕获完成标志被置位
capFlag = 0; // 重置捕获完成标志
for( i=0; i<100; i++ )
{
printf("%08ld ", CapBuf[i]&0x1ffffff); // 打印捕获数据,只保留低26位(最高位表示高低电平)
}printf("
");
#endif
while(1); // 主循环,保持程序运行
}
void TMR0_IRQHandler( void ) // TMR0 定时中断处理函数
{
if( TMR0_GetITFlag( TMR0_3_IT_CYC_END ) ) // 如果定时器0的周期结束中断标志被置位
{
TMR0_ClearITFlag( TMR0_3_IT_CYC_END ); // 清除中断标志
GPIOB_InverseBits( GPIO_Pin_3 ); // 反转GPIOB的第3位的输出状态,实现闪烁效果
}
}
void TMR1_IRQHandler( void ) // TMR1 定时中断处理函数
{
if( TMR1_GetITFlag( TMR1_2_IT_DMA_END ) ) // 如果定时器1的DMA完成中断标志被置位
{
TMR1_ITCfg(DISABLE, TMR1_2_IT_DMA_END); // 禁用定时器1的DMA完成中断,避免重复触发
TMR1_ClearITFlag( TMR1_2_IT_DMA_END ); // 清除中断标志
capFlag = 1; // 设置捕获完成标志
printf("*"); // 打印一个星号,表示捕获完成
}
}
```
|