2.SYSTICK及系统时钟移植
- 系统时钟移植
由于STM32F429使用的时钟主频为180MHZ,而小华的主频为240MHZ,所以需要进行修改
- 在工程中加入库文件ev_hc32f4a0_lqfp176.c,hc32_ll_clk.c,并包含头文件
- 删除自己不需要的函数,仅保留__WEAKDEF void BSP_CLK_Init(void)函数
- 修改时钟配置参数,由于我使用的是25M晶振,先修改XTAL_VALUE的参数为 25000000UL,然后配置如下
/* VCO = (25/1)*48 = 1200MHz*/
stcPLLHInit.u8PLLState = CLK_PLL_ON;
stcPLLHInit.PLLCFGR = 0UL;
stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLN = 48UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLP = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLQ = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLR = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
(void)CLK_PLLInit(&stcPLLHInit);
- SYSTICK移植
在官方例程中,发现官方用的是软件延时,根本没有用上SYSTICK定时器,所以这里需要移植一下STM32的延时函数
- 新增delay.c和delay.h文件
- 新增DELAY_Init函数
void DELAY_Init(void)
{
SysTick->LOAD = (uint32_t)(SystemCoreClock/1000); /* set reload register 1KHz */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
}
2.新增两个延时函数
//us延时
void delay_us(uint32_t u32Cnt)
{
uint32_t ticks;
uint32_t told,tnow,tcnt=0;
uint32_t reload=SysTick->LOAD;
ticks=u32Cnt*(SystemCoreClock/1000000);
told=SysTick->VAL;
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow;
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break;
}
}
}
//ms延时
void delay_ms(uint32_t u32Cnt)
{
u32 i;
for(i=0;i<nms;i++) delay_us(1000);
}
4.在main.c中初始化DELAY_Init(),即可使用以上两个延时函数

浙公网安备 33010602011771号