你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实测教程】STM32CubeMX之时钟RTC

[复制链接]
STMCU小助手 发布时间:2023-1-13 19:00
一、开发板平台简介:
1、开发板资源简介

(1)开发板主芯片型号:STM32L431RCT6

(2)开发板主芯片封装:LQFP-64_10x10x05P

(3)开发板主芯片内核:ARM® Cortex®-M4

(4)开发板主芯片主频:80MHz

(5)开发板主芯片Flash大小:256KB

(6)开发板主芯片RAM大小:64KB

bb91345227434ee7a43a34bf3fe366e6.png

​​
929c0cce04aa4115a8623703982bf3e1.png

2、LED灯资源
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:

0f177691c5814f16a508bcfa747f87ac.png

(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:

e923ad767b8448b7ac37c4ed693724bd.png

3、时钟RTC DS1302 简介
        DS1302是一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

        DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

        RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。

8a4e4f7298a14bd2bf73b9b221adf246.png

c138e59b2cfe42acb459e4d5c65f094c.png


  二、新建工程
1、新建STM32CubeMX基础工程

(1)打开STM32CubeMX,点击“File”-->"New Project"​



2399170347904e959c855fefd5877f84.png

(2)等待打开主芯片选项界面(大约1分钟时间)。

d74d2fdc60c9440483e2b7cf8d928e7f.png

(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。

7b80345238d74bea82ce70e1a348f7b4.png

(4)选择时钟源。

   因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。

3f65707eca104663a3dede6d25dfa961.png

        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。

72119b971f62410fa8344f7f9fb9f389.png

2、配置GPIO控制LED
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
LED1——PC0
LED2——PC1
LED3——PC2
LED4——PC3

(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。


鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。

492907c1e71149819adbaee4516a2af4.png

​​
c75d3f10ba2e427d9c1a10fad9bf5471.png

(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。

38ff4b80e1c5495ba3076a5158fd91fa.png

3、设置串口1参数
(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:

497b8ee0243e446784e64a3c31e8a26f.png

(2)序号1用来设置串口收发引脚的选择。

(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。

4、设置DS1302 引脚配置参数
DS1302使用的是类I2C,也就是通过GPIO口模拟I2C的方式实现通信。

1880a836cf6d4fd8bf440c6ac1b15804.png

5、配置项目工程参数
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。

9cfb5e43f4b945c491d1ffa27f1e3284.png

(2)完成配置工程。

备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)

efdb616174f54925b6eac31109f227b5.png

41c3f2716e4e4eda8f62fa3a1d871322.png

(3)生成代码。

8eaa7d0babea40ee93f158481a6ee471.png

三、在KEIL 5中编写代码

1、使用KEIL 5(MDK)打开项目工程文件
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。

e8860cddfeaa441b8bd5bcee7ec518bc.png

2、 添加LED系统指示灯提示
(1) 添加每隔500ms,LED1、LED2、LED3、LED4闪烁一次的系统提示,用于提示程序运行正常。

2af9ef3cfaab45988c810d94d801fc34.png

3、添加DS1302驱动
(1)在bsp_ds1302.c文件中添加DS1302相关的驱动代码。
  1. /* USER CODE BEGIN 1 */

  2. /* USER CODE BEGIN 3 */

  3. #include "bsp_ds1302.h"
  4. #include "stdio.h"
  5. data_time_t data_time=
  6. {
  7.                 0x22,                                                                //年
  8.                 0x05,                                                                //月
  9.                 0x01,                                                                //日
  10.                 0x08,                                                                //时
  11.                 0x15,                                                                //分
  12.                 0x37,                                                                //秒
  13.                 0x07,                                                                //星期日
  14.           0
  15. };  //写入初始化的时间默认值
  16. /*****************************************
  17. * 函数名:void DS1302_delay(u8 dd)
  18. * 描述  :简单延时
  19. * 输入  :
  20. * 输出  :无
  21. * 调用  :
  22. *************************************/
  23. void DS1302_delay(uint8_t dd)
  24. {
  25.     uint8_t i;
  26.     for(;dd>0;dd--)
  27.                 for(i=110;i>0;i--);
  28. }

  29. /*****************************************
  30. * 函数名:void DS1302_GPIOInit(void)
  31. * 描述  :DS1302 GPIO配置
  32. * 输入  :
  33. * 输出  :无
  34. * 调用  :
  35.         CE---PB8,
  36.         CLK--->PB6,
  37.   SDA--->PB7,
  38. *************************************/
  39. void DS1302_GPIOInit(void)
  40. {
  41.                 GPIO_InitTypeDef GPIO_InitStructure = {0};
  42.                 __HAL_RCC_GPIOB_CLK_ENABLE();       
  43.                   /*Configure GPIO pin : SDA  SCL */
  44.    GPIO_InitStructure.Pin = ds1302_SDA | ds1302_SCL;
  45.          GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  46.    GPIO_InitStructure.Pull = GPIO_NOPULL;
  47.    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  48.    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  49.                
  50.         /*Configure GPIO pin : CE */
  51.    GPIO_InitStructure.Pin = ds1302_CE_PIN;
  52.    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  53.    GPIO_InitStructure.Pull = GPIO_NOPULL;
  54.    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  55.    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  56. }
  57. /*****************************************
  58. * 函数名:void DS1302_IO_GPIO(void)
  59. * 描述  :DS1302 之 IO GPIO 输入输出配置
  60. * 输入  :FLAG标志位
  61. * 输出  :无
  62. * 调用  :OUT:表示输出,IN:表示输入
  63.          FLAG:
  64. *************************************/
  65. void DS1302_IO_GPIO(uchar FLAG)
  66. {
  67.         GPIO_InitTypeDef GPIO_InitStructre;
  68.         /**********配置数据IO端口 输出 **********/
  69.         if(FLAG==0x01)
  70.   {
  71.       GPIO_InitStructre.Pin= ds1302_SDA;//配置IO_GPIO
  72.                         GPIO_InitStructre.Speed=GPIO_SPEED_FREQ_HIGH;
  73.                         GPIO_InitStructre.Mode=GPIO_MODE_OUTPUT_PP;
  74.                         HAL_GPIO_Init(ds1302_GPIO, &GPIO_InitStructre);
  75.     }
  76.       /**********配置数据IO端口 输入**********/
  77.     else if(FLAG==0x00)
  78.     {
  79.        GPIO_InitStructre.Pin= ds1302_SDA;//配置IO_GPIO
  80.                          GPIO_InitStructre.Speed=GPIO_SPEED_FREQ_HIGH;
  81.        GPIO_InitStructre.Mode=GPIO_MODE_INPUT;  //配置上拉输入
  82.        HAL_GPIO_Init(ds1302_GPIO, &GPIO_InitStructre);
  83.      }
  84.   }

  85. void ds1302_write_gpio_init(void)
  86. {
  87.                 HAL_GPIO_WritePin(ds1302_GPIO,ds1302_SDA,GPIO_PIN_SET);                                                                //初始化设置SDA
  88.                 HAL_GPIO_WritePin(ds1302_GPIO,ds1302_SCL,GPIO_PIN_SET);                                                                //初始化设置SCL
  89.                 HAL_GPIO_WritePin(ds1302_CE_GPIO,ds1302_CE_PIN,GPIO_PIN_RESET);                                //初始化设置CE
  90. }
  91. /*****************************************
  92. * 函数名:void ds1302_write_byte(uchar addr, uchar d)
  93. * 描述  :DS1302写指令和数据
  94. * 输入  :add:发送地址,dat:所在数据
  95. * 输出  :无
  96. * 调用  :
  97. *************************************/
  98. void ds1302_write_byte(uchar addr, uchar d)
  99. {
  100.     uchar i;
  101.     CE_H();
  102.     for (i = 0; i < 8; i ++)                                                //发送地址   
  103.     {
  104.         if (addr & 0x01)
  105.         {
  106.             DS1302_SDA_H();
  107.         }
  108.         else
  109.         {
  110.             DS1302_SDA_L();
  111.         }
  112.                                 addr = addr >> 1;
  113.         DS1302_SCL_H();
  114.         DS1302_delay(2);
  115.         DS1302_SCL_L();   
  116.     }
  117.     for (i = 0; i < 8; i ++)                                                  //发送数据
  118.     {
  119.         if (d & 0x01)
  120.         {
  121.             DS1302_SDA_H();
  122.         }
  123.         else
  124.         {
  125.             DS1302_SDA_L();
  126.         }
  127.                                 d = d >> 1;
  128.         DS1302_SCL_H();
  129.         DS1302_delay(2);
  130.         DS1302_SCL_L();
  131.         
  132.     }
  133.     CE_L();
  134. }
  135. /*****************************************
  136. * 函数名:uchar ds1302_read_byte(uchar addr)
  137. * 描述  :DS1302读数据
  138. * 输入  :add:地址
  139. * 输出  :无
  140. * 调用  :
  141. *************************************/
  142. uchar ds1302_read_byte(uchar addr)
  143. {
  144.     uchar i=0,temp=0,mm=0,nn=0,value=0;
  145.     CE_H();
  146.     for (i = 0; i < 8; i ++) //写地址
  147.     {
  148.         if (addr & 0x01)
  149.         {
  150.             DS1302_SDA_H();
  151.         }
  152.         else
  153.         {
  154.             DS1302_SDA_L();
  155.         }
  156.                                 addr = addr >> 1;
  157.         DS1302_SCL_H();
  158.         DS1302_delay(2);  
  159.         DS1302_SCL_L();        
  160.     }
  161.                 DS1302_IO_GPIO(0);                                //配置为输入
  162.     for (i = 0; i < 8; i ++)  //读数据
  163.     {
  164.         temp = temp >> 1;
  165.         if(HAL_GPIO_ReadPin(ds1302_GPIO, ds1302_SDA)==1)
  166.         {
  167.             temp |= 0x80;
  168.         }
  169.         else
  170.         {
  171.             temp &= 0x7F;
  172.         }
  173.         DS1302_SCL_H();
  174.         DS1302_delay(2);   
  175.         DS1302_SCL_L();
  176.     }       
  177.                 CE_L();               
  178.                 DS1302_IO_GPIO(1);                                //配置为输出       
  179.     mm=temp/16;
  180.                 nn=temp%16;
  181.                 value=mm*10+nn;                                         //数据处理转化十进制  
  182.     return value;
  183. }
  184. void ds1302_write_time(void)
  185. {
  186. //    printf("set time %x-%x-%x %x:%x:%x %x\r\n",data_time.year,data_time.months,data_time.day,data_time.hour,data_time.min,data_time.second,data_time.week_time);
  187.     ds1302_write_byte(ds1302_control_add,0x00);                                                                        //关闭写保护,允许向其他寄存器写数据
  188.           ds1302_write_byte(ds1302_year_add,data_time.year);                                        //初始化年
  189.                 ds1302_write_byte(ds1302_month_add ,data_time.months);                        //初始化月
  190.                 ds1302_write_byte(ds1302_day_add,data_time.day);                                                //初始化日
  191.                 ds1302_write_byte(ds1302_hr_add,data_time.hour);                                                //初始化时
  192.                 ds1302_write_byte(ds1302_min_add,data_time.min);                                                //初始化分
  193.                 ds1302_write_byte(ds1302_sec_add,data_time.second);                                        //初始化秒
  194.                 ds1302_write_byte(ds1302_week_time_add,data_time.week_time);//初始化工作日
  195.     ds1302_write_byte(ds1302_control_add,0x80);                                                                  //打开写保护,阻止向任何其他寄存器写数据                                                       
  196. }

  197. /*****************************************
  198. * 函数名:void DS1302_init(uchar *time)
  199. * 描述  :    DS1302初始化
  200. * 输入  :无
  201. * 输出  :无
  202. * 调用  :
  203. *************************************/
  204. void DS1302_init(void)
  205. {
  206.          DS1302_GPIOInit();  //GPIO初始化配置
  207.    DS1302_delay(2);
  208.    CE_L() ;                                    //CE=0;
  209.    DS1302_SCL_L();    // CLK=0;
  210.     //下面是对DS1302启动电池,不掉电   设置时间
  211.    ds1302_write_byte(ds1302_control_add,0x00);      //WP=0 允许数据写入DS1302
  212.    ds1302_write_byte(ds1302_charger_add,0xA7);      //充电(1个二极管+8K电阻)
  213.    ds1302_write_byte(ds1302_control_add,0X80);      //开启保护 WP=1
  214.    if(ds1302_read_byte(0X81)&0X80)                                                                        //查询DS302时钟是否启动,如果时钟停止走动:启动时钟+初始化时钟
  215.    {
  216.       ds1302_write_time();                          //设置初始时钟,芯片第一次工作需要写入初始值,否则无法计时
  217.    }
  218.    else
  219.          {
  220.                         ds1302_write_time();                         //第一次初始化之后需要注释该语句,否则没次reset都会重新写入初始化时间。只要纽扣电池存在,初始化只需要写入一次就可以屏蔽了。
  221.          }   
  222. }
  223. /*****************************************
  224. * 函数名:void ds1302_read_time(uchar *time)
  225. * 描述  :DS1302读取时间
  226. * 输入  :无
  227. * 输出  :无
  228. * 调用  :
  229. *************************************/
  230. void ds1302_read_time(void)
  231. {       
  232.     data_time.label2[0]   = ds1302_read_byte( 0x8D)/10;
  233.                 data_time.label2[1]   = ds1302_read_byte( 0x8D)%10;    //年
  234.                 data_time.label2[2]   = '/';
  235.                 data_time.label2[3]   = ds1302_read_byte( 0x89)/10;
  236.                 data_time.label2[4]   = ds1302_read_byte( 0x89)%10;    //月
  237.                 data_time.label2[5]   = '/';
  238.           data_time.label2[6]   = ds1302_read_byte( 0x87)/10;
  239.                 data_time.label2[7]   = ds1302_read_byte( 0x87)%10;     //日
  240.           data_time.label2[8]   = ds1302_read_byte( 0x85)/10;
  241.                 data_time.label2[9]   = ds1302_read_byte( 0x85)%10;     //时
  242.                 data_time.label2[10]   = ':';
  243.                 data_time.label2[11]   = ds1302_read_byte( 0x83)/10;
  244.                 data_time.label2[12]   = ds1302_read_byte( 0x83)%10;    //分
  245.                 data_time.label2[13]   = ':';
  246.                 data_time.label2[14]   = ds1302_read_byte( 0x81)/10;
  247.                 data_time.label2[15]   = ds1302_read_byte( 0x81)%10;    //秒
  248.           printf("read time %d%d%c%d%d%c%d%d  %d%d%c%d%d%c%d%d\r\n",data_time.label2[0],data_time.label2[1],data_time.label2[2],data_time.label2[3],data_time.label2[4],data_time.label2[5],data_time.label2[6],data_time.label2[7],data_time.label2[8],data_time.label2[9],data_time.label2[10],data_time.label2[11],data_time.label2[12],data_time.label2[13],data_time.label2[14],data_time.label2[15]);
  249. }


  250. /* USER CODE END 1 */
复制代码

(2)在bsp_ds1302.h中添加外部调用所需的函数声明。
  1. /* USER CODE BEGIN Private defines */
  2. #ifndef _BSP_DS1302_H_
  3. #define _BSP_DS1302_H_
  4. #include "main.h"
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. //DS1302寄存器操作指令定义时间地址
  8. #define ds1302_week_time_add 0x8a                                //工作日,星期1~7       
  9. #define ds1302_sec_add 0x80                                                        //秒
  10. #define ds1302_min_add 0x82                                                        //分
  11. #define ds1302_hr_add 0x84                                                        //时
  12. #define ds1302_day_add 0x86                                                  //日,1~30日
  13. #define ds1302_month_add 0x88                                                //月                                                       
  14. #define ds1302_year_add 0x8c                                                //年
  15. #define ds1302_control_add 0x8e                                        //写保护
  16. #define ds1302_charger_add 0x90         //充电(1个二极管+8K电阻)
  17. #define ds1302_clkburst_add 0xbe


  18. #define ds1302_GPIO     GPIOB
  19. #define ds1302_SDA                GPIO_PIN_7
  20. #define ds1302_SCL                GPIO_PIN_6

  21. #define ds1302_CE_GPIO                GPIOB
  22. #define ds1302_CE_PIN                GPIO_PIN_8

  23. #define DS1302_SDA_H()        (ds1302_GPIO->BSRR |= ds1302_SDA)
  24. #define DS1302_SDA_L()        (ds1302_GPIO->BRR  |= ds1302_SDA)
  25. #define DS1302_SCL_H()        (ds1302_GPIO->BSRR |= ds1302_SCL)
  26. #define DS1302_SCL_L()        (ds1302_GPIO->BRR  |= ds1302_SCL)

  27. #define CE_H()        (ds1302_CE_GPIO->BSRR |= ds1302_CE_PIN)
  28. #define CE_L()        (ds1302_CE_GPIO->BRR  |= ds1302_CE_PIN)

  29. typedef struct
  30. {
  31.         uint8_t                year;                                //年
  32.         uint8_t                months;                        //月
  33.         uint8_t                day;                          //日
  34.         uint8_t                hour;                          //时
  35.         uint8_t                min;                          //分
  36.         uint8_t                second;                        //秒
  37.         uint16_t        week_time;        //周时间,星期1~7
  38.         uint8_t         label2[16];        //时间存放数组显示格式
  39. }data_time_t;
  40. extern data_time_t data_time;
  41. void DS1302_GPIOInit(void);
  42. void ds1302_write_time(void);
  43. void ds1302_read_time(void);
  44. void DS1302_init(void);
  45. void ds1302_write_gpio_init(void);

  46. #endif




  47. /* USER CODE END Private defines */
复制代码

(3)在main.c函数中进行调用。
  1. int main(void)
  2. {
  3.     /* USER CODE BEGIN 1 */

  4.     /* USER CODE END 1 */

  5.     /* MCU Configuration--------------------------------------------------------*/

  6.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.     HAL_Init();

  8.     /* USER CODE BEGIN Init */

  9.     /* USER CODE END Init */

  10.     /* Configure the system clock */
  11.     SystemClock_Config();

  12.     /* USER CODE BEGIN SysInit */

  13.     /* USER CODE END SysInit */

  14.     /* Initialize all configured peripherals */
  15.     MX_GPIO_Init();
  16.     MX_USART1_UART_Init();
  17.     /* USER CODE BEGIN 2 */
  18.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);//初始化LED灯,默认点亮
  19.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);//初始化LED灯,默认点亮
  20.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);//初始化LED灯,默认点亮
  21.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);//初始化LED灯,默认点亮
  22.     ds1302_write_gpio_init();                                        //初始化默认的GPIO
  23.     DS1302_init();                                                                        //DS1302写入初始值,否则无法正常工作


  24.     /* USER CODE END 2 */

  25.     /* Infinite loop */
  26.     /* USER CODE BEGIN WHILE */
  27.     while (1)
  28.     {
  29.         /* USER CODE END WHILE */

  30.         /* USER CODE BEGIN 3 */
  31.         HAL_Delay(500);
  32.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //设置LED1反转
  33.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //设置LED1反转
  34.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //设置LED1反转
  35.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //设置LED1反转
  36.         ds1302_read_time();                                                                                                                //读取时间,并打印


  37.     }
  38.     /* USER CODE END 3 */
  39. }
复制代码

4、设置编程仿真下载模式
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。

edefb6b9a2a14be3b1221ad6d5c7a8a2.png

(2)点击Download(或者快捷键F8),即可下载程序。

ba221842d5db40808aa129dd83c593d0.png

(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。

9f8aa1a4e8f04041bcf5cb183facd100.png

5、查看串口发送函数打印log效果
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。

(2)设置成功后,就可以看到串口打印的效果。每隔500ms LED1、LED2、LED3、LED4指示灯闪烁一次,且串口输出一个时间提示的log。

e48ff090b8fa4060b6b701752ead54d0.png

(3)备注:第一次初始化程序时需要注意标准函数的调用,当有纽扣电池时,初始化完毕后就可以屏蔽该函数了,否则每次初始化时,会重新进行时钟初始化。

5870416e29e24998aae71a723c8ffcd8.png

  1. /*****************************************
  2. * 函数名:void DS1302_init(uchar *time)
  3. * 描述  :    DS1302初始化
  4. * 输入  :无
  5. * 输出  :无
  6. * 调用  :
  7. *************************************/
  8. void DS1302_init(void)
  9. {
  10.     DS1302_GPIOInit();  //GPIO初始化配置
  11.     DS1302_delay(2);
  12.     CE_L() ;                                    //CE=0;
  13.     DS1302_SCL_L();    // CLK=0;
  14.     //下面是对DS1302启动电池,不掉电   设置时间
  15.     ds1302_write_byte(ds1302_control_add,0x00);      //WP=0 允许数据写入DS1302
  16.     ds1302_write_byte(ds1302_charger_add,0xA7);      //充电(1个二极管+8K电阻)
  17.     ds1302_write_byte(ds1302_control_add,0X80);      //开启保护 WP=1
  18.     if(ds1302_read_byte(0X81)&0X80)                                                                        //查询DS302时钟是否启动,如果时钟停止走动:启动时钟+初始化时钟
  19.     {
  20.         ds1302_write_time();                          //设置初始时钟,芯片第一次工作需要写入初始值,否则无法计时
  21.     }
  22.     else
  23.     {
  24.         ds1302_write_time();                         //第一次初始化之后需要注释该语句,否则没次reset都会重新写入初始化时间。只要纽扣电池存在,初始化只需要写入一次就可以屏蔽了。
  25.     }
  26. }
复制代码

————————————————
版权声明:智能小屋ZYXC


收藏 评论0 发布时间:2023-1-13 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版