|
【liklon玩GD32F350】三、SYSTICK实现简单的延时
[复制链接]
在使用过程中需要用到一点延时,HAL库中会有HAL_Delay可以使用,但是目前使用的是GD的标准库,还是需要利用systick来实现一个简单的延时函数用一下。
一、Systick 滴答定时器
使用过M3 M4的童鞋们对这个应该不陌生,就不再进行描述。
在GD32F3X0_MISC文件中有一个函数是配置systick时钟源的:
- /*!
- \brief set the systick clock source
- \param[in] systick_clksource: the systick clock source needed to choose
- \arg SYSTICK_CLKSOURCE_HCLK: systick clock source is from HCLK
- \arg SYSTICK_CLKSOURCE_HCLK_DIV8: systick clock source is from HCLK/8
- \param[out] none
- \retval none
- */
- void systick_clksource_set(uint32_t systick_clksource)
- {
- if(SYSTICK_CLKSOURCE_HCLK == systick_clksource ){
- /* set the systick clock source from HCLK */
- SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
- }else{
- /* set the systick clock source from HCLK/8 */
- SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8;
- }
- }
复制代码
在gd的手册中没有systick寄存器的介绍,截取一份M4权威手册里面的图片
二、延时函数以及验证
- #define DELAY_US_FACTOR 108
- void delay_init()
- {
- systick_clksource_set(SYSTICK_CLKSOURCE_HCLK);
- }
- //xus < 155344
- void delay_xus(uint32_t xus)
- {
- uint32_t xtick = xus * DELAY_US_FACTOR;
- if(xus > 155000)
- {
- return;
- }
- SysTick->LOAD = xtick - 1;
- SysTick->VAL = 0;
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
- while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0x0);
- }
- //xms < 155
- void delay_xms(uint32_t xms)
- {
- uint32_t xtick = xms * DELAY_US_FACTOR * 1000;
- if(xms > 155)
- {
- return;
- }
- SysTick->LOAD = xtick - 1;
- SysTick->VAL = 0;
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
- while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0x0);
- }
复制代码
在while循环里面验证500ms打印一次hello world:
- while(1)
- {
- delay_xms(100);
- delay_xms(100);
- delay_xms(100);
- delay_xms(100);
- delay_xms(100);
- uart1_write((uint8_t *)"hello world\n\r", 13);
- }
复制代码
看时间戳应该是成功的。
|
|