STM32
直播中

张超

7年用户 1301经验值
私信 关注
[问答]

STM8L101内部38K LSI校准不起作用吗?

STM8L101 内部38K LSI校准不起作用吗? 实测加不加LSIMeasurment(),定时1S ,抓出来的时间都一样。下面是官方代码稍加修改的。

INTERRUPT_HANDLER(AWU_IRQHandler,4)
{
  /* Clear AWU peripheral pending bit */
  AWU_GetFlagStatus();
  GPIO_ToggleBits(GPIOD, GPIO_Pin_0);//翻转
}


void main(void)
{

  /* Clock configuration -----------------------------------------*/
  CLK_Config();

  GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Slow);
  /*AWU configuration --------------------------------------------*/
  AWU_Config();

  /* Enable general interrupts */
  enableInterrupts();   

  while (1)
  {
      halt(); /* Program halted */
  }
}


static void AWU_Config(void)
{
  /* Initialization of AWU */
   /* LSI calibration for accurate auto wake up time base*/

  AWU_LSICalibrationConfig(LSIMeasurment());
//  AWU_LSICalibrationConfig(10000);

  /* The delay corresponds to the time we will stay in Halt mode */
  AWU_Init(AWU_Timebase_1s);
}

uint32_t LSIMeasurment(void)
{

  uint32_t lsi_freq_hz = 0x0;
  uint32_t fmaster = 0x0;
  uint16_t ICValue1 = 0x0;
  uint16_t ICValue2 = 0x0;

  /* Get master frequency */
  fmaster = CLK_GetClockFreq();

  /* Enable the LSI measurement: LSI clock connected to timer Input Capture 1 */
  AWU->CSR |= AWU_CSR_MSR;

  /* Capture only every 8 events!!! */
  TIM2_ICInit(  TIM2_Channel_1, TIM2_ICPolarity_Rising, TIM2_ICSelection_DirectTI, TIM2_ICPSC_Div8, 0x0);

  /* Enable TIM2 */
  TIM2_Cmd(ENABLE);

  /* wait a capture on cc1 */
  while ((TIM2->SR1   (uint8_t)TIM2_FLAG_CC1) != TIM2_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue1 = TIM2_GetCapture1();
  TIM2_ClearFlag(TIM2_FLAG_CC1);

  /* wait a capture on cc1 */
  while ((TIM2->SR1   (uint8_t)TIM2_FLAG_CC1) != TIM2_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue2 = TIM2_GetCapture1();
  TIM2_ClearFlag(TIM2_FLAG_CC1);

  /* Disable IC1 input capture */
  TIM2->CCER1  = (uint8_t)(~TIM_CCER1_CC1E);
  /* Disable TIM2 */
  TIM2_Cmd(DISABLE);

  /* Compute LSI clock frequency */
  lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);

  /* Disable the LSI measurement: LSI clock disconnected from timer Input Capture 1 */
  AWU->CSR  = (uint8_t)(~AWU_CSR_MSR);

  return (lsi_freq_hz);

}

回帖(1)

杨平

2024-5-8 17:43:48
从您提供的信息来看,您正在尝试校准STM8L101内部38K LSI(低速度内部时钟)。您提到使用LSIMeasurment()函数后,定时1秒的时间并没有发生变化。这可能是由于以下原因:

1. LSIMeasurment()函数的使用不正确:请确保您已经正确地初始化了时钟系统,并在调用LSIMeasurment()函数之前进行了必要的配置。

2. 中断服务例程(ISR)配置不正确:您提供的代码片段显示了一个AWU(自动唤醒定时器)中断服务例程。请确保您已经正确地配置了AWU中断,以便在定时器溢出时触发中断。

3. 定时器配置不正确:请检查您的定时器配置,确保它已经正确地设置为1秒的定时间隔。

4. 代码逻辑问题:请检查您的代码逻辑,确保在调用LSIMeasurment()函数后,您的定时器能够正确地更新计数值。

为了解决这个问题,您可以尝试以下步骤:

1. 确保您已经正确地初始化了时钟系统,包括内部时钟源(LSE或LSI)。

2. 检查您的AWU中断配置,确保它已经正确地设置为触发中断。

3. 检查您的定时器配置,确保它已经正确地设置为1秒的定时间隔。

4. 检查您的代码逻辑,确保在调用LSIMeasurment()函数后,您的定时器能够正确地更新计数值。

5. 如果问题仍然存在,请尝试使用STM8L Discovery或STM8L Evaluation Board上的示例代码,以便更好地理解如何正确地使用LSIMeasurment()函数。

希望这些建议能帮助您解决问题。如果您需要更详细的帮助,请提供更多关于您的项目和代码的信息。
举报

更多回帖

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