打印
[资料干货]

CH579M注释

[复制链接]
290|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2024-10-8 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
```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("*"); // 打印一个星号,表示捕获完成
    }
}
```

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

575

主题

1941

帖子

5

粉丝