强化工业

    1. 找一个几十篇UCOSII下载的地方 11/4751 stm32/stm8 2011-01-31
                                       
    2. stm32的启动文件选择 5/4615 stm32/stm8 2011-01-21
                                       value line  = 超值型系列 = STM32F100xx
    3. 使用RTC(STM32)制作万年历 12/10554 stm32/stm8 2011-01-17
                                       /***************************************************** **模块:RTC.C **功能:实时时钟部分,包含初始化RTC硬件,获取时间,设置时间函数,秒滴答函数 **注意事项: **作者:电子白菜 **修改记录:2009-11.17 为提封装性,加进RTCTick函数,Real_Time仅仅作为静态变量,不允许外部调用.外部需要通过GetTime获取当前时间 **                        Time2Rtc函数更名为SetRTCTime ,GetTime函数更名为GetRTCTime 这样更好理解 *****************************************************/ #include "STM32Lib\\stm32f10x.h" #include "usr.h" #include "hal.h" void RTC2Time(void); //static u8 RTC_Blank=0; /*********************************** **函数名:RTCInit **功能:RTC设置 **注意事项:要根据是否是第一次设置,才进入下面的RTC设定                         判断是否第一次设置,只需要判断RTC后备寄存器1的值是否为事先写入的0XA5A5,如果不是,则                         RTC是第一次上电,需要初始化RTC,并把实际时间转化为RTC计数值                         返回FALSE则代表RTC没有被初始化. ************************************/ bool RTCInit(void) {         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);         PWR_BackupAccessCmd(ENABLE);         if (BKP_ReadBackupRegister(BKP_TIME_SET) != 0xA5A5)         {                 /* Reset Backup Domain */                 BKP_DeInit();                 /* Enable LSE */                 RCC_LSEConfig(RCC_LSE_ON);                 /* Wait till LSE is ready */                 //等待外部晶振震荡 需要等待比较长的时间                 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);                 //使用外部晶振32768                 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                   //允许RTC                 RCC_RTCCLKCmd(ENABLE);                 //等待RTC寄存器同步                 RTC_WaitForSynchro();                 RTC_WaitForLastTask();                 //允许RTC的秒中断(还有闹钟中断和溢出中断可设置)                 RTC_ITConfig(RTC_IT_SEC, ENABLE);                 RTC_WaitForLastTask();                 //32768晶振预分频值是32767                 //RTC_SetPrescaler(32767); /* 预分频值RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */                 RTC_SetPrescaler(32776);        //如果需要校准晶振,可修改此分频值                 RTC_WaitForLastTask();                 //写入RTC后备寄存器1 0xa5a5                 BKP_WriteBackupRegister(BKP_TIME_SET, 0xA5A5);                   //清除标志                 RCC_ClearFlag();                 return FALSE;         }         //如果RTC已经设置         else         {                 //等待RTC与APB同步                 RTC_WaitForSynchro();                 RTC_WaitForLastTask();                 //刚上电的情况,需要把RTC的值转换为时间                 RTC2Time();                 //使能秒中断                 RTC_ITConfig(RTC_IT_SEC, ENABLE);                   RTC_WaitForLastTask();                 return TRUE;         } } /****************************** **函数名:GetRTCTime **功能:获取实际时间 **注意事项:获取值将放进参数指针内,注意获取前需要关闭RTC中断,则可以避免秒越界的问题 ** *******************************/ static T_STRUCT Real_Time;//实时时间值,只允许本模块调用,外部获取时间一律使用GetTime函数 void GetRTCTime(T_STRUCT* time) {         RTC_ITConfig(RTC_IT_SEC, DISABLE);        //关闭秒中断         RTC_WaitForLastTask();         time->year=Real_Time.year;         time->month=Real_Time.month;         time->day=Real_Time.day;         time->hour=Real_Time.hour;         time->minute=Real_Time.minute;         time->sec=Real_Time.sec;         time->date=Real_Time.date;         RTC_WaitForLastTask();         RTC_ITConfig(RTC_IT_SEC, ENABLE); //打开秒中断 } /*********************************** **函数名:GetDate **功能:计算星期 **注意事项:白菜星期算法,这个一般用在GPS获取日期后计算出星期. ************************************/ const u8 TAB_DATE[12]={6,2,2,5,0,3,5,1,4,6,2,4,}; u8 GetDate(T_STRUCT* time) {         return( (time->year + time->year/4 - ( (time->month<3)&&(time->year%4==0) ) + TAB_DATE[time->month-1] + time->day )%7); } /***************** **函数名:RTC2Time **功能:把RTC内的计数器转换为实际时间  基数为  寄存器内的年月日 **注意事项:由于RTC只能存储秒,所以每次日跳进的时候都把年月日存到掉电寄存器内。 ** 而每次时钟开电,则先读取之前的年月日,并检测RTC内的CLK是否大于一天,如大于,则进行必要的运算使寄存器内的日期更新。 ** 这些都要在RTC中断前处理掉,然后RTC中断内,计时值永远不会大于0x0001517f(一日的秒总数) ******************/ const u8 Month2Day_Tab[12]={31,28,31,30,31,30,31,31,30,31,30,31} ; void RTC2Time(void) {         u32 count;         u8 tmp,change=0;         Real_Time.year=BKP_ReadBackupRegister(BKP_TIME_YEAR);//年值         Real_Time.month=BKP_ReadBackupRegister(BKP_TIME_MONTH);//月值         Real_Time.day=BKP_ReadBackupRegister(BKP_TIME_DAY);//日值         Real_Time.date=BKP_ReadBackupRegister(BKP_TIME_DATE);//星期值         RTC_ITConfig(RTC_IT_SEC, DISABLE);        //为了避免代码重入引起的问题,这里吧RTC秒中断屏蔽了         count=RTC_GetCounter();         //计算新的年月日         while (count>=0x0001517f)         //上次关电到本次跨越了一天以上         {                 change=1;                 count-=0x0001517f;                 //星期自加                 if ((++Real_Time.date)>=8)                         Real_Time.date=1;                 //如果是2月,计算闰年(不需要考虑2099以后的400年一非润)                 if (Real_Time.month==2)                 {                         if (Real_Time.year%4)                                 tmp=28;                         else                                 tmp=29;                 }                 else                 {                         tmp=Month2Day_Tab[Real_Time.month-1];                 }                 if ((++Real_Time.day)>tmp)                 {                         Real_Time.day=1;                         if ((++Real_Time.month)>12)                         {                                 Real_Time.month=1;                                 if ((++Real_Time.year)>=100)                                 {                                         Real_Time.year=0;                                 }                         }                 }         }         //计算新的时分秒         Real_Time.hour=count/3600;         Real_Time.minute=(count%3600)/60;         Real_Time.sec=(count%3600)%60;         //如果跨越了一天,则计算后,要存回寄存器内         if (change)         {                 RTC_SetCounter(count);                 BKP_WriteBackupRegister(BKP_TIME_DATE,Real_Time.date);                 BKP_WriteBackupRegister(BKP_TIME_DAY,Real_Time.day);                 BKP_WriteBackupRegister(BKP_TIME_MONTH,Real_Time.month);                 BKP_WriteBackupRegister(BKP_TIME_YEAR,Real_Time.year);         }         //重新打开RTC中断         RTC_ITConfig(RTC_IT_SEC, ENABLE); } /********************************* **函数名:SetRTCTime **功能:设置时间,除了把Real_Time的值改变外,还要把时分秒转换为RTC计数值,年月日存到后备寄存器上 **注意事项:函数内会自动根据年月日计算星期,并且返回到*time上 **********************************/ void SetRTCTime(T_STRUCT* time) {         u32 count;         RTC_ITConfig(RTC_IT_SEC, DISABLE);        //关闭秒中断         RTC_WaitForLastTask();         //付时间值到Real_Time上         Real_Time.year=time->year;         Real_Time.month=time->month;         Real_Time.day=time->day;         Real_Time.hour=time->hour;         Real_Time.minute=time->minute;         Real_Time.sec=time->sec;         //计算星期         time->date=Real_Time.date=GetDate(time);         //把新的年月日存到掉电寄存器上         BKP_WriteBackupRegister(BKP_TIME_DATE,Real_Time.date); //        RTC_WaitForLastTask();         BKP_WriteBackupRegister(BKP_TIME_DAY,Real_Time.day); //        RTC_WaitForLastTask();         BKP_WriteBackupRegister(BKP_TIME_MONTH,Real_Time.month); //        RTC_WaitForLastTask();         BKP_WriteBackupRegister(BKP_TIME_YEAR,Real_Time.year); //        RTC_WaitForLastTask();         //计算新的RTC count值         count=Real_Time.hour*3600+Real_Time.minute*60+Real_Time.sec;         RTC_WaitForLastTask();         RTC_SetCounter(count);         RTC_WaitForLastTask();         RTC_ITConfig(RTC_IT_SEC, ENABLE); //打开秒中断 } /************************************************************** ** 函数名:RTCTick ** 功能:RTC的秒跳动 ** 注意事项:此函数在RTC秒中断中调用,则可在每个秒中断中刷新当前时间 ***************************************************************/ void RTCTick(void) {         u8 tmp;         if ((++Real_Time.sec)>59)         {                 Real_Time.sec=0;                 if ((++Real_Time.minute)>59)                 {                         Real_Time.minute=0;                         if ((++Real_Time.hour)>23)                         {                                 Real_Time.hour=0;                                 //星期自加                                 if ((++Real_Time.date)>=8)                                         Real_Time.date=1;                                 //--存储新的星期                                 BKP_WriteBackupRegister(BKP_DR5,Real_Time.date);                                 //如果是2月,计算闰年(不需要考虑2099以后的400年一非润)                                 if (Real_Time.month==2)                                 {                                         if (Real_Time.year%4)                                                 tmp=28;                                         else                                                 tmp=29;                                 }                                 else                                 {                                         tmp=Month2Day_Tab[Real_Time.month-1];                                 }                                 if ((++Real_Time.day)>tmp)                                 {                                         Real_Time.day=1;                                         if ((++Real_Time.month)>12)                                         {                                                 Real_Time.month=1;                                                 if ((++Real_Time.year)>99)                                                 {                                                         Real_Time.year=0;                                                 }                                                 //--储存新的年                                                 BKP_WriteBackupRegister(BKP_DR2,Real_Time.year);                                         }                                         //--储存新的月                                         BKP_WriteBackupRegister(BKP_DR3,Real_Time.month);                                 }                                 //--储存新的日                                 BKP_WriteBackupRegister(BKP_DR4,Real_Time.day);                         }                 }         } }
    4. 版主了解STM32W系列处理器价格吗 12/5777 stm32/stm8 2010-12-18
                                       是做射频2.4G的吧
    5. STM32F103VBT6L版本与Y版本的区别? 49/13523 stm32/stm8 2010-11-02
                                       补充:有时刚电能正常工作几分钟,然后就开始乱动作了,有时上电后立即乱输出。
    6.                                  ..........................................
    7. wince里的例程怎么用? 10/7246 嵌入式系统 2010-06-22
      引用 3 楼 xdkui 的回复: 不用这么麻烦。在PB的工程里,右键你的工程(比如OSDesign1)->Open Release Directory in Build Window,会打开CE的编译窗口。然后cd到你的sample目录,运行build -c。就可以得到sample的可执行文件,然后运行就可以了。 BTW:CE的编译系统是在Build Window里运行的,PB的UI下编译只不过是把Build Window封……
      我着您说的做了,但是编译后只得到res或者obj,就是没有我要的exe?
    8. 点阵模块闪动 25/6317 嵌入式系统 2010-06-12
      引用 22 楼 peasant_lee 的回复: 中断函数不算大,,一般的那种。。 中断会改变ram区,因为要压栈,保存现场地址和其他变量,RAM会变小。
      恩,小了就小了,只要做了现场保护就好。
    9. 定时器捕获与匹配冲突 4/3765 嵌入式系统 2010-06-03
      公司生产的硅什么?我有“TI”皮, 我没有看到这样的问题, 请出示您如何配置定时器和中断.
    10. 你先把数字放大啊 单片机处理高精度小数可能不行,但处理大数是没什么问题的,实在太大了就分几次处理
    11. 关于热释电红外传感器re200b和BISS0001的问题 12/12262 嵌入式系统 2010-05-24
      楼主,你的VO的输出在哪里测量?是在BISS0001上测量吗?还是测量三极管后面的电平?
    12. Makefile语法小问题 10/5256 嵌入式系统 2010-05-13
      #(smdk2410_config:_config=)运算结果是smdk2410 那 $@=smdk2410_config $(@:_config=)应该$0啊 ???? 还是不懂啊
    13. ce6.0 复合设备问题!! (键盘+u盘) 7/3384 嵌入式系统 2010-05-11
      引用 3 楼 laorenshen 的回复: 可以做成2个, 做成设备分2种模式, 一种是符合设备,2个设备用是1个pid, 一种是2个设备,独立的2个设备, 你做成后者就可以, 需要改改usb驱动代码, 看看资料吧,既然你都作出来键盘了,那么2个设备也好做,枚举改改就ok,多申请一个端点
      只要我的板子插入电脑后能够在设备管理器里面增加了键盘一项盘符,在磁盘里面增加了一个盘符,并可以拷贝即可。!! 请您能说的再详细一点吗??????
    14. 你这个应该是MDK的吧?没有进入串口中断,确定两个问题,一是软件:开中断了没有?中断向量设置对了没?是否有更高优先级的中断,经常性中断。二是硬件,232工作正常不?串口连接正常不? 其实没进入中断函数,那么你的中断函数里面实现什么,就都不用看了,进入了中断再说,呵呵
    15. 朋友们进来接分喽 7/3141 嵌入式系统 2010-03-23
      结贴了哈  
    16. 不一定要用mpeg-4的压缩格式,其实用wmv的格式压缩比更高,而且关键wince肯定能播放!!考虑下
    17. 嵌入式开发的要求不尽相同! 随着产品类型的不同, 需求的能力层次也是不一样的! 基本上, 简单的嵌入式系统开发用不到什么学校的具体知识, 需要的是较强的思维能力. 只要公司肯花上1到2个月带你, 也是没问题的. 当然, 工资待遇开始肯定不高!
    18. Eboot和Nboot里代码执行问题 17/6193 嵌入式系统 2010-01-15
      嗯,关键我是需要控制bootloader流程,现在出现这种奇怪的问题,下面的事情怎么做啊?谁见过这样的问题啊?
    19. STM32ADC1中两个通道会不会相互干扰? 13/11943 stm32/stm8 2010-01-13
                                       8楼的延长采样保持时间是指 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5); 采样时间吗? 如果是,我已经试过,还是有干扰。 如果不是,请教?
    20. 关于uboot地址重定位 9/4431 嵌入式系统 2010-01-08
      引用 2 楼 dairyman000 的回复: …… 完成代码拷贝后,start.S做了一些诸如开启MMU,……
      赫赫,uboot里可不敢开启mmu,那是kernel自己要做的事情。

最近访客

< 1/1 >

统计信息

已有71人来访过

  • 芯积分:--
  • 好友:--
  • 主题:15
  • 回复:65

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言