打印
[开发工具]

HC32F460的GPIO操作

[复制链接]
1526|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elsaflower|  楼主 | 2024-11-18 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//时钟配置如下
void SYSClk_Config(void) {

    CLK_HrcCmd(Disable);
    uint32_t delay = 1000;
    while(delay--) {};
    CLK_XtalCmd(Enable);
    CLK_HrcCmd(Enable);  //HRC默认16M
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_SRAMH, Enable);
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_SRAM12, Enable);
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_SRAM3, Enable);
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_SRAMRET, Enable);
    stc_clk_output_cfg_t stcOutputClkCfg;
    MEM_ZERO_STRUCT(stcOutputClkCfg);
    {
        //主时钟和ram时钟配置
        stc_sram_config_t stcSramConfig;
        MEM_ZERO_STRUCT(stcSramConfig);
        /* sram init include read/write wait cycle setting */
        stcSramConfig.u8SramIdx     = Sram12Idx | Sram3Idx | SramRetIdx;
        stcSramConfig.enSramRC      = SramCycle2;
        stcSramConfig.enSramWC      = SramCycle2;
        stcSramConfig.enSramEccMode = EccMode3;
        stcSramConfig.enSramEccOp   = SramNmi;
        stcSramConfig.enSramPyOp    = SramNmi;
        SRAM_Init(&stcSramConfig);
        stcSramConfig.u8SramIdx     = SramHsIdx;
        stcSramConfig.enSramRC      = SramCycle1;
        stcSramConfig.enSramWC      = SramCycle1;
        stcSramConfig.enSramEccMode = EccMode3;
        stcSramConfig.enSramEccOp   = SramNmi;
        stcSramConfig.enSramPyOp    = SramNmi;
        SRAM_Init(&stcSramConfig);
        /* flash 读等待周期*/
        EFM_Unlock();
        EFM_SetLatency(EFM_LATENCY_5);
        EFM_InstructionCacheCmd(Enable);
        EFM_Lock();
        stc_clk_mpll_cfg_t stcMpllCfg;
        MEM_ZERO_STRUCT(stcMpllCfg);
        /* MPLL config (XTAL / pllmDiv * plln / PllpDiv = 200M). */
        stcMpllCfg.pllmDiv = 2ul;  // 16/2 = 8M MPLL的VCO输入频率介于1MHz到12MHz之间。
        stcMpllCfg.plln    = 24ul;  // 8x42 = 192M 确保MPLL的VCO频率介于240MHz到480MHz之间
        stcMpllCfg.PllpDiv = 1ul;  // 192M
        stcMpllCfg.PllqDiv = 1ul;  // 192M
        stcMpllCfg.PllrDiv = 1ul;  // 192M
        CLK_SetPllSource(ClkPllSrcXTAL);
        CLK_MpllConfig(&stcMpllCfg);
        /* Enable MPLL. */
        CLK_MpllCmd(Enable);
    }
    {
        //外设时钟分频
        stc_clk_sysclk_cfg_t stcSysClkCfg;
        MEM_ZERO_STRUCT(stcSysClkCfg);
        /* Set bus clk div. */
        stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  //  CPU
        stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  //  SDIO CAN
        stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  //  TIM6计数
        stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  //  UART SPI USB逻辑 TIM0 TIMA TIM4 TIM6逻辑
        stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  //  ADC变换
        stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  //  RTC I2C CMP WDT SWDT
        stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  //  ADC逻辑控制,TRNG
        CLK_SysClkConfig(&stcSysClkCfg);
    }
    PWC_HS2HP();  // high speed -> high performance
    CLK_SetSysClkSource(CLKSysSrcMPLL);
}
int main() {
    PORT_Unlock();
    M4_PORT->PSPCR       = 3;
    M4_PORT->PCCR_f.RDWT = 3;
    SYSClk_Config();
    stc_port_init_t stcPortInit = {0};
    stcPortInit.enPinMode = Pin_Mode_Out;
    stcPortInit.enPinDrv = Pin_Drv_H;
    PORT_Init(PortB, Pin03, &stcPortInit);
  //使用bit-band映射翻转位,暂时不清楚使用bit-band之后keil调试容易崩溃,但是执行无问题
    uint32_t* pb3T_bitBand = (unsigned int*)(0x42A7038CUL);
    while(1) {
        *pb3T_bitBand = 1;
    }
}
反汇编如下
<span]以上代码执行后示波器抓取IO波形,频率为32MHZ:

<span]看看IO口波形:


使用特权

评论回复
沙发
suncat0504| | 2024-11-19 10:22 | 只看该作者
简单的GPIO操作,竟然涉及这么多的时钟设置。RAM的也需要特别设置吗?

使用特权

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

本版积分规则

27

主题

1297

帖子

0

粉丝