打印
[综合信息]

华大HC32L130/HC32L136驱动RTC时钟芯片BL5372

[复制链接]
380|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
先放一张BL5372使用文档里的原理图

使用特权

评论回复
沙发
和下土|  楼主 | 2023-8-27 18:12 | 只看该作者
这里与RTC模块通信用的是模拟IIC 由手册知道IIC写地址为0x64 读为0x65
以下部分代码 为模拟IIC的一些函数 与设置/调取时间的一些函数

使用特权

评论回复
板凳
和下土|  楼主 | 2023-8-27 18:12 | 只看该作者
#include "RTC_BL5372.h"
#include "rx.h"
#include "DataStore.h"
#include "ddl.h"


h_alarm_set alarm_value;
h_rtc_init_time current_time;
h_rtc_read_time current_read_time;



void RTC_SDA_IN(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟

    stcGpioCfg.enDir = GpioDirIn;   //端口方向配置->输入
    stcGpioCfg.enDrv = GpioDrvL;    //驱动能力配置->高驱动能力
    stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
    stcGpioCfg.enPd = GpioPdDisable;
    stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
    stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB

    Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
}

void RTC_SDA_OUT(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟

    stcGpioCfg.enDir = GpioDirOut;  //端口方向配置->输入
    stcGpioCfg.enDrv = GpioDrvL;    //驱动能力配置->高驱动能力
    stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
    stcGpioCfg.enPd = GpioPdDisable;
    stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
    stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB

    Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
}

//初始化IIC
void RTC_IIC_Init(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟

    stcGpioCfg.enDir = GpioDirOut;   //端口方向配置->输入
    stcGpioCfg.enDrv = GpioDrvL;     //驱动能力配置->高驱动能力
    stcGpioCfg.enPu = GpioPuDisable; //端口上下拉配置->无
    stcGpioCfg.enPd = GpioPdDisable;
    stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
    stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB

    Gpio_Init(RTC_IIC_PORT, RTC_IIC_SCL, &stcGpioCfg);
    Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);

    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
}
//产生IIC起始信号
void RTC_IIC_Start(void)
{
    RTC_SDA_OUT(); // sda线输出
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Ddl_Delay1us(4);
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // START:when CLK is high,DATA change form high to low
    Ddl_Delay1us(4);
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void RTC_IIC_Stop(void)
{
    RTC_SDA_OUT(); // sda线输出
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // STOP:when CLK is high DATA change form low to high
    Ddl_Delay1us(4);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA); //发送I2C总线结束信号
    Ddl_Delay1us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 RTC_IIC_Wait_Ack(void)
{
    u8 ucErrTime = 0;
    RTC_SDA_IN(); // SDA设置为输入
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
    Ddl_Delay1us(2);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Ddl_Delay1us(2);
    while (RTC_READ_SDA == TRUE)
    {
        ucErrTime++;
        if (ucErrTime > 250)
        {
            RTC_IIC_Stop();
            return 1;
        }
    }
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //时钟输出0
    return 0;
}
//产生ACK应答
void RTC_IIC_Ack(void)
{
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
    RTC_SDA_OUT();
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
    Ddl_Delay1us(2);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Ddl_Delay1us(2);
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
}
//不产生ACK应答
void RTC_IIC_NAck(void)
{
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
    RTC_SDA_OUT();
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
    Ddl_Delay1us(2);
    Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
    Ddl_Delay1us(2);
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
}
// IIC发送一个字节
//返回从机有无应答
// 1,有应答
// 0,无应答
void RTC_IIC_Send_Byte(u8 txd)
{
    u8 t;
    RTC_SDA_OUT();
    Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //拉低时钟开始数据传输
    for (t = 0; t < 8; t++)
    {
        // RTC_IIC_SDA=(txd&0x80)>>7;
        if ((txd & 0x80) >> 7)
            Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
        else
            Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
        txd <<= 1;
        // Ddl_Delay1us(2); //对TEA5767这三个延时都是必须的
        Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
        // Ddl_Delay1us(2);
        Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
        // Ddl_Delay1us(2);
    }
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte(unsigned char ack)
{
    unsigned char i, receive = 0;
    RTC_SDA_IN(); // SDA设置为输入
    for (i = 0; i < 8; i++)
    {
        Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
        delay10us(1);
        Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
        receive <<= 1;
        if (RTC_READ_SDA == TRUE)
            receive++;
        Ddl_Delay1us(1);
    }
    if (!ack)
        RTC_IIC_NAck(); //发送nACK
    else
        RTC_IIC_Ack(); //发送ACK
    return receive;
}

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte_Fast_Ack(unsigned char ack)
{
    unsigned char i, receive = 0;
    RTC_SDA_IN(); // SDA设置为输入
    for (i = 0; i < 8; i++)
    {
        Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
        Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
        receive <<= 1;
        if (RTC_READ_SDA == TRUE)
            receive++;
    }
    if (!ack)
        RTC_IIC_NAck(); //发送nACK
    else
        RTC_IIC_Ack(); //发送ACK
    return receive;
}

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte_Fast_No_Ack()
{
    unsigned char i, receive = 0;
    RTC_SDA_IN(); // SDA设置为输入
    for (i = 0; i < 8; i++)
    {
        Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
        Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
        receive <<= 1;
        if (RTC_READ_SDA == TRUE)
            receive++;
    }

    return receive;
}

//初始化IIC接口
void RTC_Init(void)
{
    RTC_IIC_Init();
}
//在AT24CXX指定地址读出一个数据
// ReadAddr:开始读数的地址
//返回值  :读到的数据
u8 RTC_ReadOneByte(u16 ReadAddr)
{
    u8 temp = 0;
    RTC_IIC_Start();
    RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
    RTC_IIC_Wait_Ack();
    RTC_IIC_Send_Byte(((ReadAddr<<4)|0)); //发送高地址
    RTC_IIC_Wait_Ack();
    RTC_IIC_Start();
    RTC_IIC_Send_Byte(IIC_READ_ARR); //进入接收模式
    RTC_IIC_Wait_Ack();
    temp = RTC_IIC_Read_Byte(0);
    // IIC_NAck();
    RTC_IIC_Stop(); //产生一个停止条件

    delay1ms(1);
    Wdt_Feed();
    return temp;
}
//在AT24CXX指定地址写入一个数据
// WriteAddr  :写入数据的目的地址
// DataToWrite:要写入的数据
void RTC_WriteOneByte(u16 WriteAddr, u8 DataToWrite)
{
RTC_IIC_Start();
RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
RTC_IIC_Wait_Ack();
RTC_IIC_Send_Byte(((WriteAddr<<4)|0)); //发送高地址
RTC_IIC_Wait_Ack();
RTC_IIC_Send_Byte(DataToWrite); //发送字节
RTC_IIC_Wait_Ack();
RTC_IIC_Stop(); //产生一个停止条件

    delay1ms(10);
}

//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
// WriteAddr  :开始写入的地址
// DataToWrite:数据数组首地址
// Len        :要写入数据的长度2,4
void RTC_WriteLenByte(u16 WriteAddr, unsigned char *pBuffer, u8 Len)
{       
        while(Len--)
        {
                RTC_WriteOneByte(WriteAddr,*pBuffer);
                WriteAddr++;
                pBuffer++;
        }
}

//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
// ReadAddr   :开始读出的地址
//返回值     :数据
// Len        :要读出数据的长度2,4

void RTC_ReadLenByte(unsigned char ReadAddr,unsigned char *pBuffer,unsigned char NumToRead)
{
        while(NumToRead)
        {
                *pBuffer++=RTC_ReadOneByte(ReadAddr++);       
                NumToRead--;
        }
}
//检查AT24CXX是否正常
//这里用了24XX的最后一个地址(255)65535来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 RTC_Check(void)
{
    u8 temp;
    temp = RTC_ReadOneByte(65535); //避免每次开机都写AT24CXX
    if (temp == 0x55)
        return 0;
    else //排除第一次初始化的情况
    {
        RTC_WriteOneByte(65535, 0x55);
        temp = RTC_ReadOneByte(65535);
        if (temp == 0x55)
            return 0;
    }
    return 1;
}

//在AT24CXX里面的指定地址开始读出指定个数的数据
// ReadAddr :开始读出的地址 对24c02为0~255
// pBuffer  :数据数组首地址
// NumToRead:要读出数据的个数
void RTC_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
{
    while (NumToRead)
    {
        *pBuffer++ = RTC_ReadOneByte(ReadAddr++);
        // printf("%c\n",*pBuffer);//显示读到的字符串
        NumToRead--;
                       
                                Wdt_Feed();
    }
}
//在AT24CXX里面的指定地址开始写入指定个数的数据
// WriteAddr :开始写入的地址 对24c02为0~255
// pBuffer   :数据数组首地址
// NumToWrite:要写入数据的个数
void RTC_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite)
{
    while (NumToWrite--)
    {
        RTC_WriteOneByte(WriteAddr, *pBuffer);
        WriteAddr++;
        pBuffer++;
                       
                                Wdt_Feed();
    }
}


//用来设置当前的时间
void BL5372_init(h_rtc_init_time time)
{
                unsigned char  BL5372buf[16];
            unsigned char temp;
                    unsigned char index=0;

               ///RTC_IIC_Init

                           BL5372buf[index++]=time.Set_Second;second
                           BL5372buf[index++]=time.Set_Minute;minute
                           BL5372buf[index++]=time.Set_Hour;hour
                           BL5372buf[index++]=time.Set_Week;week
                           BL5372buf[index++]=time.Set_Day;day
                           BL5372buf[index++]=time.Set_Month;month
                           BL5372buf[index++]=time.Set_Year;///year
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
                           BL5372buf[index++]=0x00;
               BL5372buf[index++]=RTC_CRL_G1_USUAL;
                           BL5372buf[index++]=RTC_CRL_G2_USUAL;                                 
              do{
                   RTC_WriteLenByte(0x00,BL5372buf,16);
                   temp=RTC_ReadOneByte(RTC_CRL_G2_ARR);
                                   }while((temp&0x10)==0x10);
       
}       


//读当前时间
void Read_Nowtime(h_rtc_read_time *read_time)
{  
    read_time->Second=RTC_ReadOneByte(RTC_SECOND_ARR);
          read_time->Minute=RTC_ReadOneByte(RTC_MINUTE_ARR);
    read_time->Hour=RTC_ReadOneByte(RTC_HOUR_ARR);
    read_time->Week=RTC_ReadOneByte(RTC_WEEK_ARR);
    read_time->Day=RTC_ReadOneByte(RTC_DAY_ARR);
    read_time->Month=RTC_ReadOneByte(RTC_MONTH_ARR);
          read_time->Year=RTC_ReadOneByte(RTC_YEAR_ARR);
          read_time->Control_1=RTC_ReadOneByte(RTC_CRL_G1_ARR);
          read_time->Control_2=RTC_ReadOneByte(RTC_CRL_G2_ARR);
}

//自定义时间闹钟
void RTC_SetAlarm(h_alarm_set value)
{
                RTC_WriteOneByte(ALARM_CLOCK_MINUTE_ARR,value.Minute);
                RTC_WriteOneByte(ALARM_CLOCK_HOUR_ARR,value.Hour);
                RTC_WriteOneByte(ALARM_CLOCK_WEEK_ARR,value.Week);
                RTC_WriteOneByte(RTC_CRL_G1_ARR,RTC_CRL_G1_ALARM);
                RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_ALARM);
}       

//定时间隔输出
void RTC_Fixed_interval_timer(interval_timer Mode)
{
                RTC_WriteOneByte(RTC_CRL_G1_ARR,Mode);
                RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_USUAL);
}       

使用特权

评论回复
地板
和下土|  楼主 | 2023-8-27 18:12 | 只看该作者
下面为.h文件
#ifndef __RTC_BL5372_H
#define __RTC_BL5372_H

#include "main.h"
#include "rx.h"
#include "device_menu.h"

//IO操作函数
#define RTC_IIC_PORT GpioPortB
#define RTC_IIC_SCL GpioPin8                           //SCL
#define RTC_IIC_SDA GpioPin9                           //SDA
#define RTC_READ_SDA Gpio_GetInputIO(RTC_IIC_PORT, RTC_IIC_SDA) //输入SDA
#define IIC_WRITE_ARR 0x64
#define IIC_READ_ARR 0x65

#define RTC_CRL_G1_USUAL 0x00      //控制寄存器1通常值
#define RTC_CRL_G2_USUAL 0x20      //控制寄存器2通常值(清除中断的值)
#define RTC_CRL_G1_ALARM 0x80      //控制寄存器1闹钟值
#define RTC_CRL_G2_ALARM 0x20      //控制寄存器2闹钟值
#define ALARM_CLOCK_MINUTE_ARR 0x08  //定时闹钟分钟地址
#define ALARM_CLOCK_HOUR_ARR 0x09  //定时闹钟小时地址
#define ALARM_CLOCK_WEEK_ARR 0x0A  //定时闹钟每周哪几天响地址

#define RTC_SECOND_ARR   0x00  //读取秒时地址
#define RTC_MINUTE_ARR   0x01  //读取分时地址
#define RTC_HOUR_ARR   0x02  //读取时时地址
#define RTC_WEEK_ARR   0x03  //读取周时地址
#define RTC_DAY_ARR   0x04  //读取天时地址
#define RTC_MONTH_ARR   0x05  //读取月时地址
#define RTC_YEAR_ARR   0x06  //读取年时地址
#define RTC_CRL_G1_ARR 0x0E  //控制寄存器1地址
#define RTC_CRL_G2_ARR 0x0F  //控制寄存器2地址

#define RTC_ALARM_CLEAR_IRQ 0x22  //闹钟进中断控制寄存器2的值
#define RTC_TIMER_CLEAR_IRQ 0x24  //定时进中断控制寄存器2的值



extern uint8_t  RRTCiic_buf[16];  //读出来的时间放在这里
typedef struct rtc_init_time
{
        unsigned char Set_Year;
        unsigned char Set_Month;
        unsigned char Set_Day;
        unsigned char Set_Week;
        unsigned char Set_Hour;
        unsigned char Set_Minute;
        unsigned char Set_Second;
}h_rtc_init_time;

extern h_rtc_init_time current_time;

typedef struct rtc_read_time
{
        unsigned char Year;
        unsigned char Month;
        unsigned char Day;
        unsigned char Week;
        unsigned char Hour;
        unsigned char Minute;
        unsigned char Second;
        unsigned char Control_1;
        unsigned char Control_2;
       
}h_rtc_read_time;

extern h_rtc_read_time current_read_time;



//可设置每周哪几天的几点几分
//Week表示:二进制1111111分别代表周日周一到周六 全一代表每天都设置了闹钟 0000001代表只有周六设置了闹钟
//Hour,Minute为闹钟几点几分
/*
如果用这个函数main里可以这样检测  
闹钟到了会触发寄存器0x0F里的位
if(((RTC_ReadOneByte(0x0F))==0x24||(RTC_ReadOneByte(0x0F))==0x22)||(RTC_ReadOneByte(0x0F))==0x26)
{
        delay1ms(5000);
  RTC_WriteOneByte(0x0F,0x20); //清除闹钟标志位
}
*/
typedef struct alarm_set
{
        unsigned char Week;
        unsigned char Hour;
        unsigned char Minute;
}h_alarm_set;

extern h_alarm_set alarm_value;





/*
1.SECOND_MODE:每秒标志位置一
2.MINUTE_MODE:每分标志位置一(每分 00 秒)
3.HOUR_MODE:每时标志位置一(每时 00 分:00 秒)
4.MONTH_MODE:每月标志位置一(每月第 1 天 00 时:00 分:00 秒)
标志位需清除 例:
if(((RTC_ReadOneByte(0x0F))==0x24||(RTC_ReadOneByte(0x0F))==0x22)||(RTC_ReadOneByte(0x0F))==0x26)
{
        delay1ms(500);
  RTC_WriteOneByte(0x0F,0x20); //清除标志位
}
*/
typedef enum
{
          SECOND_MODE = 0x84,
    MINUTE_MODE,
    HOUR_MODE,
    MONTH_MODE
       
}interval_timer;


//IIC所有操作函数
void RTC_IIC_Init(void);                 //初始化IIC的IO口
void RTC_IIC_Start(void);                //发送IIC开始信号
void RTC_IIC_Stop(void);                 //发送IIC停止信号
void RTC_IIC_Send_Byte(u8 txd);          //IIC发送一个字节
u8 RTC_IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
u8 RTC_IIC_Wait_Ack(void);               //IIC等待ACK信号
void RTC_IIC_Ack(void);                  //IIC发送ACK信号
void RTC_IIC_NAck(void);                 //IIC不发送ACK信号

void RTC_IIC_Write_One_Byte(u8 daddr, u8 addr, u8 data);
u8 RTC_IIC_Read_One_Byte(u8 daddr, u8 addr);

u8 RTC_ReadOneByte(u16 ReadAddr);                              //指定地址读取一个字节
void RTC_WriteOneByte(u16 WriteAddr, u8 DataToWrite);          //指定地址写入一个字节
void RTC_WriteLenByte(u16 WriteAddr, unsigned char *pBuffer, u8 Len); //指定地址开始写入指定长度的数据
void RTC_ReadLenByte(unsigned char ReadAddr,unsigned char *pBuffer,unsigned char NumToRead);                     //指定地址开始读取指定长度数据
void RTC_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite);    //从指定地址开始写入指定长度的数据
void RTC_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead);       //从指定地址开始读出指定长度的数据
void BL5372_init(h_rtc_init_time time);
void Read_Nowtime(h_rtc_read_time *read_time);
void RTC_SetAlarm(h_alarm_set value);
void RTC_Fixed_interval_timer(interval_timer Mode);



#endif

使用特权

评论回复
5
和下土|  楼主 | 2023-8-27 18:13 | 只看该作者
以下为主函数设置与读取时间代码
int main(void)
{
        Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
        Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE);        // RTC模块时钟打开
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
        RTC_Init(); // iic初始化
       
  //设置时间
        current_time.Set_Year=0x23;
        current_time.Set_Month=0x07;
        current_time.Set_Day =0x11;
        current_time.Set_Week=0x02;       
        current_time.Set_Hour=0x09;
        current_time.Set_Minute=0x43;
        current_time.Set_Second=0x00;
        BL5372_init(current_time);

        while (1)
        {
                    //读取时间到结构体
                        Read_Nowtime(&current_read_time);
  }

}

使用特权

评论回复
6
和下土|  楼主 | 2023-8-27 18:13 | 只看该作者
以上为设置/读取时间的一些函数

该RTC芯片还有两个额外功能

1.可设置闹钟输出电平

2.可设置每时/分/秒输出电平

以上两种功能主要是需要设置两个控制寄存器的值

先说控制寄存器1 这里有几个重要的位 我贴出来

使用特权

评论回复
7
和下土|  楼主 | 2023-8-28 07:16 | 只看该作者

使用特权

评论回复
8
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者

使用特权

评论回复
9
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者

使用特权

评论回复
10
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者
接下来看控制寄存器2

使用特权

评论回复
11
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者

使用特权

评论回复
12
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者

使用特权

评论回复
13
和下土|  楼主 | 2023-8-28 07:17 | 只看该作者

使用特权

评论回复
14
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
以下为我自己总结的两种功能分别要发送什么

使用特权

评论回复
15
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者

使用特权

评论回复
16
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
对于这些寄存器的配置 我已经写好函数 直接将结构体赋值 引用函数即可

例:设置闹钟 (INTRA引脚输出低电平)

使用特权

评论回复
17
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
int main(void)
{
        Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
        Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE);        // RTC模块时钟打开
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
        RTC_Init(); // iic初始化
  //设置时间
        current_time.Set_Year=0x23;
        current_time.Set_Month=0x07;
        current_time.Set_Day =0x11;
        current_time.Set_Week=0x02;       
        current_time.Set_Hour=0x09;
        current_time.Set_Minute=0x43;
        current_time.Set_Second=0x00;
        BL5372_init(current_time);
  
        //每天9点45分INTRA引脚输出低电平
        alarm_value.Hour=0x09;      
        alarm_value.Minute=0x45;
        alarm_value.Week=0x7F;   //代表1111111 一周里每天的意思
  RTC_SetAlarm(alarm_value);
        while (1)
        {
               
                        Read_Nowtime(&current_read_time);

  }

}

使用特权

评论回复
18
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
例:设置每分钟进中断(INTRA引脚输出低电平)

使用特权

评论回复
19
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
int main(void)
{
        Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
        Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE);        // RTC模块时钟打开
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
        RTC_Init(); // iic初始化

  //设置时间
        current_time.Set_Year=0x23;
        current_time.Set_Month=0x07;
        current_time.Set_Day =0x11;
        current_time.Set_Week=0x02;       
        current_time.Set_Hour=0x09;
        current_time.Set_Minute=0x43;
        current_time.Set_Second=0x00;
        BL5372_init(current_time);
        //设置每分钟进中断
  RTC_Fixed_interval_timer(MINUTE_MODE);

        while (1)
        {
               
                        Read_Nowtime(&current_read_time);

  }


}

使用特权

评论回复
20
和下土|  楼主 | 2023-8-28 07:18 | 只看该作者
注意:这里清除中断为在while(1)里加入

           另外延时时间可以根据需要修改

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

938

帖子

0

粉丝