打印
[技术问答]

HC32L136 例程 rtc_int不能进中断

[复制链接]
1523|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.背景 第一次使用小华的MCU L136,官方例程里面的rtc_int例程,因为我的开发板两个晶振都没有连接所以改用内部晶振
2.代码
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
**   - 2016-02-16  1.0  XYZ First version for Device Driver Library of Module.
**
******************************************************************************/

/******************************************************************************
* Include files
******************************************************************************/
#include "rtc.h"
#include "lpm.h"
#include "gpio.h"
/******************************************************************************
* Local pre-processor symbols/macros ('#define')                           
******************************************************************************/

/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')                                         
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/
__IO uint8_t flag;
__IO uint8_t second, minute, hour, week, day, month, year;

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
void App_GpioCfg(void);
void App_RtcCfg(void);

/**
******************************************************************************
    ** \brief  主函数
    **
  ** @param  无
    ** \retval 无
    **
******************************************************************************/
int32_t main(void)
{
    stc_rtc_time_t readtime;
    // 设置内部低速时钟的频率
    Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
    //使能内部低速时钟作为RTC时钟
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);    // 改过 改成内部的  
   
    //配置GPIO
    App_GpioCfg();      

    //配置RTC
    App_RtcCfg();   
   
    while (1)
    {
        if(flag == 1)                     // flag在中断中置1
        {
            flag = 0;
            Rtc_ReadDateTime(&readtime);  // 获取RTC时钟值
            second = readtime.u8Second;   // 读取时钟值
            minute = readtime.u8Minute;
            hour   = readtime.u8Hour;
            day    = readtime.u8Day;
            week   = readtime.u8DayOfWeek;
            month  = readtime.u8Month;
            year   = readtime.u8Year;
            
            //LED 闪烁
            if(TRUE == Gpio_GetInputIO(STK_LED_PORT, STK_LED_PIN))       //如果当前LED灯是点亮状态
            {
                Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN, FALSE);    //输出低,熄灭LED
                Gpio_WriteOutputIO(GpioPortA, GpioPin5, FALSE);          //PA05高电平
            }            
            else                                                         //如果当前LED灯是熄灭状态
            {
                Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN, TRUE);     //输出高,点亮LED
                Gpio_WriteOutputIO(GpioPortA, GpioPin5, TRUE);           //PA05低电平
            }
        }
    }        
}

/**
******************************************************************************
    ** \brief  RTC中断入口函数
    **
  ** @param  无
    ** \retval 无
    **
******************************************************************************/  
void Rtc_IRQHandler(void)
{
    if(Rtc_GetPridItStatus() == TRUE)
    {
        flag = 1;
        Rtc_ClearPrdfItStatus();             //清除中断标志位
    }
}

/**
******************************************************************************
** \brief  初始化外部GPIO引脚
**
** \return 无
******************************************************************************/
void App_GpioCfg(void)
{
    stc_gpio_cfg_t         GpioInitStruct;
    DDL_ZERO_STRUCT(GpioInitStruct);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);   //GPIO外设时钟打开
    //Sysctrl_SetPeripheralGate(SysctrlPeripheralTick,TRUE);   //GPIO外设时钟打开
   
    //LED指示灯配置
    GpioInitStruct.enDrv  = GpioDrvH;
    GpioInitStruct.enDir  = GpioDirOut;
    Gpio_Init(STK_LED_PORT, STK_LED_PIN, &GpioInitStruct);
    Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN, TRUE);     //输出高,点亮LED  
   
    //配置PA05引脚和LED控制引脚一样输出,方便示波器观察
    Gpio_Init(GpioPortA, GpioPin5, &GpioInitStruct);      
}

/**
******************************************************************************
    ** \brief  配置RTC
    **
  ** @param  无
    ** \retval 无
    **
******************************************************************************/
void App_RtcCfg(void)
{
    stc_rtc_initstruct_t RtcInitStruct;
    Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE);//RTC模块时钟打开
    RtcInitStruct.rtcAmpm = RtcPm;                       //24小时制
    RtcInitStruct.rtcClksrc = RtcClkRcl;                 //内部低速时钟 改过改成内部的
    RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx;         //周期中断类型PRDX
    RtcInitStruct.rtcPrdsel.rtcPrdx = 1u;                //周期中断时间间隔 1秒
    RtcInitStruct.rtcTime.u8Second = 0x55;               //配置RTC时间
    RtcInitStruct.rtcTime.u8Minute = 0x01;
    RtcInitStruct.rtcTime.u8Hour   = 0x10;
    RtcInitStruct.rtcTime.u8Day    = 0x17;
    RtcInitStruct.rtcTime.u8DayOfWeek = 0x04;
    RtcInitStruct.rtcTime.u8Month  = 0x04;
    RtcInitStruct.rtcTime.u8Year   = 0x19;
    RtcInitStruct.rtcCompen = RtcCompenEnable;           // 使能时钟误差补偿
    RtcInitStruct.rtcCompValue = 0;                      //补偿值  根据实际情况进行补偿
    Rtc_Init(&RtcInitStruct);
    Rtc_AlmIeCmd(TRUE);                                  //使能闹钟中断
   
    EnableNvic(RTC_IRQn, IrqLevel3, TRUE);               //使能RTC中断向量
    Rtc_Cmd(TRUE);                                       //使能RTC开始计数
}


/******************************************************************************
* EOF (not truncated)
******************************************************************************/


3.mcu可以工作 ,但是RTC的中断不进去,FLAG不能变成1,感觉使用应该挺规矩的吧 ,不知道那里漏掉了。
4.其它代码都是和DDL库1.9,2一样

使用特权

评论回复
沙发
yanfeng390| | 2022-3-20 11:30 | 只看该作者
来学习的

使用特权

评论回复
板凳
土司Apple|  楼主 | 2022-3-20 11:57 | 只看该作者

使用特权

评论回复
地板
xch| | 2022-3-21 00:38 | 只看该作者
CRO->WAIT bit  置一后才能修改寄存器吧?

使用特权

评论回复
5
土司Apple|  楼主 | 2022-3-21 09:55 | 只看该作者
有大神给指导一下不?

使用特权

评论回复
6
土司Apple|  楼主 | 2022-3-21 11:01 | 只看该作者
xch 发表于 2022-3-21 00:38
CRO->WAIT bit  置一后才能修改寄存器吧?

例子程序也会有这种错误? 该如何修正呢? 修改寄存器之前WAIT 写 1么?

使用特权

评论回复
7
xch| | 2022-3-21 13:42 | 只看该作者
本帖最后由 xch 于 2022-3-21 13:45 编辑
土司Apple 发表于 2022-3-21 11:01
例子程序也会有这种错误? 该如何修正呢? 修改寄存器之前WAIT 写 1么?



华大的手册也是粗制滥造,中国特色。

其实为了安全点,操作RTC寄存器之前应当禁止一切中断为好,完事后开中断。除非你有100%把握中断不影响修改RTC进程。

使用特权

评论回复
8
土司Apple|  楼主 | 2022-3-21 18:44 | 只看该作者
xch 发表于 2022-3-21 13:42
华大的手册也是粗制滥造,中国特色。

其实为了安全点,操作RTC寄存器之前应当禁止一切中断为好,完事后 ...

最后在RTC未启动模式下不用等待WAIT。DDL库的RTCinit上来就关了。应该是正常使用吧
/**
******************************************************************************
    ** \brief  初始化RTC
    **
    ** @param  Rtc_InitStruct 存放stc_rtc_initstruct_t类型的结构体
    ** \retval 无
    **
******************************************************************************/
void Rtc_Init(stc_rtc_initstruct_t* Rtc_InitStruct)
{
    Rtc_Cmd(FALSE);
    M0P_RTC->CR0_f.AMPM = Rtc_InitStruct->rtcAmpm;        //实时时钟小时的时制
    Rtc_SetCyc(&Rtc_InitStruct->rtcPrdsel);                //设置周期中断的类型(PRDSEL)及其所选类型的时间(PRDS或PRDX)
    M0P_RTC->CR1_f.CKSEL = Rtc_InitStruct->rtcClksrc;      //实时时钟RTC的时钟源
    Rtc_CompCfg(Rtc_InitStruct->rtcCompValue, Rtc_InitStruct->rtcCompen); //配置时钟误差补偿寄存器
    Rtc_SetTime(&Rtc_InitStruct->rtcTime);                 //设置初始时钟
}

使用特权

评论回复
9
土司Apple|  楼主 | 2022-3-21 20:25 | 只看该作者
本帖最后由 土司Apple 于 2022-3-25 09:02 编辑

一开始板子焊接不好,之后冲洗焊接了一下,可以了,但是这里的使用感觉还不是很明白,内外部的晶振切换是怎么样的?

使用特权

评论回复
10
土司Apple|  楼主 | 2022-3-31 09:30 | 只看该作者
开发华大,keil不能用最新的测试 5.29是OK的 真是汗流浃背!革命还差的远,请努力呀!

使用特权

评论回复
11
tpgf| | 2022-4-3 19:52 | 只看该作者
开启中断使能了吗

使用特权

评论回复
12
coshi| | 2022-4-3 19:55 | 只看该作者
中断向量重定位?

使用特权

评论回复
13
drer| | 2022-4-3 20:10 | 只看该作者
就是设置寄存器的事

使用特权

评论回复
14
wiba| | 2022-4-3 20:21 | 只看该作者
中断向量被屏蔽了吧

使用特权

评论回复
15
nawu| | 2022-4-3 20:33 | 只看该作者
可以进入其他中断吗

使用特权

评论回复
16
aoyi| | 2022-4-3 20:50 | 只看该作者
产生中断事件了吗

使用特权

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

本版积分规则

57

主题

254

帖子

2

粉丝