历史上的今天
返回首页

历史上的今天

今天是:2025年07月01日(星期二)

正在发生

2019年07月01日 | STM32开发 -- RTC详解

2019-07-01 来源:eefocus

一、RTC实时时钟特征与原理

查看STM32中文手册 16 实时时钟(RTC)(308页)


RTC (Real Time Clock):实时时钟

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

RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。

系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:

● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟

● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。


RTC特征

可编程的预分频系数:分频系数最高为220。

● 32位的可编程计数器,可用于较长时间段的测量。

● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟

频率的四分之一以上)。

● 可以选择以下三种RTC的时钟源:

─ HSE时钟除以128;

─ LSE振荡器时钟;

─ LSI振荡器时钟(详见6.2.8节RTC时钟)。

● 2个独立的复位类型:

─ APB1接口由系统复位;

─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。

● 3个专门的可屏蔽中断:

─ 闹钟中断,用来产生一个软件可编程的闹钟中断。

─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。

─ 溢出中断,指示内部可编程计数器溢出并回转为0的状态。


二、RTC由两部分组成

**APB1接口:**用来和APB1总线相连。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

**RTC核心:**由一组可编程计数器组成。分两个主要模块。

第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断。

第二个是32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。


这里写图片描述

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。


三、RTC时钟源

首先讲一下时钟源:


三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

● HSI振荡器时钟

● HSE振荡器时钟

● PLL时钟

这些设备有以下2种二级时钟源:

● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。

● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。


参看:STM32时钟系统

这里写图片描述

当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。 AHB和APB2域的最大频率是72MHz。 APB1域的最大允许频率是36MHz。 SDIO接口的时钟频率固定为HCLK/2。

RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。 ADC时钟由高速APB2时钟经2、 4、 6或8分频后获得。

定时器时钟频率分配由硬件按以下2种情况自动设置:


如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。

否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。

如上图,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

接下来我们一一看一下:


HSE时钟

这里写图片描述

**高速外部时钟信号(HSE)**由以下两种时钟源产生:

● HSE外部晶体/陶瓷谐振器

● HSE用户外部时钟

为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠

近振荡器引脚。负载电容值必须根据所选择的振荡器来调整。

这里写图片描述

外部时钟源(HSE旁路)

在这个模式里,必须提供外部时钟。它的频率最高可达25MHz。用户可通过设置在时钟控制寄存器中的HSEBYP和HSEON位来选择这一模式。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,同时保证OSC_OUT引脚悬空。见图9。

外部晶体/陶瓷谐振器(HSE晶体)

**4~16Mz外部振荡器可为系统提供更为精确的主时钟。**相关的硬件配置可参考图9,进一步信息可参考数据手册的电气特性部分。

在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’,时钟才被释放出来。如果在时钟中断寄存器RCC_CIR中允许产生中断,将会产生相应中断。

HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭。


HSI时钟

这里写图片描述

HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。

HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。

校准

制造工艺决定了不同芯片的RC振荡器频率会不同,这就是为什么每个芯片的HSI时钟频率在出厂前已经被ST校准到1%(25°C)的原因。系统复位时,工厂校准值被装载到时钟控制寄存器的HSICAL[7:0]位。

如果用户的应用基于不同的电压或环境温度,这将会影响RC振荡器的精度。可以通过时钟控制寄存器里的HSITRIM[4:0]位来调整HSI频率。

时钟控制寄存器中的HSIRDY位用来指示HSI RC振荡器是否稳定。在时钟启动过程中,直到这一位被硬件置’1’, HSI RC输出时钟才被释放。 HSI RC可由时钟控制寄存器中的HSION位来启动和关闭。

如果HSE晶体振荡器失效, HSI时钟会被作为备用时钟源。


PLL

这里写图片描述

内部PLL可以用来倍频HSI RC的输出时钟或HSE晶体输出时钟。

PLL的设置(选择HIS振荡器除2或HSE振荡器为PLL的输入时钟,和选择倍频因子)必须在其被激活前完成。一旦PLL被激活,这些参数就不能被改动。

如果PLL中断在时钟中断寄存器里被允许,当PLL准备就绪时,可产生中断申请。

如果需要在应用中使用USB接口, PLL必须被设置为输出48或72MHZ时钟,用于提供48MHz的USBCLK时钟。


LSE时钟

这里写图片描述

**LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。**它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。

LSE晶体通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。

在备份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶体振荡是否稳定。在启动阶段,直到这个位被硬件置’1’后, LSE时钟信号才被释放出来。如果在时钟中断寄存器里被允许,可产生中断申请。

外部时钟源(LSE旁路)

在这个模式里必须提供一个32.768kHz频率的外部时钟源。你可以通过设置在备份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位来选择这个模式。具有50%占空比的外部时钟信号(方波、正弦波或三角波)必须连到OSC32_IN引脚,同时保证OSC32_OUT引脚悬空,见图9。


LSI时钟

这里写图片描述

LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。 **LSI时钟频率大约40kHz(在30kHz和60kHz之间)。**进一步信息请参考数据手册中有关电气特性部分。

LSI RC可以通过控制/状态寄存器(RCC_CSR)里的LSION位来启动或关闭。

在控制/状态寄存器(RCC_CSR)里的LSIRDY位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为’1’后,此时钟才被释放。如果在时钟中断寄存器(RCC_CIR)里被允许,将产生LSI中断申请。

注意: 只有大容量和互联型产品可以进行LSI校准

LSI校准

可以通过校准内部低速振荡器LSI来补偿其频率偏移,从而获得精度可接受的RTC时间基数,以及独立看门狗(IWDG)的超时时间(当这些外设以LSI为时钟源)。

**校准可以通过使用TIM5的输入时钟(TIM5_CLK)测量LSI时钟频率实现。**测量以HSE的精度为保证,软件可以通过调整RTC的20位预分频器来获得精确的RTC时钟基数,以及通过计算得到精确的独立看门狗(IWDG)的超时时间。

LSI校准步骤如下:


打开TIM5,设置通道4为输入捕获模式;

设置AFIO_MAPR的TIM5_CH4_IREMAP位为’1’,在内部把LSI连接到TIM5的通道4;

通过TIM5的捕获/比较4事件或者中断来测量LSI时钟频率;

根据测量结果和期望的RTC时间基数和独立看门狗的超时时间,设置20位预分频器。

四、RTC时钟

**通 过 设 置 备 份 域 控 制 寄 存 器 (RCC_BDCR) 里 的 RTCSEL[1:0] 位 , RTCCLK 时钟源可以由HSE/128、LSE或LSI时钟提供。**除非备份域复位,此选择不能被改变。

LSE时钟在备份域里,但HSE和LSI时钟不是。因此:

● 如果LSE被选为RTC时钟:

─ 只要VBAT维持供电,尽管VDD供电被切断, RTC仍继续工作。

● 如果LSI被选为自动唤醒单元(AWU)时钟:

─ 如果VDD供电被切断, AWU状态不能被保证。有关LSI校准,详见6.2.5节LSI时钟。

● 如果HSE时钟128分频后作为RTC时钟:

─ 如果VDD供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。

─ 必须设置电源控制寄存器(见4.4.1节)的DPB位(取消后备区域的写保护)为’1’。


五、RTC寄存器

上面都是从STM32中文手册里摘取的。大概了解一下RTC和时钟。

不过讲的有点扯,里面有多好寄存器,不知道是干啥的。接下来重点看一下这些寄存器。


RTC控制寄存器高位(RTC_CRH)

这里写图片描述


RTC控制寄存器低位(RTC_CRL)

这里写图片描述

①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。

②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式

③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。


RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)

预分频装载寄存器用来保存RTC预分频器的周期计数值。它们受RTC_CR寄存器的RTOFF位保护,仅当RTOFF值为’1’时允许进行写操作。


这里写图片描述

RTC预分频器余数寄存器(RTC_DIVH / RTC_DIVL)

这里写图片描述

RTC计数器寄存器 (RTC_CNTH / RTC_CNTL)


这里写图片描述

RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)


这里写图片描述

配置RTC寄存器

必须设置RTC_CRL 寄 存 器 中 的CNF位 , 使RTC进入配置模式后 , 才能写 入RTC_PRL、RTC_CNT、 RTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。

配置过程:


查询RTOFF位,直到RTOFF的值变为’1’

置CNF值为1,进入配置模式

对一个或多个RTC寄存器进行写操作

清除CNF标志位,退出配置模式

查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。

仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期。

读RTC寄存器

RTC核完全独立于RTC APB1接口。

软件通过APB1接口访问RTC的预分频值、 计数器值和闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。 RTC标志也是如此的。

这意味着,如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。下述几种

情况下能够发生这种情形:

● 发生系统复位或电源复位

● 系统刚从待机模式唤醒(参见第4.3节: 低功耗模式)。

● 系统刚从停机模式唤醒(参见第4.3节: 低功耗模式)。

所有以上情况中, APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。

因此,若在读取RTC寄存器时, RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置’1’。

注: RTC的 APB1接口不受WFI和WFE等低功耗模式的影响


六、RTC相关库函数讲解

库函数所在文件:stm32f10x_rtc.c / stm32f10x_rtc.h


RTC时钟源和时钟操作函数:

 void RCC_RTCCLKConfig(uint32_t  CLKSource);//时钟源选择

 void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能


RTC配置函数(预分频,计数值:

void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL

void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL

void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL


RTC中断设置函数:

 void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH


RTC允许配置和退出配置函数:

void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF

void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF


同步函数:

void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF

void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF


相关状态位获取清除函数:

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);

void RTC_ClearFlag(uint16_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint16_t RTC_IT);

void RTC_ClearITPendingBit(uint16_t RTC_IT);


其他相关函数(BKP等)

PWR_BackupAccessCmd();//BKP后备区域访问使能

RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟

RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源

PWR_BackupAccessCmd();//BKP后备区域访问使能

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP


七、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();/// 允许配置

1

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


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_Init

//实时时钟配置

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

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

//返回 0:正常

//其他:错误代码

u8 RTC_Init(void)

{

u8 temp=0;

//检查是不是第一次配置时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR |

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

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

if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中

//读出数据:读出了与写入的指定数据不相乎

{

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)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(2015,1,14,17,42,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_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 月份增加一天的秒钟数

推荐阅读

史海拾趣

American Technical Ceramics (ATC)公司的发展小趣事

安路科技(Anlogic)的创立可以追溯到XXXX年,由一群具有深厚技术背景的工程师共同创立。起初,公司规模虽小,但怀揣着在国产FPGA(现场可编程门阵列)领域实现技术突破的梦想。早期,安路科技面临着资金短缺、市场竞争激烈等挑战,但团队凭借着对技术的执着和不懈的努力,逐步研发出了具有竞争力的FPGA产品,并在市场上获得了一定的认可。

西安航天民芯公司的发展小趣事

西安航天民芯科技有限公司成立于XXXX年,创立初期,公司便明确了自己的发展方向——专注于集成电路设计与开发。在创始团队的带领下,公司逐步积累起深厚的技术底蕴,为后续的快速发展奠定了坚实的基础。通过不断地技术研究和创新,西安航天民芯逐渐在行业内崭露头角。

AEL [AEL Crystals Ltd]公司的发展小趣事

随着业务的不断发展,AEL Crystals意识到全球化战略的重要性。公司开始在全球范围内寻找合适的生产基地,并在英国、日本、台湾、韩国等地区建立了生产基地网络。这一战略布局使得AEL Crystals能够更好地满足全球客户的需求,同时也降低了供应中断的风险。

振华(CEC)公司的发展小趣事

为了进一步提升企业的竞争力和市场份额,振华积极实施国际化战略。公司加强与国外企业的合作与交流,积极参与国际市场竞争,通过引进外资、设立海外研发机构等方式,不断拓展海外市场。同时,振华还注重提升产品的国际竞争力,加强与国际标准的对接和认证工作,确保产品能够满足不同国家和地区的市场需求。

對餘科技(DIOFIT)公司的发展小趣事

DIOFIT公司一直秉持着品质至上的生产理念,注重产品质量和用户体验。他们严格控制原材料采购和生产流程,确保每一款产品都符合高标准的质量要求。同时,DIOFIT公司还建立了完善的售后服务体系,及时解决用户在使用过程中遇到的问题,赢得了用户的信赖和好评。

ERNI公司的发展小趣事

进入21世纪,ERNI继续深耕连接器技术。他们成功研发出世界上第一个DIN连接器,并随后发展了各种电路板连接器和输入/输出连接器。其中,2mm连接器成为ERNI的明星产品之一。凭借其优越的性能和可靠的品质,ERNI的2mm连接器在国内军工领域得到广泛应用,并赢得了广大客户的信赖和好评。

问答坊 | AI 解惑

2010年黑龙江省电子大赛讨论

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 2010年黑龙江省电子大赛即将开始,希望开出一个能够大家讨论的地方来~~  …

查看全部问答>

一个单片机控制多路LED问题,急。。。。。。。。

单片机来控制四路LED,每路有102个LED(三个LED和一个120的电阻串联为一组,组和组之间是并联) 需要单片机来控制各路呈现各种规律亮或者灭(单路同时亮或者同时灭),采用的开关电源是5V4A,12V1A的,不知道怎么接电路,请指教,在线等,急。。。 ...…

查看全部问答>

pda上防止软件破解, 测试结果如下

unsigned char* GetStroageID(LPCTSTR szDisk) { //HANDLE hDisk = CreateFile(_T(\"DSK1:\"), GENERIC_READ, FILE_SHARE_READ ? FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); HANDLE hDisk = CreateFile(szDisk, GENERIC_READ, FILE_S ...…

查看全部问答>

硬件菜鸟-2410板子,上电后不显示DNW信息

我按照下面的步骤, 1. 连接好串口线和电源线(未上电) 2. 启动DNW并且Connect,显示串口已经连接 3. 启动板子 问题:为什么我启动了板子以后不显示DNW的信息呢?而是直接启动了WinCE。我重新烧写了BIOS,但是还是不行。 请大虾们指教。…

查看全部问答>

问一个串口问题

两机之间通过串口通讯( 均为DOS系统),其中发送数据长度为16,有首尾两标志位,首为\'s\',尾为\'e\',中间为有效数据为,发送方每0.3秒发送一组数据,接收端通过中断方式接收,并且当接收到一组完整的数据时才进行相应的数据处理,请问各位大虾, ...…

查看全部问答>

LED背光技术十大领先优势

着液晶显示器市场的拉动,LED背光源产业呈现出一派繁荣景象。在显示技术水平上不断进步,巨大的LED市场注定将其发展成为一个庞大的产业。   经过多年的发展,LED显示屏行业中逐渐迈向成熟,在应用领域上也不断的拓宽。从近年统计数据来看,在国 ...…

查看全部问答>

在用STM8,马上发现现实的困难

用自己设计的图纸,发现封装太小,自己做板难度不小.外发打样,一个来回至少14天,周期太长. iar至今没找到和谐版,先用免费的那个.现在还在仿真环境里面,还没有绕出来.也不知道是开发板附带的st-link问题还是哪里有问题.去官网找资料,再次迷失在 ...…

查看全部问答>

MSP430的ADC参考电压

MSP430的ADC参考电压 用外部参考电压最大能用多少伏   ???  我想对5伏的电压采样 可以直接用5伏的外部参考电压吗 ?// 请各位帮帮忙  谢谢了!!!…

查看全部问答>

Multisim11.0中没有的器件怎么办添加呢?

我想在里面添加TL494进行仿真   可我没在库里面找到呀   那位高手帮个忙   感激不尽啊   尽量详细点哈 谢谢!!…

查看全部问答>

【TI原创】基于LM3S8962的网络收音机(四) --- VS1053(2)

测试一下使用VS1053播放MP3的效果   1.  1.   使用自带的SD_Card例程,把MP3文件写在sd卡上 2.2.  增加vs1053驱动 3.3.   编写相关的应用程序   系统的理解效果图如下:     测试的 ...…

查看全部问答>