本帖最后由 tlled 于 2022-7-2 09:08 编辑
下面通过例程来学习下时钟电路部分,使用外部16M晶振PLL输出48M内部时钟。
一、手册资料
1.1、有关RCC部分手册资料
可以产生sysclk时钟有下面5种方式选择。
1.2、使用HSE时钟PLL 产生48M时钟可以使用HSI和HSE时钟源,这里我选择使用外部的16M时钟源。
二、测试代码
参考固件库有关RCC的例程代码。
2.1、测试HCLK时钟
void rcc_config(void)
{
uint8_t res = 0U;
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE); //打开FLASH时钟
RCC_HCLK_OUT(); //通过PA04观察HCLK频率
RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE ); //开启外部高速时钟HSE,实际频率需要根据实际晶体频率进行填写
RCC_PLL_Enable( RCC_PLLSOURCE_HSEOSC, 16000000, RCC_PLL_MUL_3 ); //开启PLL,PLL时钟来源为HSE
FLASH_SetLatency(FLASH_Latency_2); //频率大于24M需要配置FlashWait=2
res = RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL ); //切换系统时钟到PLL
if( res == 0x0U ) //切换系统时钟成功
{
RCC_HSI_Disable(); //切换时钟到PLL后关闭源时钟HSI
}
}
使用PA04输出HCLK时钟,测试输出的时钟波形:
2.2、LED灯输出测试
通过IO口来验证HCLK的正确否。
2.2.1、systick时钟配置
从手册上看,sysclk是直接连接到HCLK时钟总线上
2.2.2、systick配置代码
#include "delay.h"
#include "cw32f030.h"
static u8 fac_us=0;
static u16 fac_ms=0;
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
void delay_init(void)
{
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
//SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
fac_us=SystemCoreClock/1000000;
fac_ms=(u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us;
SysTick->VAL=0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
2.3、主测试程序
2.3.1、测试硬件电路
使用开发板上的LED1指示灯来输出。使用的端口是PB9
2.3.2、测试住代码
在主程序中使用100ms的systick延时,来翻转PB9输出状态
int32_t main(void)
{
rcc_config();
delay_init();
init_led();
while (1)
{
led1_tog();
delay_ms(100);
}
}
2.3.3、PB9输出波形
输出100ms正常,上面就是测试使用HSE产生48M过程。
|