工程师犹饿死 发表于 2022-8-23 14:12

STM32F103---标准库函数之驱动RTC

要想驱动RTC很简单,查看stm32f10x参考手册找到以下图片内容,就有思路了。


经过参考手册介绍LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供
一个低功耗且精确的时钟源。我们选用LSE时钟源。

工程师犹饿死 发表于 2022-8-23 14:14



根据以上图片作者的思路是:

    1.首先使能对应位 进行访问RTC

    2.选择对应时钟源

    3.配置RTC

   4 .选择中断

工程师犹饿死 发表于 2022-8-23 14:15

参考如下图便可以写代码了。

工程师犹饿死 发表于 2022-8-23 14:16

最后得出代码 便可驱动RTC(代码有注释):
void rtc_init(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//使能BKPEN位
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWREN位
        PWR_BackupAccessCmd(ENABLE); //使能PWR_CR的DBP位
       
        RCC_LSEConfig(RCC_LSE_ON); //配置LSE时钟源开
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RTCCLK时钟源配置为LSE
        RCC_RTCCLKCmd(ENABLE); //使能RTCCLK配置生效
       
        RTC_WaitForLastTask();//等待RTOFF位为1
        RTC_EnterConfigMode(); //进入配置模式
       
        RTC_WaitForLastTask(); //根据配置RTC寄存器得 每次写RTC的寄存器都要等待RTOFF位为1
        RTC_SetCounter(1672502392); //RTC从这个数开始计时 这是时间戳 可以上网查时间戳转换
       
        RTC_WaitForLastTask(); //再次等待写入完成
        RTC_SetPrescaler(0x7fff); //预分频设定为0x7fff = 32.767 LSE为32.768Khz分频后约得 1KHZ
       
        RTC_WaitForLastTask(); //再次等待写入完成
        RTC_ITConfig(RTC_IT_SEC,ENABLE);//RTC中断配置,让秒中断使能
       
        RTC_WaitForLastTask();//再次等待写入完成
        RTC_ExitConfigMode(); //离开配置模式
       
        RTC_WaitForLastTask();//再次等待写入完成
       
        NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn; //NVIC是总中断配置 选择RTC这个中断通道
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //中断使能
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //中断优先级2
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; //同等优先级下 这个中断优先级3
       
        NVIC_Init(&NVIC_InitStruct);//让上面配置生效
}

工程师犹饿死 发表于 2022-8-23 14:19

----------------------------------虚线为止已经驱动好RTC了--------------

工程师犹饿死 发表于 2022-8-23 14:19

下面读取RTC里面的值:

工程师犹饿死 发表于 2022-8-23 14:21

/*
函数功能:RTC读取
函数参数:无
函数返回值:无
函数描述:无
*/
void Rtc_Read(void)
{
        RTC_WaitForSynchro(); //软件等待RTC_CRL中的RSF位置1
        TIME = RTC_GetCounter();//正式读取
        timeinfo = localtime(&TIME); //用time.h头文件里面的函数进行 数据处理
}

工程师犹饿死 发表于 2022-8-23 14:25

--------------------读取内容完毕-----------------------------

工程师犹饿死 发表于 2022-8-23 14:31

读内容说明

      在主函数文件里面定义了如下变量

                  uint32_t TIME;
                  struct tm* timeinfo;

工程师犹饿死 发表于 2022-8-23 14:32

工程师犹饿死 发表于 2022-8-23 14:33

读取到的内容 经过数据处理后 可用 结构体指针 取得想要的年月日时分秒。

图里面的内容不是定义的 是time.h文件自带的 。

redone 发表于 2022-10-1 09:43

RTC能不能用内部时钟

Pulitzer 发表于 2023-1-20 07:05


图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。

公羊子丹 发表于 2023-1-20 08:08


要将多余空间去除。对于第一个字符从第一行开始向下扫描,把那些一行中所有的点的灰度值全为0的点去掉,直到扫描到有一行不全为0时为止。

公羊子丹 发表于 2023-1-20 09:01


通过OV7670摄像头进行图像采集

Wordsworth 发表于 2023-1-20 10:04


根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。

Clyde011 发表于 2023-1-20 11:07


切割完了第四个字符之后,再依次扫描剩下的空间,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始并依次扫描直到所扫描的这一竖上的所有点的灰度值全为0时认为是字符的结束。

万图 发表于 2023-1-20 13:03


计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。

Uriah 发表于 2023-1-20 14:06


在内存中开辟七个长为车牌长的七分之一和宽为车牌宽的区域

帛灿灿 发表于 2023-1-20 16:02


需要设定一个阈值来对像素点进行设置
页: [1]
查看完整版本: STM32F103---标准库函数之驱动RTC