文档库 最新最全的文档下载
当前位置:文档库 › 基于STM32 RTC实时时钟

基于STM32 RTC实时时钟

基于STM32 RTC实时时钟
基于STM32 RTC实时时钟

1 课程设计内容

本文将利用ALIENTEK 2.8寸TFTLCD模块来显示日期时间,实现一个简单的时钟。

2 STM32芯片简介

2006年ARM公司推出了基于ARMv7架构的Cortex系列的标准体系结构,以满足各种技术的不同性能要求,包含A、R、M三个分工明确的系列[1]。其中,A系列面向复杂的尖端应用程序,用于运行开放式的复杂操作系统;R系列适合实时系统;M系列则专门针对低成本的微控制领域。Cortex-M3是首款基于ARMv7-M体系结构的32位标准处理器,具有低功耗、少门数、短中断延迟、低调试成本等众多优点。它是专门为在微控制系统、汽车车身系统、工业控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能而设计的,它大大简化了编程的复杂性,集高性能、低功耗、低成本于一体[2]。半导体制造厂商意法半导体ST公司是ARM公司Cortex-M3内核开发项目一个主要合作方,2007年6月11日ST公司率先推出了基于Cortex-M3内核的STM32系列MCU。本章将简要介绍STM32系列处理器的分类、内部结构及特点,并对本设计中重点应用的通用定时器做进一步分析。

2.1 STM32 RTC时钟简介

STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护。

RTC 的简化框图,如图 20.1.1 所示:

图 20.1.1 RTC 框图

RTC 由两个主要部分组成(参见图 20.1.1),第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动,用来与 APB1 总线连接。

另一部分(RTC 核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是 RTC 的预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程计数器,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。

RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。

RTC 内核完全独立于 RTC APB1 接口,而软件是通过 APB1 接口访问 RTC 的预分频值、计数器值和闹钟值的。但是相关可读寄存器只在 RTC APB1 时钟进行重新同步的 RTC 时钟的上升沿被更新,RTC 标志也是如此。这就意味着,如果 APB1 接口刚刚被开启之后,在第一次的内部寄存器更新之前,从 APB1 上都处的 RTC 寄存器值可能被破坏了(通常读到 0)。因此,若在读取 RTC 寄存器曾经被禁止的 RTC APB1 接口,软件首先必须等待 RTC_CRL 寄存器的 RSF位(寄存器同步标志位,bit3)被硬件置 1。

2.2 RTC相关配置

正常工作的一般配置步骤如下:

1)使能电源时钟和备份区域时钟。

前面已经介绍了,我们要访问 RTC 和备份区域就必须先使能电源时钟和备份区域时钟。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);

2)取消备份区写保护。

要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复位之后被使能),否则是无法向备份区域写入数据的。我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟。取消备份区域写保护的库函数实现方法是:

PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问

3)复位备份区域,开启外部低速振荡器。

在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要看情况而定。然后我们使能外部低速振荡器,注意这里一般要先判断 RCC_BDCR 的 LSERDY位来确定低速振荡器已经就绪了才开始下面的操作。

备份区域复位的函数是:

BKP_DeInit();//复位备份区域

开启外部低速振荡器的函数是:

RCC_LSEConfig(RCC_LSE_ON);// 开启外部低速振荡器

4)选择 RTC 时钟,并使能。

这里我们将通过 RCC_BDCR 的 RTCSEL 来选择选择外部 LSI 作为 RTC 的时钟。然后通过RTCEN 位使能 RTC 时钟。

库函数中,选择 RTC 时钟的函数是:

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟

对于RTC 时钟的选择,还有RCC_RTCCLKSource_LSI 和RCC_RTCCLKSource_HSE_Div128

两个,顾名思义,前者为 LSI,后者为 HSE 的 128 分频,这在时钟系统章节有讲解过。

使能 RTC 时钟的函数是:

RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟

5)设置 RTC 的分频,以及配置 RTC 时钟。

在开启了 RTC 时钟之后,我们要做的就是设置 RTC 时钟的分频数,通过RTC_PRLH 和RTC_PRLL 来设置,然后等待 RTC 寄存器操作完成,并同步之后,设置秒钟中断。然后设置RTC 的允许配置位(RTC_CRH 的 CNF 位),设置时间(其实就是设置 RTC_CNTH 和 RTC_CNTL两个寄存器)。下面我们一一这些步骤用到的库函数:

在进行 RTC 配置之前首先要打开允许配置位(CNF),库函数是:

RTC_EnterConfigMode();/// 允许配置

在配置完成之后,千万别忘记更新配置同时退出配置模式,函数是:

RTC_ExitConfigMode();//退出配置模式,更新配置设置 RTC 时钟分频数,库函数是:

void RTC_SetPrescaler(uint32_t PrescalerValue);

这个函数只有一个入口参数,就是 RTC 时钟的分频数,很好理解。

然后是设置秒中断允许,RTC 使能中断的函数是:

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);

这个函数的第一个参数是设置秒中断类型,这些通过宏定义定义的。对于使能秒中断方法是:

RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中断

下一步便是设置时间了,设置时间实际上就是设置 RTC 的计数值,时间与计数值之间是需要换算的。库函数中设置 RTC 计数值的方法是:

void RTC_SetCounter(uint32_t CounterValue)最后在配置完成之后

通过这个函数直接设置 RTC 计数值。

6)更新配置,设置 RTC 中断分组。

在设置完时钟之后,我们将配置更新同时退出配置模式,这里还是通过 RTC_CRH 的 CNF来实现。库函数的方法是:

RTC_ExitConfigMode();//退出配置模式,更新配置

在退出配置模式更新配置之后我们在备份区域 BKP_DR1 中写入 0X5050 代表我们已经初始化过时钟了,下次开机(或复位)的时候,先读取 BKP_DR1 的值,然后判断是否是 0X5050 来决定是不是要配置。接着我们配置 RTC 的秒钟中断,并进行分组。往备份区域写用户数据的函数是:

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);

这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的。比如我们要往BKP_DR1 写入 0x5050,方法是:

BKP_WriteBackupRegister(BKP_DR1, 0X5050);

同时,有写便有读,读取备份区域指定寄存器的用户数据的函数是:

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);

这个函数就很好理解了,这里不做过多讲解。

设置中断分组的方法之前已经详细讲解过,调用 NVIC_Init 函数即可,这里不做重复讲解。

7)编写中断服务函数。

最后,我们要编写中断服务函数,在秒钟中断产生的时候,读取当前的时间值,并显示到TFTLCD 模块上。

通过以上几个步骤,我们就完成了对 RTC 的配置,并通过秒钟中断来更新时间。3单元模块及电路设计

3.1 电源模块

图1 3.2 复位电路模块

图2 3.3 外部时钟模块

图3 3.4 外部晶振模块

图4 3.5 JTAG下载模块

图5 3.6 主控制器模块

图8

3.7 BootLoader配置模块

图9

4 软件设计

首先是 RTC_Init,其代码如下:

//实时时钟配置

//初始化 RTC 时钟,同时检测时钟是否工作正常

//BKP->DR1 用于保存是否第一次配置的设置

//返回 0:正常

//其他:错误代码

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); //向指定的后备寄存器中

//写入用户程序数据 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 时钟,但是只在第一次的时候设置时间,以后如果重新上电/复位都不会再进行时间设置了(前提是备份电池有电),在第一次配置的时候,我们是按照上面介绍的 RTC 初始化步骤来做的,这里就不在多说了,这里我们设置时间是通过时间设置函数RTC_Set(2012,9,7,13,16,55);来实现的,这里我们默认将时间设置为 2012 年 9 月 7 日 13 点 16 分55 秒。在设置好时间之后,我们通过 BKP_WriteBackupRegister()函数向 BKP->DR1 写入标志字

0X5050 ,用于标记时间已经被设置了。这样,再次发生复位的时候,该函数通过BKP_ReadBackupRegister()读取 BKP->DR1 的值,来判断决定是不是需要重新设置时间,如果不需要设置,则跳过时间设置,仅仅使能秒钟中断一下,就进行中断分组,然后返回了。这样不会重复设置时间,使得我们设置的时间不会因复位或者断电而丢失。

该函数还有返回值,返回值代表此次操作的成功与否,如果返回 0,则代表初始化 RTC 成功,如果返回值非零则代表错误代码了。

介绍完 RTC_Init,我们来介绍一下 RTC_Set 函数,该函数代码如下:

//设置时钟

//把输入的时钟转换为秒钟

//以 1970 年 1 月 1 日为基准

//1970~2099 年为合法年份

//返回值:0,成功;其他:错误代码.

//月份数据表

u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表

//平年的月份日期表

const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};

u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)

{

u16 t;

u32 seccount=0;

if(syear<1970||syear>2099)return 1;

for(t=1970;t

{ if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数

else seccount+=31536000; //平年的秒钟数

}

smon-=1;

for(t=0;t

{ seccount+=(u32)mon_table[t]*86400; //月份秒钟数相加

if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年 2 月份增加一天的秒钟数

}

seccount+=(u32)(sday-1)*86400; //把前面日期的秒钟数相加seccount+=(u32)hour*3600; //小时秒钟数

seccount+=(u32)min*60; //分钟秒钟数

seccount+=sec; //最后的秒钟加上去

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR |

RCC_APB1Periph_BKP, ENABLE); //使能 PWR 和 BKP 外设时钟

PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问

RTC_SetCounter(seccount); //设置 RTC 计数器的值

RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成

return 0;

}

该函数用于设置时间,把我们输入的时间,转换为以 1970 年 1 月 1 日 0 时 0 分 0 秒当做起始时间的秒钟信号,后续的计算都以这个时间为基准的,由于STM32 的秒钟计数器可以保存136 年的秒钟数据,这样我们可以计时到 2106 年。

接着,我们介绍一下 RTC_Get 函数,该函数用于获取时间和日期等数据,其代码如下:

//得到当前的时间,结果保存在 calendar 结构体里面

//返回值:0,成功;其他:错误代码.

u8 RTC_Get(void)

{ static u16 daycnt=0;

u32 timecount=0;

u32 temp=0;

u16 temp1=0;

timecount=RTC->CNTH; //得到计数器中的值(秒钟数)

timecount<<=16;

timecount+=RTC->CNTL;

temp=timecount/86400; //得到天数(秒钟数对应的)

if(daycnt!=temp) //超过一天了

{

daycnt=temp;

temp1=1970; //从 1970 年开始

while(temp>=365)

{

if(Is_Leap_Year(temp1)) //是闰年

{

if(temp>=366)temp-=366; //闰年的秒钟数

else {temp1++;break;}

}

else temp-=365; //平年

temp1++;

}

calendar.w_year=temp1; //得到年份

temp1=0;

while(temp>=28) //超过了一个月

{

if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2 月份{

if(temp>=29)temp-=29;//闰年的秒钟数

else break;

}

else

{ if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年

else break;

}

temp1++;

}

calendar.w_month=temp1+1; //得到月份

calendar.w_date=temp+1; //得到日期

}

temp=timecount%86400; //得到秒钟数

calendar.hour=temp/3600; //小时

calendar.min=(temp%3600)/60; //分钟

calendar.sec=(temp%3600)%60; //秒钟

calendar.week=RTC_Get_Week(calendar .w_year,calendar.w_month,calendar .w_date);

//获取星期

return 0;

}

函数其实就是将存储在秒钟寄存器 RTC->CNTH 和 RTC->CNTL 中的秒钟数据(通过函数RTC_SetCounter 设置)转换为真正的时间和日期。该代码还用到了一个calendar 的结构体,calendar 是我们在 rtc.h 里面将要定义的一个时间结构体,用来存放时钟的年月日时分秒等信息。

因为 STM32 的 RTC 只有秒钟计数器,而年月日,时分秒这些需要我们自己软件计算。我们把计算好的值保存在 calendar 里面,方便其他程序调用。

最后,我们介绍一下秒钟中断服务函数,该函数代码如下:

//RTC 时钟中断

//每秒触发一次

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();

}

此部分代码比较简单,我们通过 RTC_GetITStatus 来判断发生的是何种中断,如果是秒钟中断,则执行一次时间的计算,获得最新时间。从而,我们可以在calendar 里面读到时间、日期等信息。

rtc.c 的其他程序,这里就不再介绍了,请大家直接看光盘的源码。接下来看看rtc.h 代码,在 rtc.h 中,我们定义了一个结构体:

typedef struct

{

vu8 hour;

vu8 min;

vu8 sec;

//公历日月年周

vu16 w_year;

vu8 w_month;

vu8 w_date;

vu8 week;

}_calendar_obj;

从上面结构体定义可以看到_calendar_obj 结构体所包含的成员变量是一个完

整的公历信息,包括年、月、日、周、时、分、秒等 7 个元素。我们以后要知道当前时间,只需要通过 RTC_Get函数,执行时钟转换,然后就可以从 calendar 里面读出当前的公历时间了。

最后看看 main.c 里面的代码如下:

int main(void)

{

u8 t=0;

delay_init(); //延时函数初始化

NVIC_Configuration(); //设置 NVIC 中断分组 2

uart_init(9600); //串口初始化波特率为 9600

LED_Init(); //LED 端口初始化

LCD_Init(); //LCD 初始化

usmart_dev.init(72); //初始化 USMART

POINT_COLOR=RED; //设置字体为红色

LCD_ShowString(60,50,200,16,16,"WarShip STM32");

LCD_ShowString(60,70,200,16,16,"RTC TEST");

LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(60,110,200,16,16,"2012/9/7");

while(RTC_Init()) //RTC 初始化,一定要初始化成功

{ LCD_ShowString(60,130,200,16,16,"RTC ERROR! ");

delay_ms(800);

LCD_ShowString(60,130,200,16,16,"RTC Trying...");

}

//显示时间

POINT_COLOR=BLUE; //设置字体为蓝色

LCD_ShowString(60,130,200,16,16," - - ");

LCD_ShowString(60,162,200,16,16," : : ");

while(1)

{

if(t!=calendar.sec)

{

t=calendar.sec;

LCD_ShowNum(60,130,calendar.w_year,4,16);

LCD_ShowNum(100,130,calendar.w_month,2,16);

LCD_ShowNum(124,130,calendar.w_date,2,16);

switch(calendar.week)

{

case 0:LCD_ShowString(60,148,200,16,16,"Sunday ");

break;

case 1:LCD_ShowString(60,148,200,16,16,"Monday ");

break;

case 2:LCD_ShowString(60,148,200,16,16,"Tuesday ");

break;

case 3:LCD_ShowString(60,148,200,16,16,"Wednesday");

break;

case 4:LCD_ShowString(60,148,200,16,16,"Thursday ");

break;

case 5:LCD_ShowString(60,148,200,16,16,"Friday ");

break;

case 6:LCD_ShowString(60,148,200,16,16,"Saturday ");

break;

}

LCD_ShowNum(60,162,calendar.hour,2,16);

LCD_ShowNum(84,162,calendar.min,2,16);

LCD_ShowNum(108,162,calendar.sec,2,16);

LED0=!LED0;

}

delay_ms(10);

};

}

这部分代码就不再需要详细解释了,在包含了rtc.h 之后,通过判断calendar .sec 是否改变来决定要不要更新时间显示。同时我们设置 LED0 每 2 秒钟闪烁一次,用来提示程序已经开始跑了。

为了方便设置时间,我们在 usmart_config.c 里面,修改 usmart_nametab 如下:

struct _m_usmart_nametab usmart_nametab[]=

{

#if USMART_USE_WRFUNS==1 //如果使能了读写操作

(void*)read_addr,"u32 read_addr(u32 addr)",

(void*)write_addr,"void write_addr(u32 addr,u32 val)",

#endif

(void*)delay_ms,"void delay_ms(u16 nms)",

(void*)delay_us,"void delay_us(u32 nus)",

(void*)RTC_Set,"u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)",

};

四自由度汽车振动影响分析

四自由度汽车振动影响分析 一、汽车振动问题分析 汽车振动的分析研究是为了提高汽车平顺性,汽车平顺性是指汽车过程中能保证乘员不致因车身振动而引起不舒适和疲乏感觉,以及保持运载货物完整无损的性能。汽车平顺性是影响汽车乘坐舒适性的重要原因,而平顺性的主要就是依靠汽车减振来保证,汽车振动日益成为汽车研发和性能提高的关键所在。 在了解了汽车振动的危害之后,就需要人们研究振动问题,掌握振动机理,消除振动带来的不利影响,利用振动规律指导汽车的研发。汽车振动所要研究的问题主要有路面等级对汽车振动影响、车速对汽车振动影响、悬架参数对汽车振动影响。 二、汽车四自由度系统建模 图2.1四自由度汽车模型 考虑汽车纵向角振动时悬架对车身激振影响就必须至少将汽车振动系统简化为如图所示的一个四自由度平面振动模型。在这个振动模型中,要求车辆相对于纵垂面完全对称,并且左右车轮下的路面不平度完全一样,则认为车辆是在纵垂面上振动。把车身简化为质量为m,绕质心的转动惯量为觉得平面刚体;把前后车轴(包括轮胎)的质量简化为二个质量点m1,m2;前后悬架刚度为左右两侧刚度之和用k1,k2表示,而前后悬架减震器的阻尼系数为左右两侧之和用c1,c2表示:kt1和kt2为轮胎刚度,ct1,ct2为轮胎阻尼,它们也为两侧之和。

为了研究悬架与车身连接点处悬架振动对车身的激励,必须首先列出整个振系的振动微分方程组。为此根据分析动力学中的粘滞阻尼力的拉格朗日方程: . ..Z Z Z Z R U T T dt d ??- =??+??-? ??? ? ????)1.2( 式中:T ——振动系统的总动能; U ——振动系统的总位能; R ——振动系统的总耗散函数; 对四自由度平面振动模型其总动能为: 2.2 22.112.2.2 1 212121z m z m J z m T +++=θ)2.2( 总位能为: 22222111222211)(21 )(21)(21)(21q z k q z k z b z k z a z k U t t -+-+-++--= θθ )3.2( 总耗散能为: 2 .2.222 .1.112...22...1)(21)(21)(21)(21q z c q z c z b z c z a z c R t t -+-+--+--=θθ )4.2( 将三式代入拉格朗日方程求出系统振动的微分方程组整理成矩形式为: . . .. Q C Q K KZ Z C Z M t t +=++)5.2( 其中: ?? ??? ?? ?? ???=2100 0000000000m m J m M ?? ??? ?? ?????+--+--++---+-+=2222 1 111212 2 2121 21212 10 0t t k k b k k k k a k k b k a k b k a k b k a k k k b k a k k k K

实时时钟设计实验报告

实验报告

源代码: #pragma sfr //使用特殊功能寄存器 #pragma EI //开中断 #pragma DI //关中断 #pragma access //使用绝对地址指令 #pragma interrupt INTTM000 Time //定义时间中断函数为Time #pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOver void Init_Led(); void InitKey_INTKR(); void Init_Lcd(); void Init_Inter(); void LightOneLed(unsigned char ucNum); void LightOff(); int Count_Day(int month); char i=0; //定义变量i,是切换时间的标志 int key=0; //定义key=0 int temp=1; //用于存放当前月的天数 int temp1=1; int second=0; //默认的秒second=0 int minute=0; //默认的分minute=0 int hour=12; //默认的时hour=12 int day=1; //默认的天day=1 int month=5; //默认的月month=5 int year=2014; //默认的年year=2014 int c_hour=1; //默认的闹钟时=1 int c_minute=1; //默认的闹钟分=1 int buffs[2]; //秒的数码显示缓存区 int buffm[2]; //分的数码显示缓存区 int buffh[2]; //时的数码显示缓存区 int buffday[2]; //天的数码显示缓存区 int buffmonth[2]; //月的数码显示缓存区 int buffyear[4]; //年的数码显示缓存区 int buffmd[4]; //月,天的数码显示缓存区 int buffhm[4]; //时,分的数码显示缓存区 int buffms[4]; //分,秒的数码显示缓存区 int buffch[2]; //闹钟时的数码显示缓存区 int buffcm[2]; //闹钟分的数码显示缓存区 unsigned char Que = 0; //INT中断中间变量 int LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};// 数字0~~9的显示码 unsigned char Scond; //…………………………延时函数1……………………// void Delay(int k){ i nt i,j; f or(i=0;i

激光打标机故障及处理解决方法1357【新版】

激光打标机故障及处理解决方法 锦帛方激光整理了激光打标机故障处理解决方法,希望可以帮助到更多人。 不发光 老式Q驱动器上ON、OFF、RUN三个档位选择错误,OFF为强制关断激光命令,ON为强制发光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。金橙子板卡打标时为高电平,即打标时为5V,不打标时为0V。 板卡与驱动器上的信号连线开路,调换或者重新焊接好。 光路没有调好,重新调解光路。 氪灯坏,调换氪灯。 电脑操纵系统或电脑阻碍,重装系统或调换电脑。 激光电源坏,调换激光电源。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关。 光弱 打标软件CW方法没有选中,光会很弱,选取CW方法。 Q驱动器上的M1、M2、M3档位拨错,正确的方法是选择M1。 焦距过错,重新调解焦距。 水温过高。 氪灯老化,调换氪灯。 全反或半反射镜片、聚焦镜片、振镜镜片、Q开关的镜片脏或擦花。擦洁净或调换。 腔体,全反射镜,半反射镜和扩束镜没有调好,重新调解。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。可将激光电源的电流恰卖调大,将倍频片放在半反射镜之前看有没有漏光。如果漏光,光会很弱,重新调解Q开关。 激光没有打在振镜中心,或者是振镜的镜片刮花。重调光路,或调换振镜。 连续发光

错误的开关机顺序均可能会导致连续出光。正确的开机顺序为:总电源=>电脑=>打标软件=>冷水机=>Q 驱动器=>激光电源=>等激电源上的READY灯亮后=>按RUN键启动=>振镜电源开关。关机顺序与之相反。 老式Q驱动器上ON、OFF、RUN档位开关拨错,ON为强制发光命令,OFF为强制关断激光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。 电脑或操纵系统问题。调换或重装系统。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关(这种情况较少,一般来说Q开关坏了,Q驱动器会报警) 振镜不动 板卡坏,调换板卡。板卡上X、Y振镜信号的电压,正常情况是:打标时为0-5V之间转变,不打标时为0V。 振镜信号线开路,调换。 振镜阻碍,调换振镜。 电脑操纵系统或电脑阻碍,重装系统或调换电脑。 振镜抖动和啸叫 地线没有接好,重新接好地线。 板卡坏,调换板卡。 关失激光电源,Q驱动器,用手轻轻接触振镜的镜片是否抖动或听振镜是否啸叫,如果阻碍排除,再逐一打开激光电源和Q驱动器,以判断是激光电源还是Q驱动器引起。 如果是因为激光电源引起振镜抖动或啸叫,可将激光电源的高压线与其它的信号线尽可能的离开些,一般来说可将阻碍排除。如果阻碍仍然存在,调换激光电源。 如果是因为Q驱动器引起振镜抖动或啸叫,则应该检查Q驱动器与Q开关之间的连线是否短路,该信号线短路会导致此阻碍。如阻碍仍然存在,可调换Q驱动器。 振镜坏,调换振镜。 电脑操纵系统或电脑阻碍,重装系统或调换电脑。

51定时器和lcd12864做的实时时钟显示(附图)

#include #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit rw=P1^1; sbit e=P2^5; sbit psb=P1^2; sbit rst=P1^4; uchar hour,fen,miao,num; uchar code table[]="时间:"; uchar sbuf[]={0,0,0,0,0,0}; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void Timer0Init(void) //50??@11.0592MHz { TMOD |= 0x01; //??????? TL0 = 0x00; //??????

TH0 = 0x4C; //?????? EA=1; ET0=1; TR0=1; //???0???? } void Delay2ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 4; j = 146; do { while (--j); } while (--i); } void Delay100us() //@11.0592MHz { unsigned char i, j; i = 2; j = 109; do { while (--j); } while (--i);

void Delay50ms() //@11.0592MHz { unsigned char i, j, k; i = 3; j = 207; k = 28; do { do { while (--k); } while (--j); } while (--i); } void write_12864com(uchar com) { rs=0; rw=0; Delay100us(); P0=com; e=1; Delay100us(); e=0; Delay100us(); }

实时时钟实验报告

嵌入式系统开发实验报告 实验四:实时时钟实验 班级:应电112 姓名:张志可 学号: 110415151 指导教师:李静 实验日期: 2013年9月25日

实验四:实时时钟实验 一、实验目的 1. 了解实时时钟的硬件控制原理及设计方法。 2. 掌握 S3C2410X 处理器的 RTC 模块程序设计方法。 二、实验设备 硬件:Embest ARM 教学实验系统,ULINK USB-JTAG 仿真器套件,PC 机。 软件:MDK 集成开发环境,Windows 98/2000/NT/XP。 三、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的 RTC,还有大容量的存储器、温度传感器和 A/D 数据采集通道等,已成为集 RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如 I2C、SPI、MICROWIRE 和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C2410X 实时时钟(RTC)单元 S3C2410X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 四、实验内容 学习和掌握 Embest ARM 教学实验平台中 RTC 模块的使用,编写应用程序,修改时钟日期及时间的设置,以及使用 EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。

激光打标机常见故障及解决方法

激光打标机常见故障及解决方法 一、现象1:激光打标机无激光输出 1、检查激光谐振腔光路是否出现偏移?检查方法为,打开激光打标机光路铝型材盖子将激光打标机按正常方法启动,并将电源电流调整到12A左右,关掉Q驱动器电源,用白色倍频片在半反射镜片前面看是否有绿色的激光输出,如果有,表示激光谐振腔工作正常,如果没有绿色激光输出,请重新调整光路的全反射镜片和半反射镜片,直到用白色倍频片看到绿色激光输出,并将激光电源电流调小后,在小电流下绿色激光点调整到越亮越大越好。 2、检查激光打标控制卡上的PWM信号与Q驱动器上的信号连线是否断开?从而导致出光信号无法输出,正常接线方法有两种:一种为公司自制Q驱,激光打标软件的驱动方式为,打标控制卡上的DB15针插头的第5脚和Q驱动器上的DB9针插头的第4脚;打标控制卡上的DB15针插头的第7脚和Q驱动器上的DB9针插头的第5脚。另一种是桂林星辰的Q驱动器,连接方式为打标控制卡上的DB15针插头的第5脚和Q驱动器上的DB15针插头的第1脚;打标控制卡上的DB15针插头的第7脚和Q驱动器上的DB9针插头的第9脚。解决方法:更换信号线或者重新焊接好原来信号线。 3、检查激光打标控制卡是否损坏?如果安装的是桂林星辰的Q驱动器,检查两路信号。A.激光输出信号激光打标控制卡上激光输出信号为DB15针插头的第1脚连接到Q驱动器DB15针插头的14脚。正常情况下,激光输出信号电压是:打标时为高电平,即打标时为5V,不打标时为0V。如果控制信号电压不对,即为激光打标控制卡损坏。信号。连接方法见上一条,不打标时控制卡第5脚和第7脚之间电压为0V,打标时的电压在0—5V之间,改变脉冲宽度后打标电压会有变化,加大脉冲宽度电压会上升,反之会下降。如果改变脉冲宽度电压没有变化则激光打标控制卡坏。如果安装的是自制Q驱动器则只要检查PWM信号即可。解决方法为:更换全新激光打标控制卡 4 检查激光打标软件的驱动方式是否正确?正确的驱动方式为:(1)如果激光打标机Q驱动器为白色星辰数字式Q驱动器,那么选择的软件驱动方式为时激光打标机才能正常输出激光,(2)如果激光打标机Q驱动器为我们公司自己生产的软件内控式Q驱动器,那么选择的软件驱动方式为时激光打标机才能正常输出激光,如果是软件Q驱动方式选择不正确,此时激光打标机便不会有激光输出,解决方法为:在电脑的程序文件的菜单下找到MarkingMate System软件,然后点击UTILITY,再进入驱动管理员Drv-Manager选择正确的驱动方式 5、检查电脑操作系统或电脑是否有故障?检查方法为:(1)首先检查电脑的;我的电脑(右键)-属性-硬件-设备管理器看是否有找到激光打标PCI控制卡,如果有问号,表示激光打标控制软件的控制卡驱动程序未安装好,因此无法输出打标出光信号,解决方法为:重新安

RTC

RTC实时时钟 什么是RTC实时时钟 在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz 晶体和电阻电容等。 S3C2410实时时钟的基本特性 实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒,分,时,日期,星期,月和年。RTC 单元通过一个外部的32.768KHz晶振提供时钟。RTC具有定时报警的功能。RTC 控制器功能说明: ●时钟数据采用BCD 编码 ●能够对闰年的年月日进行自动处理 ●具有告警功能,当系统处于关机状态时,能产生告警中断; ●具有独立的电源输入 ●提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟

RTC实时时钟的结构框图 RTC模块构成 ●闰年产生器 这个模块可以根据BCDDATA,BCDMON,以及BCDYEAR的数据决定每个月的最后日期是28,29,30 还是31。一个8位的计数器只能显示两个BCD码,因此它不能判断00 年究竟是不是闰年。例如它不能够判断1900 年和2000 的差别。。为了解决这个问题,S3C2410内的RTC 模块中有一个固定的逻辑,用来支持2000 年为闰年。请注意虽然2000 年是闰年,但1900 年不是闰年。因此,S3C2410 中00 代表2000 年,而不是1900 年。 ●读/写寄存器 要求置高RTCON 寄存器的0 位来表示读和写RTC 模块中的寄存器。。为了显示秒,分,小时,日期,月和年,CPU 会从BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,和BCDYEAR 寄存器读取数据。但是由于多个寄存器的读取,可能产生1 秒钟的偏离。例如,如果用户读取寄存器BCDYEAR 到BCDMIN,假设结果为1959 年,12 月,31 日,23 点,59 分。在用户读取BCDSEC 寄存器时,但如果结果是0,那么很有可能年,月,日,时,分已经变成了1960 年1 月1 日0 时0 分了。解决的方法是,当读取到的BCDSEC 等于0 时,用户应该在读取一次BCDYEAR到BCDSEC 的值。 ●备用电池 RTC可被备用电池驱动,备用电池通过RTCVDD引脚向RTC提供电压。当系统掉电时,RTC与CPU 之间的接口被阻塞,备用电池仅仅驱动振荡电路以及BCD计数器,这样可减少能量损耗。

关于汽车振动的分析

关于汽车的振动的分析 汽车振动系统是由多个子系统组成的具有质量、弹簧和阻尼的复杂的振动系统。汽车振动源主要有:路面和非路面对悬架的作用、发动机运动件的不平衡旋转和往复运动、曲轴的变动气体负荷、气门组惯性力和弹性力、变速器啮合齿轮副的负荷作用、传动轴等速万向节的变动力矩等。 在汽车工程中,多数振动是连续扰动力,而其他一些则是汽车承受的冲击力和短时间的瞬态振动力。振动又可分为周期性的和随机性的,发动机旋转质量的不平衡转动是周期振动的典型例子,而随机振动主要是由路面不平引起的。所有质量--弹性系统都有自己的固有频率,如果作用于系统的干扰频率接近振动系统的固有频率,就会发生共振现象。因此即使自身具有抗干扰能力的系统,装配到汽车上时仍有可能产生振动问题,这就要求在设计阶段准确建立系统模型及运动方程,分析自由振动特性和受迫振动响应,研究控制振动的方法。 汽车振动按照频率范围可分为: 1、影响行驶平顺性的低频振动:它产生的主要振源由于路面不平度激励使得汽车非悬挂质量共振和发动机低频刚体振动,从而引起悬架上过大的振动和人体座椅系统的共振造成人体的不舒适,其敏感频率主要在1-8Hz(最新的研究表明:当考虑人体不同方向的响应时可到16Hz)。对于乘员其评价指标一般是:针对载货汽车的疲劳降低工效界限和针对乘用汽车的疲劳降低舒适界限,或直接采用人体加权加速度均方根值进行评价;对于货物其评价指标是:车箱典型部位的均方根加速度。由于该指标于人体生理主观反映密切相关,因此试验和评价往往采用测试和主观评价相结

合。 2、车身结构振动和低频噪声:大的车身结构振动,不仅引起自身结构的疲劳损坏,而且更是车内低频结构辐射噪声源。其频率主要分布在20—80Hz 的频带内。由两方面引起:(1)激励源;主要有:道路激励、动力传动系统尤其是动力不平衡和燃烧所产生的各阶激励、空气动力激励;(2)车身结构和主要激励源系统的结构动力特性匹配不合理引起的路径传递放大。当前对于低频结构振动和噪声分析研究的方法有:计算预测分析,(1)基于有限元方法通过建立结构动力学模型取得结构固有振动模态参数对结构动力学特性进行评价,通过试验载荷分析得到振动激励并结合结构动力学模型计算振动响应;(2)基于有限元和边界元的系统声学特性计算和声响应计算。试验分析:(1)各种结构振动和声学系统的导纳测量和模态分析;(2)基于实际运行响应的工作振型分析;(3)基于机械和声学导纳测量的声学寄予率分析; 3、各种操纵机构的振动:操纵机构的振动主要是因为其安装吊挂刚度偏低或自身结构动力特性不当或车身振动过大而产生,它不仅容易使驾驶者疲劳严重时可能使操纵失控。对于这些振动各企业都有相应得评价和限值规定。最为典型的是方向盘(线性)振动(转向管柱振动),其产生的主要原因是方向盘及管柱安装总成与车身振动或其它激励源发生共振;另一重要的振动现象是行驶过程中的方向盘旋转振动(即:方向盘及转向轮摆振)。其产生的原因是:行驶过程中转向轮的跳动与自身的转动而产生的陀螺效应引起转向轮的波动并被转向结构放大从而引起方向盘旋转振动。 4、空气声:车内空气声是由于隔声吸声措施不当从而使得动力传动

基于ds1302的51单片机简易实时时钟-1602显示-源程序

。 ==================主程序================= #include

。#include "ds1302.h" #include "LCD1602.h" void change(); uchar times[9]; uchar date[9]; main() {LCD_init();//LCD初始化 init_1302(time_1302); gotoxy(1,1); LCD_display("Time:"); gotoxy(1,2); LCD_display("Date:"); times[8]='\0';// date[8]='\0'; while(1) {get_1302(time_1302); change(); gotoxy(7,1); LCD_display(times); gotoxy(7,2); LCD_display(date);

} } /*=========================== 转换子程序 ===========================*/ void change() { // 时间的转换 times[0]=time_1302[2]/10+'0'; times[1]=time_1302[2]%10+'0'; times[2]=':'; times[3]=time_1302[1]/10+'0'; times[4]=time_1302[1]%10+'0'; times[5]=':'; times[6]=time_1302[0]/10+'0'; times[7]=time_1302[0]%10+'0'; // 日期的转换 date[0]=time_1302[6]/10+'0'; date[1]=time_1302[6]%10+'0'; date[2]='-';

激光打标机振镜方面常见的故障及解决方案

激光打标机振镜方面常见的故障及解决方案 对于专业的激光打标机售后维修人员来说,掌握机器每一个可能出现的题并且提出解决方案这是必不可少的,因为只有掌握原理那维护起来就井然有序了,那再难解决的问题都能分析找出思绪来,对故障有一个合理的解决。 1、振镜电机不自锁 先检查各连接线是否有断路或短路,连接是否正确,保险是否完好,确认 无误后,打开电源,观察振镜驱动板上的指示灯是否亮绿灯或黄灯。若不亮或 者亮红灯,则拔开驱动板电源线,用万用表测量其输入端各端子的电压是否为±24V。若电压正常,侧要再测试一下带上驱动板及机负载时,电压是否正常,如果都不正常,则打开控制盒,不带负载测试一下开关电源电压,如果电压不正常的话,刚开 关电源损坏。电源输入正常后,连好所有线后,上电, 电机一般会发出二声滴答音,若没有响声,再用手手轻推一下振镜片,稍有点力度,如果振镜 片没自锁的话,则驱动板坏,当然电压输出正常的情况下,驱动板灯不亮或者亮 红灯那就是振镜驱动板或者电机有问题,此时找一块确认为完好的驱动板,正 确连接后,打开电源,振镜电机还不自锁,则是振镜电机损坏,同理,找一个确认完好的振镜电机,接到不上电的驱动板上,打开电源,若不上电,振镜驱动板损坏,如此反复的接拔线,请务必在断电的情况下进行的。 2、振镜电机有自锁,但不够力度用一块确认完好的振镜驱动板和一个完好的振镜电机,分别接在待测试的驱动板和振镜头上,正常通电,用手轻轻转动振镜轴,若变“硬”,则正常;否则,可判定振镜驱动板和振镜电机损坏。 3、振镜电机不摆动检查打标卡是否有控制信号输出,(注意其信号为-5V到 +5V的直流电压信号)若有,则检查振镜信号连接线是否连接完好,确认连接无 误后,打标,若仍没有摆动,则检查信号线是否正负接反或者断线,否则,则可 断定驱动板损坏。 4、打标出现波浪线,打标头机有轻微的叫声,振镜驱动板发热量稍高(出现干扰)检查接地线是否正确接上(最好的接地方法是:X振镜信号地,Y振镜信号地, 屏蔽线,220V电源大地,及打标机壳要连通),若地线接上后仍有干扰, 则首先检查打标卡卡是否正常(检查方法是用一块确认完好的打标卡换上,

实时日历时钟显示系统的设计

微机原理及应用课程设计任务书 20 xx -20 xx 学年第 x 学期第 xx 周- xx 周 题目实时日历时钟显示系统的设计 内容及要求 内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 进度安排 课程设计内容时间分配 方案论证1天 分析、设计、调试、运行3天 检查、整理、写设计报告、小结1天 合计5天 学生姓名: xx 指导时间: xxxx 指导地点: xxxx 任务下达任务完成 考核方式 1.评阅√ 2.答辩√ 3.实际操作□ 4.其它□指导教师系(部)主任 注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。 2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

此次微机原理课程设计要求设计一个实时日历时钟显示系统。 本程序利用DOS中断2AH号功能调用取系统年月日,再逐个显示各数据,利用2CH号功能调用取系统时间,逐个显示各数据。用“时:分:秒”(都是两位)的形式连续显示系统时间,并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。 任务安排: 主程序: xx:主体程序和流程设计 xx:日历调用显示系统 xx:时间调用显示系统 子程序: xx:显示两位数字的子程序

一、课程名称 (2) 二、课程内容及要求 (2) 三、小组组成 (2) 四、设计思路 (3) 五、程序流程图及介绍 (4) 六、调试 (5) 七、总结 (7) 八、参考资料 (9) 附录 (9)

一、课程名称:实时日历时钟显示系统的设计 二、课程内容及要求 课程内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 三、小组组成: 成员: xx, xx, xx, xx 任务安排: 主程序: xx:主体程序和流程设计 xx:日历系统 xx:时间系统 子程序: xx:显示两位数字的子程序

stm32系统时钟配置问题

stm32系统时钟配置问题 系统从上电复位到72mz 配置好之前,提供时钟的是内如高速rc 振荡器提 供8MZ 的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来 完成的和保证的:RCC->CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;#elseRCC- >CFGR &= (uint32_t)0xF0FF0000;#endif RCC->CR &= (uint32_t)0xFEF6FFFF; RCC->CR &= (uint32_t)0xFFFBFFFF; RCC->CFGR &= (uint32_t)0xFF80FFFF; #ifdef STM32F10X_CLRCC->CR &= (uint32_t)0xEBFFFFFF; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)RCC->CIR = 0x009F0000; RCC->CFGR2 = 0x00000000;#elseRCC->CIR = 0x009F0000;#endif#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif#endif 接着void SystemInit (void)调用SetSysClock();函数,将系统时钟配置到 72m,将AHB,APB1,APB2 等外设之前的时钟都配置好,然后切换到72mz 下 运行。所以在使用哪个外设的时候,只需要使能相应的外设时钟就可以了 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器 1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但 是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。 另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。 系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。系统时钟可以选择为PLL输出、HSI、HSE。系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用: (1)送给AHB总线、内核、内存和DMA使用的HCLK时钟; (2)通过8分频后送给Cortex的系统定时器时钟; (3)直接送给Cortex的空闲运行时钟FCLK; (4)送给APB1分频器。APB1分频器可以选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一

激光打标机十四大故障及处理要领

激光打标机十四大故障 及处理要领 文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-

激光打标机十四大故障及处理要领 不发光 老式Q驱动器上ON、OFF、RUN三个档位选择错误,OFF为强制关断激光命令,ON为强制发光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。金橙子板卡打标时为高电平,即打标时为5V,不打标时为0V。 板卡与驱动器上的信号连线开路,调换或者重新焊接好。 光路没有调好,重新调解光路。 氪灯坏,调换氪灯。 电脑操纵系统或电脑阻碍,重装系统或调换电脑。 激光电源坏,调换激光电源。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关。 光弱 打标软件CW方法没有选中,光会很弱,选取CW方法。 Q驱动器上的M1、M2、M3档位拨错,正确的方法是选择M1。 焦距过错,重新调解焦距。 水温过高。 氪灯老化,调换氪灯。

全反或半反射镜片、聚焦镜片、振镜镜片、Q开关的镜片脏或擦花。擦洁净或调换。 腔体,全反射镜,半反射镜和扩束镜没有调好,重新调解。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。可将激光电源的电流恰卖调大,将倍频片放在半反射镜之前看有没有漏光。如果漏光,光会很弱,重新调解Q开关。 激光没有打在振镜中心,或者是振镜的镜片刮花。重调光路,或调换振镜。 连续发光 错误的开关机顺序均可能会导致连续出光。正确的开机顺序为:总电源=>电脑=>打标软件=>冷水机=>Q驱动器=>激光电源=>等激电源上的READY灯亮后=>按RUN键启动=>振镜电源开关。关机顺序与之相反。老式Q驱动器上ON、OFF、RUN档位开关拨错,ON为强制发光命令,OFF 为强制关断激光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。电脑或操纵系统问题。调换或重装系统。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关(这种情况较少,一般来说Q开关坏了,Q驱动器会报警)

RTC实时时钟

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P3^6; //时钟 sbit SDA=P3^4; //数据 sbit RST = P3^5;// DS1302复位 sbit LS138A=P2^2; sbit LS138B=P2^3; sbit LS138C=P2^4; bit ReadRTC_Flag;//定义读DS1302标志 unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00 unsigned char l_tmpdisplay[8]; code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管0-9 '-' '熄灭‘表 /******************************************************************/ /* 函数声明*/ /******************************************************************/ void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302 ( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0 /******************************************************************/ /* 主函数*/ /******************************************************************/ void main(void) { InitTIMER0(); //初始化定时器0 Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽

stm32f030时钟配置工具AN4055

May 2012Doc ID 022837 Rev 11/17 AN4055 Application note Clock configuration tool for STM32F0xx microcontrollers Introduction This application note presents the clock system configuration tool for the STM32F0xx microcontroller family. The purpose of this tool is to help the user configure the microcontroller clocks, taking into consideration product parameters such as power supply and Flash access mode. The configuration tool is implemented in the “STM32F0xx_Clock_Configuration_VX.Y .Z.xls” file which is supplied with the STM32F0xx Standard Peripherals Library and can be downloaded from https://www.wendangku.net/doc/7111477158.html, . This tool supports the following functionalities for the STM32F0xx: ● Configuration of the system clock, HCLK source and output frequency ● Configuration of the Flash latency (number of wait states depending on the HCLK frequency)● Setting of the PCLK1, PCLK2, TIMCLK (timer clocks) and I2SCLK frequencies ●Generation of a ready-to-use system_stm32f0xx.c file with all the above settings (STM32F0xx CMSIS Cortex-M0 Device Peripheral Access Layer System Source File)The STM32F0xx_Clock_Configuration_VX.Y .Z.xls is referred to as “clock tool” throughout this document. Before using the clock tool, it is essential to read the STM32F0xx microcontroller reference manual (RM0091). This application note is not a substitute for the reference manual.This tool supports only the STM32F0xx devices. For VX.Y .Z, please refer to the tool version, example V1.0.0 https://www.wendangku.net/doc/7111477158.html,

激光打标机十四大故障及处理要领

激光打标机十四大故障及处理要领 不发光 老式Q驱动器上ON、OFF、RUN三个档位选择错误,OFF为强制关断激光命令,ON为强制发光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。金橙子板卡打标时为高电平,即打标时为5V,不打标时为0V。 板卡与驱动器上的信号连线开路,调换或者重新焊接好。 光路没有调好,重新调解光路。 氪灯坏,调换氪灯。 电脑操纵系统或电脑阻碍,重装系统或调换电脑。 激光电源坏,调换激光电源。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关。 光弱 打标软件CW方法没有选中,光会很弱,选取CW方法。 Q驱动器上的M1、M2、M3档位拨错,正确的方法是选择M1。 焦距过错,重新调解焦距。 水温过高。 氪灯老化,调换氪灯。 全反或半反射镜片、聚焦镜片、振镜镜片、Q开关的镜片脏或擦花。擦洁净或调换。 腔体,全反射镜,半反射镜和扩束镜没有调好,重新调解。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。可将激光电源的电流恰卖调大,将倍频片放在半反射镜之前看有没有漏光。如果漏光,光会很弱,重新调解Q开关。 激光没有打在振镜中心,或者是振镜的镜片刮花。重调光路,或调换振镜。 连续发光 错误的开关机顺序均可能会导致连续出光。正确的开机顺序为:总电源=>电脑=>打标软件=>冷水机=>Q驱动器=>激光电源=>等激电源上的READY灯亮后=>按RUN键启动=>振镜电源开关。关机顺序与之相反。 老式Q驱动器上ON、OFF、RUN档位开关拨错,ON为强制发光命令,OFF为强制关断激光命令,正确的方法是选择RUN运行。 板卡坏,调换板卡。 Q开关没有调好,正常情况为打标时发光,不打标时Q开关要锁住激光。 电脑或操纵系统问题。调换或重装系统。 Q驱动器坏,调换Q驱动器。 Q开关坏,调换Q开关(这种情况较少,一般来说Q开关坏了,Q驱动器会报警)

相关文档