离线
TA的每日心情 | 慵懒 2021-7-23 17:16 |
---|
签到天数: 17 天 [LV.4]
|
有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 草帽王子 于 2021-9-10 18:31 编辑
本章教程主要在原有RTC教程的基础上,通过PC13,使其产生脉冲。PC13作为侵入检测引脚,可以用来输出RTC秒脉冲、闹钟脉冲或者是时钟频率为RTC时钟除以64的脉冲,后者在系统下电的情况下无法输出。
1、RTC简介
关于RTC,在前面章节已经进行过介绍,在此不再赘述。
关于RTC具体介绍,可参考前面章节及CH32V103应用手册。
2、硬件设计
本章教程主要使用PC13引脚产生脉冲,同时使用逻辑分析仪进行脉冲采集,CH32V103测试板与逻辑分析仪连接方式如下:
- CH32V103开发板的GND引脚与逻辑分析仪的GND引脚连接
- CH32V103开发板的PC13引脚与逻辑分析仪的采集通道引脚连接
3、软件设计
本章教程主要进行产生脉冲实验,需要用到PC13引脚,具体程序如下:
rtc.h文件
- #ifndef __RTC_H
- #define __RTC_H
- #include "ch32v10x_conf.h"
- #define SEC_IRQ 1
- //#define ALR_IRQ 1
- //#define OWE_IRQ 1
- /* Exported_Functions */
- u8 RTC_Init(u32 SetCnt, u32 SetAlarm);
- u8 RTC_Get(void);
- #endif
复制代码
rtc.h文件主要进行相关定义和函数声明;
rtc.c文件
- #include "rtc.h"
- void RTC_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- /*******************************************************************************
- * Function Name : RTC_NVIC_Config
- * Description : Initializes RTC Int.
- * Input : None
- * Return : None
- *******************************************************************************/
- static void RTC_NVIC_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStructure中指定的参数初始化外设NVIC寄存器
- }
- /*******************************************************************************
- * Function Name : RTC_Init
- * Description : Initializes RTC collection.
- * Input : None
- * Return : 1:Init Fail
- * 0:Init Success
- *******************************************************************************/
- u8 RTC_Init(u32 SetCnt, u32 SetAlarm)
- {
- //检查是不是第一次配置时钟
- u8 temp=0;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外设时钟
- PWR_BackupAccessCmd(ENABLE);//使能后备寄存器访问
- BKP_DeInit();//复位备份区域
- RCC_LSEConfig(RCC_LSE_ON);//设置外部低速晶振(LSE),使用外设低速晶振
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)//检查指定的RCC标志位设置与否,等待低速晶振就绪
- {
- temp++;
- Delay_Ms(10);
- }
- if(temp>=250)
- {
- printf("time error..\n");
- return 1;//初始化时钟失败,晶振有问题
- }
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
- RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- RTC_WaitForSynchro(); //等待RTC寄存器同步
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- //以下三个中断根据需要开启,三者触发时都是进入RTC_IRQHandler中断函数,通过RTC_GetITStatus判断具体是哪个中断触发
- #if SEC_IRQ //(可选)
- RTC_ITConfig(RTC_IT_SEC, ENABLE);//秒中断使能秒,用来产生一个可编程的周期性中断信号(最长可达1秒)。
- RTC_WaitForLastTask();
- #endif
- #if ALR_IRQ //(可选)
- RTC_ITConfig(RTC_IT_ALR, ENABLE);//闹钟中断使能,用来产生一个软件可编程的闹钟中断。
- RTC_WaitForLastTask();
- #endif
- #if OWE_IRQ //(可选)
- RTC_ITConfig(RTC_IT_OW, ENABLE);//溢出中断使能,指示内部可编程计数器溢出并回转为0的状态。
- RTC_WaitForLastTask();
- #endif
- RTC_EnterConfigMode(); //允许配置
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- RTC_SetPrescaler(32768);//设置RTC预分频的值
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- RTC_SetCounter(SetCnt); //设置RTC计数器值
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- RTC_SetAlarm(SetAlarm); //配置闹钟值
- RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
- RTC_ExitConfigMode(); //退出配置模式
- BKP_WriteBackupRegister(BKP_DR1, 0X5A5A); //向指定的后备寄存器中写入用户程序数据
- RTC_NVIC_Config();//RCT中断分组设置
- return 0; //ok
- }
- /*******************************************************************************
- * Function Name : RTC_IRQHandler
- * Description : This function handles RTC Handler.
- * Input : None
- * Return : None
- *******************************************************************************/
- void RTC_IRQHandler(void)
- {
- if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒钟中断
- {
- printf("second interrupt!\n");
- }
- if(RTC_GetITStatus(RTC_IT_ALR)!= RESET) //闹钟中断
- {
- printf("Alarm interrupt!\n");
- }
- if(RTC_GetITStatus(RTC_IT_OW)!= RESET) //溢出中断中断
- {
- printf("Overloop interrupt!\n");
- }
- RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_ALR|RTC_IT_OW); //清除秒钟中断、闹钟中断、溢出中断标志位
- RTC_WaitForLastTask(); //等待RTC寄存器上的最后一次写入操作完成
- }
复制代码
rtc.c文件主要进行rtc脉冲初始化配置。
main.c文件
- /********************************** (C) COPYRIGHT *******************************
- * File Name : main.c
- * Author : WCH
- * Version : V1.0.0
- * Date : 2020/11/10
- * Description : Main program body.
- *******************************************************************************/
- #include "debug.h"
- #include "rtc.h"
- /*******************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Return : None
- *******************************************************************************/
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Delay_Init();
- USART_Printf_Init(115200);
- printf("SystemClk:%d\r\n",SystemCoreClock);
- printf("RTC Test\r\n");
- RTC_Init(3,6);
- /*(PC13引脚输出脉冲)*/
- BKP_RTCOutputConfig(BKP_RTCOutputSource_Second); //秒脉冲输出
- // BKP_RTCOutputConfig(BKP_RTCOutputSource_Alarm); //闹钟脉冲输出
- // BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock); //RTC时钟除以64脉冲
- while(1)
- {
- ;
- }
- }
复制代码 main.c文件主要进行函数初始化以及配置相关脉冲输出。
4、下载验证
将编译好的程序下载到开发板并复位,配置好各脉冲模式产生脉冲如下:
秒脉冲(大约每一秒产生一次脉冲):
闹钟脉冲(当计数器值与闹钟值相同产生脉冲):
RTCCLK除以64产生的脉冲(RTCCLK为32.768KHz):
97、RTC-脉冲.rar附件下载
97、RTC-脉冲.rar
(477.13 KB, 下载次数: 13)
链接:https://pan.baidu.com/s/1CH1bFuuJ-AqlFbwfKvseGA
提取码:vni3
完
|
上一篇: CH32V307数据手册下一篇: 第九十九章:CH32V103应用教程——IIC-主发从收持续收发
|