OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7616|回复: 11

请问一下在ucgui+os系统里要使用RTC 获得系统时间该怎么配置,加上RTC_Init()之后系统直接卡死为什么,初始化代码如下

[复制链接]

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
发表于 2015-1-28 18:40:03 | 显示全部楼层 |阅读模式
5金钱

int  main (void)
{
 int t = 0 ;
    CPU_INT08U  os_err;
  Stm32_Clock_Init(9);//
 delay_init(72);
 uart_init(72,9600);
    STM3210E_LCD_Init();
 BSP_Init();                                                 /* Initialize BSP functions.                            */
 TP_Init();
 RTC_Init();
 LED_Init();//初始化LED
 KEY_Init();
 GUI_Init();
    BSP_IntDisAll();
                                    
 
 /* Disable all ints until we are ready to accept them.  */

    OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel".         */

    os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart,  /* Create the start task.                               */
                             (void          * ) 0,
                             (OS_STK        * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
                             (INT8U           ) APP_TASK_START_PRIO,
                             (INT16U          ) APP_TASK_START_PRIO,
                             (OS_STK        * )&App_TaskStartStk[0],
                             (INT32U          ) APP_TASK_START_STK_SIZE,
                             (void          * )0,
                             (INT16U          )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

#if (OS_TASK_NAME_SIZE >= 11)
    OSTaskNameSet(APP_TASK_START_PRIO, (CPU_INT08U *)"Start Task", &os_err);
#endif

    OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */

    return (0);
}

 

最佳答案

查看完整内容[请看2#楼]

我直接把中断屏蔽了,单独在一个任务里调用RTC_Get()就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
 楼主| 发表于 2015-1-28 18:40:04 | 显示全部楼层
我直接把中断屏蔽了,单独在一个任务里调用RTC_Get()就可以了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-28 22:40:24 | 显示全部楼层
帮顶....
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-1-29 07:40:18 | 显示全部楼层
有个仿真工具叫JTAG
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
 楼主| 发表于 2015-1-29 17:14:19 | 显示全部楼层
这几个初始化函数之间有矛盾吗,因该是我加了RTC_Init()之后GUI就崩溃了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-29 23:37:31 | 显示全部楼层
回复【4楼】13407147650:
---------------------------------
建议跟踪下代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
 楼主| 发表于 2015-1-30 12:43:02 | 显示全部楼层
我找到是秒中断处出现了问题,是不是中断太快了导致我的GUI图形界面加载不出来所以才会显示卡死的假象,怎么解决求指导
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
 楼主| 发表于 2015-1-30 12:44:40 | 显示全部楼层
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
 
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{  
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) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化时钟失败,晶振有问题     
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟  
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步  
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2009,12,2,10,0,55);  //设置时间
RTC_ExitConfigMode(); //退出配置模式  
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{

RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断                         
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config();//RCT中断分组设置           
RTC_Get();//更新时间
return 0; //ok

}       
//RTC时钟中断
//每秒触发一次  
//extern u16 tcnt; 








RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 就是这句话
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-30 23:21:33 | 显示全部楼层
回复【7楼】13407147650:
---------------------------------
你的中断里面干了啥事?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-1-9
在线时间
0 小时
 楼主| 发表于 2015-1-31 10:07:11 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
void RTC_IRQHandler(void)
{  
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
{
RTC_Get();//更新时间   
  }
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
{
RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断       
   }      
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清闹钟中断
RTC_WaitForLastTask();                
}



读取时间中断函数
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-2-1 12:17:36 | 显示全部楼层
回复【9楼】13407147650:
---------------------------------
这里也不需要多少时间啊.
吧RTC_Get屏蔽了试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-5-5
在线时间
5 小时
发表于 2017-6-29 16:48:15 | 显示全部楼层
遇到了相同问题  。。。。。请问最终怎么解决的啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表