当前位置: 首页 > news >正文

大连城市建设网站广东品牌网站建设服务机构

大连城市建设网站,广东品牌网站建设服务机构,做网站到底怎么赚钱,南通网站建设哪家好目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1#xff1a;显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2#xff1a;闹钟 常规配置 RTC配置 测试环节 实验现象 R…目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2闹钟 常规配置 RTC配置 测试环节 实验现象 RTC实时时钟 STM32的RTC外设实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设可以计时和触发中断。 掉电指的是电源VDD断开时为了RTC外设掉电继续运行必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有效时由VDD给RTC外设供电当CDD掉电后由Vbat给RTC外设供电。但无论由什么电源供电RTC的数据都保存在属于RTC的备份域中若主电源VDD和Vbat都掉电则备份域保存的所有数据将丢失。备份域除了RTC模块的寄存器还有42个16位的寄存器可以在VDD掉电时保存用户程序的数据系统复位或电源复位时数据也不会清空。 从RTC的定时器特性来说是一个32位的递增计数器。时钟源有三种HSE/128、LSI和LSE。 使用LSI或HSE/8时钟源在主电源VDD掉电时这两个时钟来源都会受到影响因此无法保证RTC正常工作。因此RTC一般使用LSE。在设计中频率通常为32.768kHz。 在主电源VDD有效并处于待机模式时RTC还可以配置闹钟事件时STM32退出待机模式。 功能框图 浅灰色部分属于备份域VDD掉电时可在Vbat的驱动下继续运行。包括了RTC分频器、计数器、闹钟控制器。 若VDD电源有效RTC可以触发RTC_Second秒中断、RTC_Overflow溢出事件和RTC_Alarm闹钟中断。从结构图可以分析出定时器溢出中断无法被配置为中断。 若STM32处于待机模式可由闹钟事件或WKUP事件外部唤醒事件属于EXTI模块不属于RTC退出待机模式。 闹钟事件在计数器RTC_CNT的值等于闹钟寄存器RTC_ALR的值时触发。 在备份域中所有寄存器都是16位的RTC控制相关的寄存器也不例外。它的计数器RTC_CNT的32位由RTC_CNTL和RTC_CNTH这两个寄存器组成。 在配置RTC模块的时钟时通常把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK  RTCCLK / 32768 1Hz计数周期为1s计数器在TR_CLK的驱动下计数即每秒计数器RTC_CNT的值1。 由于备份域的存在使得RTC核具有了完全独立于APB1接口的特性也因此对RTC寄存器的访问要遵守一定的规则。 系统复位后默认禁止访问后备寄存器和RTC防止对后备区域BKP的意外写操作。执行以下操作使能对后备寄存器和RTC的访问         设置RCC_APB1ENRPWREN、BKPEN位来使能电源和后备接口时钟。         设置PWR_CRDBP位使能对后备寄存器和RTC的访问。 设置后备寄存器为可写访问后在第一次通过APB1接口访问RTC时因为时钟频率的差异所以必须等待APB1和RTC外设同步确保被读取出来的RTC寄存器值是正确的。若在同步后一直没有关闭APB1的RTC外设接口就不需要再次同步了。 如果内核要对RTC寄存器进行任何写操作在内核写出写指令后RTC模块在3个RTCCLK时钟后才开始正式的写RTC寄存器操作。由于RTCCLK的频率比内核主频低得多所以每次操作后都必须检查RTC关闭操作标志位RTOFF当这个标志位被置1写操作才正式完成。 当然以上操作都具有对应的库函数不需要具体的查阅寄存器。  UNIX时间戳 RTC_CNT是32位寄存器可存储的最大值为2^32-1即约等于136年。 如某个时刻读取计数器的值为2天的秒数以2011.1.1 0:0:0时间置0计数器的则可以算出是2011.1.3 0:0:0时间计数器会在2011136年左右溢出。定时器被置0的时间为计数元年相对计时元年的秒数为时间戳计数器的值。 大多数操作系统都是利用时间戳和计时元年来计算当前时间的有个标准UNIX时间戳和UNIX计时元年。 UNIX计时元年被设置为格林威治时间1970.1.1 0:0:0时间。 在这个计时系统上使用的是有符号的32位整形变量来保存UNIX时间戳因此最高位表示符号时间戳能显示的范围更小了会在2038.1.19 3:14:07时间溢出。 网页上可搜UNIX时间戳。可实时查看。 初始化结构体 STM32 HAL库对RTC控制提供了完善的函数。 typedef struct {uint32_t AsynchPrediv; /* 配置RTC_CLK的异步分频因子0x00~0x7F ) 具体由RTC_PRERPREDIV_A[6:0]配置 */uint32_t OutPut; /* RTCEx输出通道设置指定哪一路信号作为RTC的输出禁止输出/闹钟A输出/闹钟B输出/唤醒输出 */} RTC_InitTypeDef; RTC时间结构体 用来设置初始时间配置的是RTC时间寄存器RTC_TR。 typedef struct {uint8_t Hours; /* 小时设置。12小时制式时0~1124小时制式时0~23 */uint8_t Minutes; /* 分钟设置0~59 */uint8_t Seconds; /* 秒设置0~59 */} RTC_TimeTypeDef; RTC日期结构体 用来设置初始日期配置的是RTC日期寄存器RTC_DR。 typedef struct {uint8_t WeekDay; /* 星期几设置1~7 */uint8_t Month; /* 月份设置1~12 */uint8_t Date; /* 日期设置1~31 */uint8_t Year; /* 年份设置0~99 */} RTC_DateTypeDef; RTC闹钟结构体 用来设置闹钟时间设置的格式为[星期/日期]-[时]-[分]-[秒]4个字段每个字段可以设置为有效或无效MASK。如果MASK掉[星期/日期]字段则每天闹钟都会响。 typedef struct {RTC_TimeTypeDef AlarmTime; /* 设定RTC时间寄存器的值时/分/秒 */uint32_t Alarm; /* RTC 闹钟选择闹钟A、闹钟B */} RTC_AlarmTypeDef; 进入和退出配置函数 /*** brief 进入 RTC 配置模式 .* param None* retval None*/void RTC_EnterConfigMode(void){/* 设置 CNF 位进入配置模式 */RTC-CRL | RTC_CRL_CNF;}/** brief 退出 RTC 配置模式 .* param None* retval None*/void RTC_ExitConfigMode(void){/* 清空 CNF 位退出配置模式 */RTC-CRL (uint16_t)~((uint16_t)RTC_CRL_CNF);} 实验环节1显示日历 常规配置 USART1带中断支持printf输出。 RTC配置 RTC_HandleTypeDef hrtc;/* RTC init function */ void MX_RTC_Init(void) {RTC_TimeTypeDef sTime {0};RTC_DateTypeDef DateToUpdate {0};/* USER CODE BEGIN RTC_Init 1 *//* 判断是否首次上电 */if (HAL_RTCEx_BKUPRead(hrtc, RTC_BKP_DR1) ! 0x5050){HAL_RTCEx_BKUPWrite(hrtc, RTC_BKP_DR1, 0x5050); // 插入BKP数值判断/* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance RTC;hrtc.Init.AsynchPrediv RTC_AUTO_1_SECOND;hrtc.Init.OutPut RTC_OUTPUTSOURCE_NONE;if (HAL_RTC_Init(hrtc) ! HAL_OK){Error_Handler();}/** Initialize RTC and set the Time and Date*/sTime.Hours 0x0;sTime.Minutes 0x0;sTime.Seconds 0x0;if (HAL_RTC_SetTime(hrtc, sTime, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}DateToUpdate.WeekDay RTC_WEEKDAY_MONDAY;DateToUpdate.Month RTC_MONTH_JANUARY;DateToUpdate.Date 0x1;DateToUpdate.Year 0x0;if (HAL_RTC_SetDate(hrtc, DateToUpdate, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 */}/* USER CODE END RTC_Init 2 */ }void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle) {if (rtcHandle-Instance RTC){HAL_PWR_EnableBkUpAccess(); // 取消BKP区域写保护才能进行时间保存和计时/* Enable BKP CLK enable for backup registers */__HAL_RCC_BKP_CLK_ENABLE(); // 开启BKP时钟/* RTC clock enable */__HAL_RCC_RTC_ENABLE();} }void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle) {if (rtcHandle-Instance RTC){__HAL_RCC_RTC_DISABLE();} } 测试环节 #include string.huint8_t RxBuffer[20];void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if(huart huart1){} }void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart huart1){// A5 5A 00 01 01 00 00 00if(RxBuffer[0]0xA5 RxBuffer[1]0x5A){RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;RtcTime.Hours RxBuffer[5];RtcTime.Minutes RxBuffer[6];RtcTime.Seconds RxBuffer[7];if (HAL_RTC_SetTime(hrtc, RtcTime, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}// 星期内部自动校正RtcDate.WeekDay RTC_WEEKDAY_MONDAY;RtcDate.Month RxBuffer[3];RtcDate.Date RxBuffer[4];RtcDate.Year RxBuffer[2];if (HAL_RTC_SetDate(hrtc, RtcDate, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}memset(RxBuffer, 0, sizeof(RxBuffer));HAL_UART_Receive_IT(huart1, (uint8_t *)RxBuffer, 8);}} }void test(void) {RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;HAL_UART_Receive_IT(huart1, (uint8_t *)RxBuffer, 8);while(1){HAL_RTC_GetTime(hrtc, RtcTime, RTC_FORMAT_BIN); // 读出时间值HAL_RTC_GetDate(hrtc, RtcDate, RTC_FORMAT_BIN); // 一定要先读时间后读日期这样才能校正星期参数printf(实时时间%04d-%02d-%02d %02d:%02d:%02d 星期%2d\r\n, 2000RtcDate.Year, RtcDate.Month, RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间HAL_Delay(1000);} } 实验现象 实验环节2闹钟 常规配置 USART1带中断支持printf输出。 蜂鸣器配置。 RTC配置 RTC_HandleTypeDef hrtc;void MX_RTC_Init(void) {RTC_TimeTypeDef sTime {0};RTC_DateTypeDef DateToUpdate {0};RTC_AlarmTypeDef sAlarm {0};/* USER CODE BEGIN RTC_Init 1 *//* 判断是否首次上电 */if (HAL_RTCEx_BKUPRead(hrtc, RTC_BKP_DR1) ! 0x5050){HAL_RTCEx_BKUPWrite(hrtc, RTC_BKP_DR1, 0x5050); // 插入BKP数值判断/* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance RTC;hrtc.Init.AsynchPrediv RTC_AUTO_1_SECOND;hrtc.Init.OutPut RTC_OUTPUTSOURCE_ALARM;if (HAL_RTC_Init(hrtc) ! HAL_OK){Error_Handler();}/** Initialize RTC and set the Time and Date*/sTime.Hours 0x0;sTime.Minutes 0x0;sTime.Seconds 0x0;if (HAL_RTC_SetTime(hrtc, sTime, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}DateToUpdate.WeekDay RTC_WEEKDAY_MONDAY;DateToUpdate.Month RTC_MONTH_JANUARY;DateToUpdate.Date 0x1;DateToUpdate.Year 0x0;if (HAL_RTC_SetDate(hrtc, DateToUpdate, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}/** Enable the Alarm A*/sAlarm.AlarmTime.Hours 0x0;sAlarm.AlarmTime.Minutes 0x1;sAlarm.AlarmTime.Seconds 0x0;sAlarm.Alarm RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(hrtc, sAlarm, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 */}/* USER CODE END RTC_Init 2 */ }void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle) {if (rtcHandle-Instance RTC){HAL_PWR_EnableBkUpAccess();/* Enable BKP CLK enable for backup registers */__HAL_RCC_BKP_CLK_ENABLE();/* RTC clock enable */__HAL_RCC_RTC_ENABLE();/* RTC interrupt Init */HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);} }void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle) {if (rtcHandle-Instance RTC){__HAL_RCC_RTC_DISABLE();/* RTC interrupt Deinit */HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);} } 测试环节 #include string.huint8_t RxBuffer[20];void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if(huart huart1){} }void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart huart1){// A5 5A 00 01 01 00 00 00if(RxBuffer[0]0xA5 RxBuffer[1]0x5A){RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;RTC_AlarmTypeDef RtcAlarm;RtcTime.Hours RxBuffer[5];RtcTime.Minutes RxBuffer[6];RtcTime.Seconds RxBuffer[7];if (HAL_RTC_SetTime(hrtc, RtcTime, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}// 星期内部自动校正RtcDate.WeekDay RTC_WEEKDAY_MONDAY;RtcDate.Month RxBuffer[3];RtcDate.Date RxBuffer[4];RtcDate.Year RxBuffer[2];if (HAL_RTC_SetDate(hrtc, RtcDate, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}RtcAlarm.AlarmTime.Hours RxBuffer[5];RtcAlarm.AlarmTime.Minutes RxBuffer[6];RtcAlarm.AlarmTime.Seconds RxBuffer[7] 0x10;RtcAlarm.Alarm RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(hrtc, RtcAlarm, RTC_FORMAT_BCD) ! HAL_OK){Error_Handler();}memset(RxBuffer, 0, sizeof(RxBuffer));HAL_UART_Receive_IT(huart1, (uint8_t *)RxBuffer, 8);}} }void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin); }void test(void) {RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;初始化HAL_UART_Receive_IT(huart1, (uint8_t *)RxBuffer, 8);while(1){HAL_RTC_GetTime(hrtc, RtcTime, RTC_FORMAT_BIN); // 读出时间值HAL_RTC_GetDate(hrtc, RtcDate, RTC_FORMAT_BIN); // 一定要先读时间后读日期这样才能校正星期参数printf(实时时间%04d-%02d-%02d %02d:%02d:%02d 星期%2d\r\n, 2000RtcDate.Year, RtcDate.Month, RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间HAL_Delay(1000);} } 实验现象 上电运行LED默认灭。一分钟后LED亮绿灯。 通过串口调试助手发送A55A23110100000010秒后LED灭。
http://www.hkea.cn/news/14533704/

相关文章:

  • 软工毕设做网站风云榜百度
  • 企业营销网站制作北京商场关闭通知
  • 如何利用网站开发客户工商登记信息查询平台
  • 上蔡网站建设什么网站免费做简历模板
  • 海口小学网站建设为什么做电影网站没有流量
  • 有了页游源代码如何做网站做面包有哪些网站知乎
  • 一个虚拟主机绑定2个网站专业营销网站开发
  • 网站开发概要设计模板注册营业执照名字查询系统
  • 网站说服力营销型网站策划公司宣传片如何制作
  • 马达加工东莞网站建设网站建设公司怎么开拓业务
  • 手机网站地址天水网站建设惠普
  • 广州机械网站开发建网站的公司大全
  • 游戏网站seo怎么做你做的网站可视区域多少钱
  • 小米路由可以做网站吗怎么看网站是什么程序
  • 张店制作网站app开发公司的联系方式
  • 网站建设平台价格网站建设二级菜单
  • 成都网站建设07fly网站开发周期表
  • 红河州建设局门户网站自适应wordpress博客
  • 自己做的网站怎么取sql数据青岛一点两区救治医院
  • 盐城网站建设app我的页面设计
  • 企业建设网站有什么作用软件开发图片
  • 安徽一方建设招标网站给企业做免费的推广
  • 中国铁路监理建设协会网站wordpress移动端加底部导航栏
  • 哈尔滨的网站建设公司网站建设方案总结语
  • 高碑店网站建设文化建设方面的建议
  • 国家职业技能培训平台企业网站建设与优化
  • 东营网站建设价钱表用爱奇艺会员做视频网站违法吗
  • 郑州 网站建设:微信网站制作系统
  • 一个网站的成功企业解决方案有哪些
  • 佛山免费建站找哪家公司网站定制