方法1:改变滴答时钟的计数重载值,实现。
/*******************************************************************************
** 函数名称: SysTick_Config_Test
** 功能描述:
** 参数说明: SystemCoreClocks: 当前系统运行的最大时钟,单位Hz
** Value: = 1000 滴答时钟1ms中断一次
** = 1000000 滴答时钟1us中断一次
** 返回说明: 返回0表示成功,否则失败
** 创建人员: Sudaroot
** 创建日期: 2019-08-26
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
uint32_t SysTick_Config_Test(uint32_t SystemCoreClocks, uint32_t Value)
{
return SysTick_Config(SystemCoreClocks / Value);
}
测试:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
//STM32F429配置最大时钟180MHz, 1us延时
SysTick_Config_Test(180000000, 1000000);
while (1)
{
printf("sudrootrn");
HAL_Delay(1000000);
}
}
效果:
方法2:就是累计滴答时钟的节拍数,当节拍数大于等于我们所需计数即完成;
SysTick reload value register (STK_LOAD) : 滴答时钟重载值(取值范围:0x00000001-0x00FFFFFF)
例如,如果每100个时钟脉冲需要SysTick中断,则置位重新载入99。
SysTick current value register (STK_VAL) :SysTick计数器的当前值。
还需注意滴答时钟是向下递减的。
#define SYS_CORE_CLOCK_MHZ 180 //当前系统运行的最大时钟,单位MHz
void delay_us(uint32_t us)
{
uint32_t ticks = us * SYS_CORE_CLOCK_MHZ;
uint32_t tickcount = 0, tnow = 0, told = SysTick->VAL;
do{
tnow = SysTick->VAL; //获取当前值。
tickcount += (told > tnow ? (told - tnow) : (SysTick->LOAD + told - tnow));
told = tnow;
}while(tickcount < ticks);
}
测试:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
printf("sudrootrn");
delay_us(1000000);
}
}
效果:
方法1:改变滴答时钟的计数重载值,实现。
/*******************************************************************************
** 函数名称: SysTick_Config_Test
** 功能描述:
** 参数说明: SystemCoreClocks: 当前系统运行的最大时钟,单位Hz
** Value: = 1000 滴答时钟1ms中断一次
** = 1000000 滴答时钟1us中断一次
** 返回说明: 返回0表示成功,否则失败
** 创建人员: Sudaroot
** 创建日期: 2019-08-26
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
uint32_t SysTick_Config_Test(uint32_t SystemCoreClocks, uint32_t Value)
{
return SysTick_Config(SystemCoreClocks / Value);
}
测试:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
//STM32F429配置最大时钟180MHz, 1us延时
SysTick_Config_Test(180000000, 1000000);
while (1)
{
printf("sudrootrn");
HAL_Delay(1000000);
}
}
效果:
方法2:就是累计滴答时钟的节拍数,当节拍数大于等于我们所需计数即完成;
SysTick reload value register (STK_LOAD) : 滴答时钟重载值(取值范围:0x00000001-0x00FFFFFF)
例如,如果每100个时钟脉冲需要SysTick中断,则置位重新载入99。
SysTick current value register (STK_VAL) :SysTick计数器的当前值。
还需注意滴答时钟是向下递减的。
#define SYS_CORE_CLOCK_MHZ 180 //当前系统运行的最大时钟,单位MHz
void delay_us(uint32_t us)
{
uint32_t ticks = us * SYS_CORE_CLOCK_MHZ;
uint32_t tickcount = 0, tnow = 0, told = SysTick->VAL;
do{
tnow = SysTick->VAL; //获取当前值。
tickcount += (told > tnow ? (told - tnow) : (SysTick->LOAD + told - tnow));
told = tnow;
}while(tickcount < ticks);
}
测试:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
printf("sudrootrn");
delay_us(1000000);
}
}
效果:
举报