STM32/STM8技术william hill官网
直播中

123

6年用户 4经验值
擅长:控制/MCU
私信 关注
[问答]

Systick相关寄存器和库函数的疑惑

初学者,想请教一下各位,
1、Systick控制及状态寄存器中COUNTFALG的描述:如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清零。
而SysTick当前值寄存器中CURRENT的描述:写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。
COUNTFALG是在被读取为1后自动清零还是在CURRENT被清零后,COUNTFALG随之被清零的呢?还是两个情况下它都被清零了?


2、为什么下面这个程序段最后一行要清空计数器呢?计数器不应该经过该程序段后已经为0了吗?
void delay_us(u32 nus)
{               
        u32 temp;                    
        SysTick->LOAD=nus*fac_us;                                 //时间加载                         
        SysTick->VAL=0x00;                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数         
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
        SysTick->VAL =0X00;                                       //清空计数器
}


3、以及SysTick_Config(uint32_t ticks)函数中SysTick->LOAD  = ticks - 1;    初值设定为tick-1,为什么要减一呢?

STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */


  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* 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 */
  return (0);                                                  /* Function successful */
}




























  • N6K_[%0@(CY1~PI7FHB@O86.png
  • 9Z108AB,VASS$58W_4Z2R.png
已退回1积分

更多回帖

发帖
×
20
完善资料,
赚取积分