优化后完整代码
c
复制
编辑
#include "hc32f10x.h"
void SysTick_DelayMs(uint32_t ms);
void RCC_Configuration(void);
void GPIO_Configuration(void);
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
while (1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET); // 低电平点亮
SysTick_DelayMs(1500); // 延时 1500ms
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET); // 高电平熄灭
SysTick_DelayMs(1500); // 延时 1500ms
}
}
void SysTick_DelayMs(uint32_t ms)
{
SysTick->LOAD = SystemCoreClock / 1000 - 1; // 1ms
SysTick->VAL = 0; // 清空计数器
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while (ms--) {
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数结束
}
SysTick->CTRL = 0; // 关闭 SysTick
}
void RCC_Configuration(void)
{
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET); // 默认关闭 LED
}
优化后的改进点
✅ 使用 SysTick 定时器进行精准延时,避免 for 循环误差
✅ RCC 配置改进,确保系统时钟正确初始化
✅ GPIO 初始化时默认设定高电平,防止 LED 乱闪
✅ 减少不必要的 AFIO 时钟启用,优化功耗
结论
这样优化后,代码运行更加稳定、功耗更低、时钟管理更精准,适合在 HC32F10x 上高效运行!
|