实时时钟的制作请参考上章文章(STM32F1单片机使用HAL库和LL库共同开发RTC实时时钟,解决待机模式24小时日期不变的问题)已经有讲解。
在”rtc.c“中的“MX_RTC_Init”函数的
/* USER CODE BEGIN RTC_Init 1 /和
/ USER CODE END RTC_Init 1 */之间,添加以下程序:如下图
/* USER CODE BEGIN RTC_Init 1 */
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_17;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
LL_EXTI_Init(&EXTI_InitStruct);
/* USER CODE END RTC_Init 1 */
想要设置闹钟就需要先了解闹钟寄存器与时间寄存器之间的关系:
时间:高:CNTH; 低:CNTL
闹钟:高:ALRH; 低:ALRL
当(ALRH+ALRL)中的数值等于(CNTH+CNTL)中的数值时,触发闹钟事件。
1、首先获取单片机RTC累加计数器的数值,先获取RTC计数寄存器高位CNTH的数值,强转为32位并向左偏移16位.,之后获取RTC计数寄存器低位CNTL的数值,并将其强转为32位,然后与高位相加,得到当前时间转化为秒钟数的个数。
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
// An highlighted block
temp111 = RTC->CNTH;
temp222 = ((uint32_t)temp111)<<16;
temp222 = temp222 + (uint32_t)RTC->CNTL;
2、计算出自己所要设闹钟距离现在还有多少秒,使用刚读取的RTC累加寄存器数值加上此秒数就是闹钟寄存器所要设置的数值。
// A code block
var foo = 'bar';
// 一分钟60秒,Inter_enum代表分钟数,紧接上文,此时的Inter_enum为分钟数,temp222现在为要在(ALRL和ALRH)寄存器写入的数值。
temp222 += Inter_enum*60;
3、向闹钟寄存器写入所需设置闹钟对应的秒数。
// A code block
var foo = 'bar';
// An highlighted block
//设置时钟
RCC->APB1ENR|=1<<28;//使能电源时钟
RCC->APB1ENR|=1<<27;//使能备份时钟
PWR->CR|=1<<8; //取消备份区写保护
//上面三步是必须的!
RTC->CRL|=1<<4; //允许配置
RTC->ALRL=temp222&0xffff;
RTC->ALRH=temp222>>16;
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
LL_RTC_EnableIT_ALR(RTC);
完成!