zoukankan      html  css  js  c++  java
  • CH579/573/581/582/583/CH57x/CH58x GPIO使用以及外设重映射

    CH579/CH573/CH57x GPIO使用


    其实不是很想写,无奈有时候还是写写,用到时候贴代码比较快

    适用芯片

    • CH579/CH578/CH577
    • CH573/CH571
    • CH581/CH582/CH583

    CH57x/CH58x GPIO特点

    从手册上看,WCH的CH57x,CH58x其GPIO寄存器基本是一致的,其提供的SDK的代码也基本一致

    • CH577/578/579只有Px0-15支持中断
    • CH571/573 全部IO都支持中断
    • 所有的中断都支持中断唤醒
    • 睡眠后IO的状态可以保持
    • 没有专门的开漏模式支持(实现开漏可参阅此文章)

    SDK里提供的函数的使用

    //CH57x只有两个Port,wch的驱动是分别用不同的函数来对待的
    //初始化PA9,推拉模式输出,5mA驱动能力
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    
    //拉高PA9
    GPIOA_SetBits(GPIO_Pin_9);
    //拉高PA8,PA9
    GPIOB_SetBits(GPIO_Pin_8|GPIO_Pin_9);
    //拉低PB3
    GPIOB_ResetBits(GPIO_Pin_3);
    //反转IO
    GPIOB_InverseBits(GPIO_Pin_3);
     
    //读GPIOA port
    GPIOA_ReadPort();
    //读GPIOB port
    GPIOB_ReadPort();
    //读PAx的值
    //GPIOA_ReadPortPin的返回值并不是bool值,而是对应的port&pin的值
    GPIOA_ReadPortPin( pin );
    

    外部中断

    在CH577/CH578/CH579上

    //初始化位输入上拉
    GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
    //开启下降沿中断
    GPIOB_ITModeCfg(GPIO_Pin_8,GPIO_ITMode_FallEdge);
    //开启GPIO的睡眠唤醒,如果需要的话
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE ); 
    //开启GPIO中断
    NVIC_EnableIRQ( GPIO_IRQn );
     
    //中断服务程序
    void GPIO_IRQHandler(void) {
        PRINT("gpio interrupt
    ");
        GPIOB_ClearITFlagBit(GPIO_Pin_8);
    }
    

    在CH571/CH573上

    void gpio_wake_init() {
        //初始化位输入上拉
        GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
        //开启下降沿中断
        GPIOB_ITModeCfg(GPIO_Pin_4,GPIO_ITMode_FallEdge);
        //开启GPIO睡眠唤醒
        PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE,Edge_LongDelay );
        //开启GPIOB中断
        PFIC_EnableIRQ(GPIO_B_IRQn);
    }
    
    //中断服务程序
    __attribute__((interrupt("WCH-Interrupt-fast")))  //硬件压栈
    __attribute__((section(".highcode")))             //放到RAM里
    void GPIOB_IRQHandler(void) {
        PRINT("gpio interrupt
    ");
        GPIOB_ClearITFlagBit(GPIO_Pin_4);
    }
    
    

    外设重映射

    CH57Xx系列的芯片,很多数字外设都支持 端口重映射(只是映射到芯片支持的第二个IO上)
    如在ch573/ch571上 把UART1 从默认的PA8,PA9映射到PB12:
    image

        //remap uart1 to PB13/PB12
    
        //使能对应的外设重映射
        GPIOPinRemap( ENABLE, RB_PIN_UART1 );
        //初始化对应外设映射后的gpio
        GPIOB_SetBits(bTXD1_);
        GPIOB_ModeCfg(bTXD1_, GPIO_ModeOut_PP_5mA);
        GPIOB_ModeCfg( bRXD1_, GPIO_ModeIN_PU );
        //初始化对应的外设
        UART1_DefInit( );
    

    注意事项

    1. CH578M/CH579M的 PB16 PB17 对应的是ARM-SWD调试口,如果启用了,会导致该两个io在程序中不能被控制
    2. 对于下降沿或者低电平唤醒,在进入休眠时候必须保证 对应的IO是高电平,否则电流会比较大,mA级; 对于上升沿或者高电平唤醒,在进入休眠时候必须保证 对应的IO是低电平,否则电流会比较大,mA级
    3. GPIO的原子操作问题:
    • CH57x,CH58x 系列的BLE芯片,其GPIO都是只提供了reset寄存器,并没有提供专用的set寄存器.
  • 相关阅读:
    想起来好久没更新博客了
    操作系统文件管理
    PreparedStatement是如何大幅度提高性能的
    Java中快速排序的实现
    详解HashMap的内部工作原理
    关于Java集合的总结
    浅谈JVM内存区域划分
    解决java压缩图片透明背景变黑色的问题
    Vmware15.5中centos7minimal版 窗口字体太小
    字符长度还是字节长度
  • 原文地址:https://www.cnblogs.com/iot-fan/p/14304943.html
Copyright © 2011-2022 走看看