STM8中 TIME4寄存器的应用

STM8系统复位后,所有外设时钟均处于开的状态。用户可以通过清除CLK_PCKENR1或
CLK_PCKENR2中的PCKEN位来关闭相应的外设是时钟。


时钟分频寄存器 (CLK_CKDIVR)


如果一个引脚只具有电平的输出能力,称该引脚为输出引脚或驱动引脚;
如果一个引脚具有电平的输入能力,则称该引脚为输入引脚。
同时具备输入和输出能力的引脚称为通用引脚。


引脚输出高电平时形成的电流称为拉电流;
引脚输出低电平时形成的电流称为灌电流;


基本型定时器(TIM4/TIM6)

TIME4可以作为时基发生器
@inline static void tick_init(void)
{
    TIM4->PSCR = TIM4_PRESCALER_128;//07 预分频寄存器
    TIM4->ARR = (u8) ((SYS_CLK / 128) / HZ - 1);// 自动重载寄存器
    TIM4->IER |= TIM4_IT_UPDATE;//01 使能寄存器   更新中断使能
    TIM4->CR1 |= TIM4_CR1_CEN;  //01 控制寄存器1
}
3位可编程的预分配器提供1、2、4、8 、16 、32 、64和128这8种分频比例。
该定时器由一个带可编程的预分频器和8位可自动重载的向上计数器构成,具有溢出中断功能。


该定时器的时钟是内部时钟。


预分频是由一个3位寄存器(在TIMX_PSCR寄存器中)来控制的一个7位的计数器。
  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32的RTC校准代码示例,使用了备份寄存器: ```c #include "stm32f4xx.h" #define RTC_BKP_DR0 ((uint32_t)0x0000AABB) void RTC_Config(void); ErrorStatus RTC_LSE_Configuration(void); void RTC_TimeRegulate(uint32_t TimeVar); void RTC_CalibOutputCmd(FunctionalState NewState); void RTC_EnterConfigMode(void); void RTC_ExitConfigMode(void); int main(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_Config(); // 从备份寄存器读取校准值 uint32_t bkp_value = RTC_ReadBackupRegister(RTC_BKP_DR0); if (bkp_value != 0xFFFFFFFF) { RTC_EnterConfigMode(); RTC_SetCalibrationValue(bkp_value); RTC_ExitConfigMode(); } // 获取当前时间 RTC_TimeTypeDef RTC_TimeStructure; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); // 校准RTC RTC_TimeRegulate(RTC_TimeStructure.Time + 10); // 假设误差为10秒 // 将校准值写入备份寄存器 RTC_EnterConfigMode(); RTC_WriteBackupRegister(RTC_BKP_DR0, RTC_GetCalibrationValue()); RTC_ExitConfigMode(); while(1); } void RTC_Config(void) { RTC_InitTypeDef RTC_InitStructure; RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; if (RTC_LSE_Configuration() != SUCCESS) { // LSE 启动失败 while(1); } RTC_InitStructure.RTC_AsynchPrediv = 127; RTC_InitStructure.RTC_SynchPrediv = 255; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_Init(&RTC_InitStructure); RTC_TimeStructure.RTC_Hours = 0x00; RTC_TimeStructure.RTC_Minutes = 0x00; RTC_TimeStructure.RTC_Seconds = 0x00; RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure); RTC_DateStructure.RTC_Year = 0x00; RTC_DateStructure.RTC_Month = RTC_Month_January; RTC_DateStructure.RTC_Date = 0x01; RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Monday; RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure); // 校准输出禁止 RTC_CalibOutputCmd(DISABLE); } ErrorStatus RTC_LSE_Configuration(void) { RCC_OscInitTypeDef RCC_OscInitStruct; // 配置LSE RCC_OscInitStruct.RCC_LSE = RCC_LSE_ON; RCC_OscInitStruct.RCC_LSEDrive = RCC_LSEDrive_Low; RCC_OscInitStruct.RCC_OscillatorType = RCC_OscillatorType_LSE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { return ERROR; } // 配置RTC时钟源 RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct; RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PeriphCLK_RTC; RCC_PeriphCLKInitStruct.RTCClockSelection = RCC_RTCCLKSource_LSE; if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK) { return ERROR; } return SUCCESS; } void RTC_TimeRegulate(uint32_t TimeVar) { int8_t correction = 0; // 进入RTC配置模式 RTC_EnterConfigMode(); uint32_t calib_value = RTC_GetCalibrationValue(); if (calib_value == 0xFFFFFFFF) { // 如果校准值未被设置,则默认为0 correction = -128; } else { correction = (int8_t)(calib_value & 0xFF); } // 计算新的校准值 correction += (int8_t)((TimeVar - RTC_GetCounter()) / 60); if (correction > 127) { correction = 127; } else if (correction < -128) { correction = -128; } // 设置新的校准值 RTC_SetCalibrationValue(correction); // 退出RTC配置模式 RTC_ExitConfigMode(); } void RTC_EnterConfigMode(void) { RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, DISABLE); RTC_WaitForLastTask(); RTC_EnterConfigMode(); } void RTC_ExitConfigMode(void) { RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_ExitConfigMode(); } ``` 在上面的示例代码,我们使用了备份寄存器 RTC\_BKP\_DR0 来存储校准值。在程序启动时,我们从备份寄存器读取校准值,如果备份寄存器存在值,则将其设置为 RTC 的校准值。校准完成后,我们将新的校准值写入备份寄存器,以便下一次启动时使用。 注意:以上代码仅供参考,实际应用需要根据具体的应用场景进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值