stm32之24.RTC闹钟usart端口修改配置

这篇具有很好参考价值的文章主要介绍了stm32之24.RTC闹钟usart端口修改配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(需要修改)

源码文章来源地址https://www.toymoban.com/news/detail-677355.html

while(1)
	{
			
			//rtc唤醒事件
			if(g_rtc_wakeup_event)
			{
				//获取日期
				RTC_GetDate(RTC_Format_BCD,&RTC_DateStructure);
				printf("20%02x/%02x/%02xWeek:%x\r\n",RTC_DateStructure.RTC_Year,RTC_DateStructure.RTC_Month,RTC_DateStructure.RTC_Date,RTC_DateStructure.RTC_WeekDay);
						
				//获取时间
				RTC_GetTime(RTC_Format_BCD,&RTC_TimeStructure);
				printf("%02x:%02x:%02x\r\n",RTC_TimeStructure.RTC_Hours,RTC_TimeStructure.RTC_Minutes,RTC_TimeStructure.RTC_Seconds);	
				g_rtc_wakeup_event=0;
			}
			
			//rtc闹钟事件
			if(g_rtc_alarm_event)
			{
				//模拟闹钟滴滴的声音,并闪烁LED灯
				if(time_sum<=6)
				{
					time_cnt++;
					delay_ms(1);					
					if(time_cnt==80)
					{
						PFout(8)=1;
						PFout(10)=0;
					}
					else if(time_cnt==160)
					{
						PFout(8)=0;
						PFout(10)=1;
					}
					else if(time_cnt==240)
					{
						PFout(8)=1;
						PFout(10)=0;
					}
					else if(time_cnt==320)
					{
						PFout(8)=0;
						PFout(10)=1;
					}				
					else if(time_cnt>=1000)
					{
						time_sum+=1;
						time_cnt=0;
					}				
				}
				else
				{
					//清空标志位
					g_rtc_alarm_event=0;
					
					//清零蜂鸣器鸣响的总时间值
					time_sum=0;
					
					//清零1毫秒时间计数值
					time_cnt=0;
					
				}	
			}		
			
			//串口1事件
			if(g_usart1_event)
			{
	
				
				//判断接收到的字符串为DATE SET
				//示例:DATE SET-2017-10-12-4\n
				if(strstr((char *)g_usart1_recv_buf,"DATE SET"))
				{
					//以等号分割字符串
					strtok((char *)g_usart1_recv_buf,"-");
					
					//获取年
					p=strtok(NULL,"-");
					//2017-2000=17 
					i = atoi(p)-2000;
					//转换为16进制 17 ->0x17
					i= (i/10)*16+i%10;
					RTC_DateStructure.RTC_Year = i;
					
					//获取月
					p=strtok(NULL,"-");
					i=atoi(p);
					//转换为16进制
					i= (i/10)*16+i%10;						
					RTC_DateStructure.RTC_Month=i;


					//获取日
					p=strtok(NULL,"-");
					i=atoi(p);
					//转换为16进制
					i= (i/10)*16+i%10;		
					RTC_DateStructure.RTC_Date = i;
					
					//获取星期
					p=strtok(NULL,"-");
					i=atoi(p);
					//转换为16进制
					i= (i/10)*16+i%10;						
					RTC_DateStructure.RTC_WeekDay = i;
					
					//设置日期
					RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);
				
				}	



				//判断接收到的字符串为TIME SET
				//示例:TIME SET-14-20-10\n
				if(strstr((char *)g_usart1_recv_buf,"TIME SET"))
				{
					//以等号分割字符串
					strtok((char *)g_usart1_recv_buf,"-");
					
					//获取时
					p=strtok(NULL,"-");
					i = atoi(p);
					
					//通过时,判断是AM还是PM
					if(i<12)
						RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
					else
						RTC_TimeStructure.RTC_H12     = RTC_H12_PM;
						
					//转换为16进制
					i= (i/10)*16+i%10;
					RTC_TimeStructure.RTC_Hours   = i;
					
					//获取分
					p=strtok(NULL,"-");
					i = atoi(p);						
					//转换为16进制
					i= (i/10)*16+i%10;	
					RTC_TimeStructure.RTC_Minutes = i;
					
					//获取秒
					p=strtok(NULL,"-");
					i = atoi(p);						
					//转换为16进制
					i= (i/10)*16+i%10;					
					RTC_TimeStructure.RTC_Seconds = i; 					
					
					RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); 
				}	

				//判断接收到的字符串为ALARM SET
				//示例:ALARM SET-14-20-10\n
				if(strstr((char *)g_usart1_recv_buf,"ALARM SET"))
				{
					//以等号分割字符串
					strtok((char *)g_usart1_recv_buf,"-");
					
					//获取时
					p=strtok(NULL,"-");
					i = atoi(p);
					
					//通过时,判断是AM还是PM
					if(i<12)
						RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_H12_AM;
					else
						RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_H12_PM;
						
					//转换为16进制
					i= (i/10)*16+i%10;
					RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = i;
					
					//获取分
					p=strtok(NULL,"-");
					i = atoi(p);						
					//转换为16进制
					i= (i/10)*16+i%10;	
					RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = i;
					
					//获取秒
					p=strtok(NULL,"-");
					i = atoi(p);						
					//转换为16进制
					i= (i/10)*16+i%10;					
					RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = i; 	
					
					#if 1	//每天闹钟都会生效
						//RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;								//若RTC_AlarmDateWeekDaySel_Date,当前为日期,数值范围是0x1~0x31
																									//若RTC_AlarmDateWeekDaySel_WeekDay,当前为星期几,数值范围:0x1~0x7
						//RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;	//选择日期
						RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;				//屏蔽星期/日期,也就说闹钟每天都会生效
					#else	//指定闹钟在某一天生效
						RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;								//若RTC_AlarmDateWeekDaySel_Date,当前为日期,数值范围是0x1~0x31
																									//若RTC_AlarmDateWeekDaySel_WeekDay,当前为星期几,数值范围:0x1~0x7
						RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;	//选择日期
						RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None;						//不屏蔽星期/日期,也就说闹钟会指定某一天会生效	
					#endif		
					
					rtc_alarm_set(RTC_AlarmStructure); 
					printf("%s ok,please wait rtc alarm...\r\n",g_usart1_recv_buf);
				}
				
				//清空串口1数据计数值
				g_usart1_recv_cnt = 0;			
			
				//清空串口1接收数据事件
				g_usart1_event = 0;
			
				//清空串口1接收数据缓冲区
				memset((char *)g_usart1_recv_buf,0,sizeof g_usart1_recv_buf);
			
			}

	}
}


void RTC_WKUP_IRQHandler(void)
{

	if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
	{
		g_rtc_wakeup_event = 1;
		
		RTC_ClearITPendingBit(RTC_IT_WUT);
	} 
	
	EXTI_ClearITPendingBit(EXTI_Line22);
}


void USART1_IRQHandler(void)                				//串口1中断服务程序
{

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  	//接收中断
	{
		//从串口1接收数据
		g_usart1_recv_buf[g_usart1_recv_cnt]=USART_ReceiveData(USART1);	
		
		//记录多少个数据
		g_usart1_recv_cnt++;
		
		//检测到'#'符或接收的数据满的时候则发送数据
		if(g_usart1_recv_buf[g_usart1_recv_cnt-1]=='#' || g_usart1_recv_cnt>=(sizeof g_usart1_recv_buf)-1)
		{
			g_usart1_event = 1;
		
		}
	} 
} 


void RTC_Alarm_IRQHandler(void)
{
	if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
	{
		//添加用户代码
		g_rtc_alarm_event=1;
		
		printf("rtc alarm trig\r\n");
		
		RTC_ClearITPendingBit(RTC_IT_ALRA);
		EXTI_ClearITPendingBit(EXTI_Line17);
	} 
}

到了这里,关于stm32之24.RTC闹钟usart端口修改配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【无标题】STM32 RTC闹钟中断和唤醒待机模式

    RTC代表的是实时时钟的意思。因为它提供的时钟基准比较准确所以用处还是很多的。本文章主要讲解基于STM32F103上的RTC闹钟中断功能以及用闹钟中断唤醒STM32的待机模式。 需要注意RTC的几个要点:1.RTC的值被设定后它就会一直按照设定的基准时间自己递增,如果你的硬件设备

    2024年04月14日
    浏览(49)
  • 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    【STM32】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) 低功耗模式如图所示 停止模

    2023年04月08日
    浏览(31)
  • APM32F072单片机进入STOP模式,并通过RTC Wakeup Timer和USART1串口接收事件唤醒

    串口初始化(注意USART1时钟源要选择HSI): 使用power_init函数初始化RTC,然后调用power_enter_stop_mode(n)函数进入STOP模式,n秒后自动唤醒,或由USART1接收唤醒:

    2024年02月13日
    浏览(48)
  • STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 实现RTC周期唤醒、闹钟A/B事件功能 ,具体为在周期唤醒时利用串口输出当前RTC记录时间,当闹钟

    2024年02月03日
    浏览(52)
  • STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(64)
  • STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(54)
  • STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(52)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(53)
  • STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(二)STM32F103与ESP-01s的Usart通信,实现STM32连接上网上云

    单片机:STM32F103c8t6 WiFi模块:ESP8266-01s EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本  USB TO TTL模块:CH340 因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电           本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了

    2024年02月16日
    浏览(52)
  • STM32的RTC时钟配置

    STM32的时钟可以使用内部RTC产生时钟日历,也可以使用外部芯片产生更为精确的时钟,如DS3231时钟芯片。本文介绍使用内部RTC产生时钟。 RTC的时钟源有以下三种 :                                                                                                 

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包