gd32时钟初始化

src/common/system_gd32f4xx.c:
void SystemInit (void) {
	***
	system_clock_config();
}
static void system_clock_config(void)
{
	***	//更具宏选择,配置时钟
#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL)
    system_clock_200m_25m_hxtal();
#endif /* __SYSTEM_CLOCK_IRC16M */   
}
static void system_clock_200m_25m_hxtal(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;
    
    /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
        while(1){
        }
    }
         
    RCU_APB1EN |= RCU_APB1EN_PMUEN;
    PMU_CTL |= PMU_CTL_LDOVS;

    /* HXTAL is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/2 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;
    /* APB1 = AHB/4 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;

    /* Configure the main PLL, PLL_M = 25, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ 
    RCU_PLL = (25U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) |
                   (RCU_PLLSRC_HXTAL) | (9U << 24U));

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }
    
    /* Enable the high-drive to extend the clock frequency to 200 Mhz */
    PMU_CTL |= PMU_CTL_HDEN;
    while(0U == (PMU_CS & PMU_CS_HDRF)){
    }
    
    /* select the high-drive mode */
    PMU_CTL |= PMU_CTL_HDS;
    while(0U == (PMU_CS & PMU_CS_HDSRF)){
    } 
    
    /* select PLL as system clock */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLLP;

    /* wait until PLL is selected as system clock */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLLP)){
    }
}

本质是参考Drivers/GD32F4xx_standard_peripheral/Source/rcu.c,拼凑实现。
对于不同的板卡,使用不同的宏,达到便捷控制的目的。

注释system_gd32f4xx.c中的宏,
在板卡对应.mk下加以下宏即可
#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL       (uint32_t)(200000000)
GD32系列单片机的ADC(Analog-to-Digital Converter,模拟数字转换器)初始化主要包括以下几个步骤: 1. **包含头文件**: ```c #include "gd32f4xx_adc.h" ``` 2. **配置时钟**: ADC需要ADCCLK时钟,通常通过系统时钟分频得到。例如,如果你使用PLL设置: ```c // 分配ADC时钟 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 如果你想独立使用ADC ADC_InitStructure.ADC_Prescaler = ADC_Prescaler_Div2; // 根据需求选择预分频因子 ADC_InitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; // 如果不需要DMA,设为Disabled ADC_InitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_1Cycle; // 取样时间 HAL_ADC_Start(&ADC1); // 开启ADC时钟 ``` 3. **选择通道和模式**: 根据你的硬件配置,配置你要使用的ADC通道和工作模式(连续、扫描等): ```c ADC_ChannelConfTypeDef sChannelConfig; sChannelConfig.Channel = ADC_Channel_0; // 设置要转换的通道 sChannelConfig.Rank = ADC_Rank_1; // 设置位深度(8、12或16位) sChannelConfig.SamplingTime = ADC_SamplingTime_250us; // 取样时间 ADC箔AddChannel(&ADC1, &sChannelConfig); // 添加通道到转换序列 ``` 4. **启动转换**: ```c ADC_Cmd(&ADC1, ENABLE); // 启动ADC模块 ``` 5. **处理中断**(如果需要): ```c HAL_NVIC_EnableIRQ(ADC_IRQn); // 开启ADC中断 ``` 6. **数据读取**: 使用`HAL_ADC_GetValue(&ADC1)`获取转换结果。 注意:以上代码仅作示例,实际应用中可能需要根据你的GD32F4xx系列芯片的具体型号和版本做相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值