这篇来学习下CW32L052芯片是sysclk时钟的配置和使用。
一、时钟框图
芯片能工作的最大时钟是48MHz,这里使用内部48MHz的HSI时钟来配置sysclk。
二、程序部分
2.1、时钟配置
时钟这部分配置有点奇怪,直接配置使能48MHz的HSI,程序不启动,时钟切换到HSE或LSI,再且回到HSI,可以正常启动运行。
void rcc_config(void)
{
uint8_t res = 0U;
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE);
RCC_LSI_Enable( ); //开启外部高速时钟LSI
res = RCC_SysClk_Switch( RCC_SYSCLKSRC_LSI ); //切换系统时钟到LSI
if( res == 0x00 ) //系统时钟切换成功
{
RCC_HSI_Disable(); //切换时钟到PLL后关闭源时钟HSI
FirmwareDelay( 400 ); //about 100mS
}
RCC_HSI_Enable( RCC_HSIOSC_DIV1 ); //开启内部高速时钟HSI = HSIOSC / 2
FLASH_SetLatency(FLASH_Latency_3);
res = RCC_SysClk_Switch( RCC_SYSCLKSRC_HSI ); //切换系统时钟到HSI
if( res == 0x00 ) //系统时钟切换成功
{
RCC_LSI_Disable(); //切换时钟到HSI后关闭LSI时钟
FirmwareDelay( 275000 ); //about 100mS
}
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_HCLK_OUT(); //通过PA04观察HCLK频率
}
2.2、主程序
配置sysclk的时钟为48M
InitTick( 48000000 ); //初始化SysTick
int32_t main(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
rcc_config();
init_uart();
InitTick( 48000000 ); //初始化SysTick
__RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = LED_GPIO_PINS;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
while (1)
{
GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PINS);
// Delay(0xFFFF);
SysTickDelay(100);
}
}
三、程序运行
示波器测试LED2端口PC10,波形如下
延时100ms,测试延时时间是102ms,使用内部时钟有一定的偏差。
引用: 火辣西米秀 发表于 2023-7-19 23:05 sysclk延时是编程的基本功,好好测试,主要还是配置
是呀,操作系统的心跳
引用: freebsder 发表于 2023-7-26 19:15 用的官方生成的代码吗?
嗯,库是官方的