CW32L083不同主频功耗测试

本文主要介绍CWL083VCT6芯片在不同主频下的功耗测试方法和测试结果。

1.HSIOSC时钟

HSIOSC 时钟由内部 RC 振荡器产生,不需要外部电路,比 HSE 时钟的成本低,启动速度快。HSIOSC 时钟频率固定为 48MHz,频率精度低于 HSE 时钟。RC 振荡器输出时钟的频率受芯片加工过程、工作电压、环境温度等因素影响,CW32L083 提供了 HSIOSC 时钟频率校准功能,用户可通过设置内置高频时钟控制寄存器 SYSCTRL_HSI 的 TRIM 位域值来校准 HSIOSC 时钟频率,HSIOSC 内部高速 RC 振荡器在芯片上电后,默认处于开启状态,用户可通过设置系统控制寄存器的 SYSCTRL_CR1 的HSIEN 位域为 0 来关闭。如用户停止并重新启动了 HSIOSC 振荡器,可通过内置高频时钟控制寄存器 SYSCTRL_HSI的 STABLE 标志位来确定 HSI 时钟是否稳定,STABLE 标志为 1 表示 HSIOSC 时钟已稳定,为 0 则表示 HSIOSC 时钟还未稳定。

HSIOSC 时钟经过分频后输出 HSI 时钟,分频系数通过内置高频时钟控制寄存器 SYSCTRL_HSI 的 DIV 位域设置,有效分频系数为 1、2、4、6、8、10、12、14、16,上电后默认值为 6,所以 HSI 时钟默认频率为 8MHz。

2.PLL时钟

CW32L083 内部集成锁相环 PLL 电路,可对输入时钟源进行锁相倍频输出 PLL 时钟。用户可通过内置锁相环控制寄存器 SYSCTRL_PLL 的 SOURCE 位域选择 PLL 的输入参考时钟源,如下表所示

锁相环倍频系数通过内置锁相环控制寄存器 SYSCTRL_PLL 的 MUL 位域进行设置,可设置范围为 2 ~ 12,默认值 为 8。为保证锁相环的锁定收敛速度及输出时钟相噪性能,用户需根据实际的输入参考时钟频率和输出时钟频率分别设置 SYSCTRL_PLL.FREQIN 和 SYSCTRL_PLL.FREQOUT 位域的值。

 

 

 

PLL 默认处于关闭状态,通过设置系统控制寄存器 SYSCTRL_CR1 的 PLLEN 位域为 1 来启动。PLL 启动后,芯片 内部时钟监控模块检测到一定数量的 PLL 时钟信号,则认为 PLL 时钟已稳定。检测时钟数量可通过内置锁相环控制寄存器 SYSCTRL_PLL 的 WAITCYCLE 位域进行设置,通过内置锁相环控制寄存器 SYSCTRL_PLL 的 STABLE 标志位,可确定 PLL 时钟是否稳定,STABLE 标志为 1 表 示 PLL 时钟已稳定,为 0 则表示 PLL 时钟还未稳定。

修改 PLL 参数流程如下: 

步骤 1:设置 SYSCTRL_CR1.PLLEN 为 0,关闭 PLL; 

步骤 2:等待 SYSCTRL_PLL.STABLE 标志被系统硬件清零; 

步骤 3:更改 PLL 的参数; 

步骤 4:设置 SYSCTRL_CR1.PLLEN 为 1,启动 PLL; 

步骤 5:等待 SYSCTRL_PLL.STABLE 标志被系统硬件置 1,标识 PLL 时钟已稳定。

3.实例演示

通过按键KEY1中断调节运行主频(4M/12M/24M/48M/64M),LCD显示对应数字。

(1)初始化GPIO

void GPIO_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

__RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.IT = GPIO_IT_FALLING; //KEY1 -- PA04     

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pins = GPIO_PIN_4;

    GPIO_Init(CW_GPIOA, &GPIO_InitStruct);

    GPIO_ConfigFilter(CW_GPIOA, bv4, GPIO_FLTCLK_LSI);

}

(2)GPIO中断控制函数

void GPIOA_IRQHandlerCallback(void)

{

if(CW_GPIOA->ISR_f.PIN4)

    {

        GPIOA_INTFLAG_CLR(bv4);

        Key1Count++;

switch(Key1Count)

        {

            case 1:

                CW_LCD->RAM0 = 0x0603;//4

RCC_HSI_Enable(RCC_HSIOSC_DIV12);

RCC_SysClk_Switch(RCC_SYSCLKSRC_HSI); //切换系统时钟到HSI 4MHz

RCC_PLL_Disable(); //关闭PLL

                break;

            case 2:

                CW_LCD->RAM0 = 0x030e0005;//12

RCC_HSI_Enable(RCC_HSIOSC_DIV4);

                break;

            case 3:

                CW_LCD->RAM0 = 0x0603030e;//24

RCC_HSI_Enable(RCC_HSIOSC_DIV2);

                break;

            case 4:

                CW_LCD->RAM0 = 0x0f0f0603;//48

RCC_HSI_Enable(RCC_HSIOSC_DIV6);

RCC_SysClk_Switch(RCC_SYSCLKSRC_HSI); //切换系统时钟到HSI 8MHz

RCC_PLL_Disable(); //关闭PLL

FLASH_SetLatency(FLASH_Latency_2); 

//频率大于24M需要配置FlashWait=2

CW_SYSCTRL->AHBEN_f.FLASH = 0; //关闭FLASH时钟

RCC_HSI_Enable(RCC_HSIOSC_DIV1);

RCC_SysClk_Switch(RCC_SYSCLKSRC_HSI); //切换系统时钟到HSI 48MHz

                break;

            case 5:

                CW_LCD->RAM0 = 0x0603050f;//64

RCC_HSI_Enable(RCC_HSIOSC_DIV6);

RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, RCC_PLL_MUL_8); 

//开启PLL,PLL源为HSI 8MHz

                FLASH_SetLatency(FLASH_Latency_3); 

//频率大于48M需要配置FlashWait=3

CW_SYSCTRL->AHBEN_f.FLASH = 0; //关闭FLASH时钟

                RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL); //切换系统时钟到PLL

                break;

            case 6:

                CW_LCD->RAM0 = 0;

                CW_LCD->RAM1 = 0;

                CW_LCD->RAM8 = 0;

                CW_LCD->RAM9 = 0;

                Key1Count = 0;

                break;

        }

    }

}

(3)初始化LCD

void LCD_Configuration(void)

{

    LCD_InitTypeDef LCD_InitStruct = {0};

    LCD_InitStruct.LCD_Bias = LCD_Bias_1_3;

    LCD_InitStruct.LCD_ClockSource = LCD_CLOCK_SOURCE_LSI;

    LCD_InitStruct.LCD_Duty = LCD_Duty_1_4;

    LCD_InitStruct.LCD_ScanFreq = LCD_SCAN_FREQ_256HZ;

    LCD_InitStruct.LCD_VoltageSource = LCD_VoltageSource_Internal;

    __RCC_LCD_CLK_ENABLE();

    RCC_LSI_Enable(); //启动LSI为LCD提供时钟

LCD_Init(&LCD_InitStruct); //基本配置

LCD_COMConfig(LCD_COM0 | LCD_COM1 | LCD_COM2 | LCD_COM3, ENABLE); //SEG    

LCD_SEG0to23Config(LCD_SEG0 | LCD_SEG1 | LCD_SEG2 | LCD_SEG3 | LCD_SEG4 | LCD_SEG5 | LCD_SEG6 | LCD_SEG7, ENABLE);

LCD_SEG32to55Config(LCD_SEG32 | LCD_SEG33 | LCD_SEG34 | LCD_SEG35 | LCD_SEG36 | LCD_SEG37 | LCD_SEG38 | LCD_SEG39, ENABLE);

LCD_ContrastConfig(LCD_Contrast_Level_2); //显示对比度,仅内部电阻模式时有效

LCD_DriveVoltageConfig(LCD_INRS_LEVEL_0); //功耗最小

CW_LCD->RAM0 = 0x0f0f;

LCD_Cmd(ENABLE);

}

(4)配置嵌套的矢量中断控制器

void NVIC_Configuration(void)

{

    __disable_irq();

    NVIC_SetPriority(GPIOA_IRQn, 0);

    NVIC_EnableIRQ(GPIOA_IRQn);

    __enable_irq();

}        

(5)主函数

int32_t main(void)

{

RCC_HSI_Enable(RCC_HSIOSC_DIV6);    

GPIO_Configuration();

    LCD_Configuration();

    NVIC_Configuration();

    while(1){}

}  

4.测试结果

将电流表串接在单板J23跳线上,单板上电,默认主频为8MHz然后通过KEY1按键,控制主频在4 MHz -12 MHz -24 MHz -48 MHz -64 MHz之间进行切换,记录不同主频下的电流值,如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值