从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:请教用STM8L151的RTC唤醒
RE:请教用STM8L151的RTC唤醒
注意:每次看门狗复位都要被重新配置启动
<div class="dp-highlighter bg_cpp">//检查是否正常状态发生看门狗复位
<ol class="dp-cpp"> if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
<li class="alt">{ //清楚标志位
<li class="alt"> RCC_ClearFlag();
<li class="alt"> //RTC功能开启 //使能外部晶振
<li class="alt"> RCC_LSEConfig(RCC_LSE_ON); //等待外部晶振准备好
<li class="alt"> while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
<li class="alt"> //设置RTC时钟为外部晶振 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
<li class="alt"> //使能RTC时钟
<li class="alt"> RCC_RTCCLKCmd(ENABLE); //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
<li class="alt"> RTC_WaitForSynchro(); RTC_WaitForLastTask();
<li class="alt"> //使能闹钟中断
<li class="alt"> RTC_ITConfig(RTC_IT_ALR, ENABLE); RTC_WaitForLastTask();
<li class="alt"> //分频系数为1,即最小时间单位1/2^15 = 30.5us
<li class="alt"> RTC_SetPrescaler(RTC_PRESCALE); RTC_WaitForLastTask();
<li class="alt"> //启动独立看门狗
<li class="alt"> IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //访问之前要首先使能寄存器写 IWDG_SetPrescaler(IWDG_Prescaler_64); //64分频 一个周期1.6ms
<li class="alt"> IWDG_SetReload(1250); //最长12位 [0,4096] 1250*1.6 = 2s IWDG_ReloadCounter(); //喂狗
<li class="alt"> //使能开门狗 IWDG_Enable();
<li class="alt"> if (BKP_ReadBackupRegister(BKP_DR5) == 0xabcd)
<li class="alt"> { GPIO_SetBits(GPIOA,GPIO_Pin_12) ;
<li class="alt"> BKP_WriteBackupRegister(BKP_DR5,0); }
<li class="alt"> else {
<li class="alt"> GPIO_ResetBits(GPIOA, GPIO_Pin_12) ; BKP_WriteBackupRegister(BKP_DR5,0xabcd);
<li class="alt"> } }
<li class="alt">else {
<li class="alt"> //检查唤醒标志是否设置,判断是否首次启动 if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)
<li class="alt"> { //首次启动
<li class="alt"> //初始化备份寄存器 //BKP_DeInit();
<li class="alt"> //RTC功能开启
<li class="alt"> //使能外部晶振 RCC_LSEConfig(RCC_LSE_ON);
<li class="alt"> //等待外部晶振准备好 while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
<li class="alt"> //设置RTC时钟为外部晶振
<li class="alt"> RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
<li class="alt"> //使能RTC时钟 RCC_RTCCLKCmd(ENABLE);
<li class="alt"> //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1 RTC_WaitForSynchro();
<li class="alt"> RTC_WaitForLastTask();
<li class="alt"> //使能闹钟中断 RTC_ITConfig(RTC_IT_ALR, ENABLE);
<li class="alt"> RTC_WaitForLastTask();
<li class="alt"> //分频系数为1,即最小时间单位1/2^15 = 30.5us RTC_SetPrescaler(RTC_PRESCALE);
<li class="alt"> RTC_WaitForLastTask();
<li class="alt"> //启动独立看门狗 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //访问之前要首先使能寄存器写
<li class="alt"> IWDG_SetPrescaler(IWDG_Prescaler_64); //64分频 一个周期1.6ms IWDG_SetReload(1250); //最长12位 [0,4096] 1250*1.6 = 2s
<li class="alt"> IWDG_ReloadCounter(); //喂狗 //使能开门狗
<li class="alt"> IWDG_Enable();
<li class="alt"> if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd) {
<li class="alt"> GPIO_ResetBits(GPIOA, GPIO_Pin_11) ; BKP_WriteBackupRegister(BKP_DR6,0);
<li class="alt"> } else
<li class="alt"> { GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
<li class="alt"> BKP_WriteBackupRegister(BKP_DR6,0xabcd); }
<li class="alt"> } else
<li class="alt"> { //从待机模式中退出,有闹钟唤醒或者看门狗唤醒
<li class="alt"> //清除唤醒标志 RCC_ClearFlag();
<li class="alt"> if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)
<li class="alt"> { GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;
<li class="alt"> BKP_WriteBackupRegister(BKP_DR7,0); }
<li class="alt"> else {
<li class="alt"> GPIO_SetBits(GPIOA,GPIO_Pin_8) ; BKP_WriteBackupRegister(BKP_DR7,0xabcd);
<li class="alt"> } }
<li class="alt">}
<li class="alt">//延时1s for (i = 0;i
RE:请教用STM8L151的RTC唤醒
RTC.txt
2012-7-2 16:00 上传
点击文件名下载附件
1.76 KB, 下载次数: 812
RE:请教用STM8L151的RTC唤醒
RE:请教用STM8L151的RTC唤醒
回复:请教用STM8L151的RTC唤醒
STM8L-Discovery的板上RTC的代码
ok
回复:请教用STM8L151的RTC唤醒
RE:请教用STM8L151的RTC唤醒
回复:请教用STM8L151的RTC唤醒