历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2019年09月20日 | 第43章 RTC—实时时钟—零死角玩转STM32-F429系列

2019-09-20 来源:eefocus

43.1 RTC简介

RTC—real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器,可直接输出时分秒,星期、月、日、年。比起F103系列的RTC只能输出秒中断,剩下的其他时间需要软件来实现,429的RTC可谓是脱胎换骨,让我们在软件编程时大大降低了难度。RTC功能框图分析


43.2 RTC功能框图解析

1.    时钟源

RTC 时钟源—RTCCLK 可以从LSE、LSI和HSE_RTC这三者中得到。其中使用最多的是LSE,LSE由一个外部的32.768KHZ(6PF负载)的晶振提供,精度高,稳定,RTC首选。LSI是芯片内部的30KHZ晶体,精度较低,会有温漂,一般不建议使用。HSE_RTC由HSE分频得到,最高是4M,使用的也较少。


2.    预分频器

预分频器PRER由7位的异步预分频器APRE和15位的同步预分频器SPRE组成。异步预分频器时钟CK_APRE用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟CK_SPRE用于更新日历。异步预分频器时钟fCK_APRE=fRTC_CLK/(PREDIV_A+1),同步预分频器时钟fCK_SPRE=fRTC_CLK/(PREDIV_S+1),)。使用两个预分频器时,推荐将异步预分频器配置为较高的值,以最大程度降低功耗。一般我们会使用LSE生成1HZ的同步预分频器时钟


通常的情况下,我们会选择LSE作为RTC的时钟源,即fRTCCLK=fLSE=32.768KHZ。然后经过预分频器PRER分频生成1HZ的时钟用于更新日历。使用两个预分频器分频的时候,为了最大程度的降低功耗,我们一般把同步预分频器设置成较大的值,为了生成1HZ的同步预分频器时钟CK_SPRE,最常用的配置是PREDIV_A=127,PREDIV_S=255。计算公式为:fCK_SPRE=fRTCCLK/{(PREDIV_A+1)*(PREDIV_S+1)}= 32.768/{(127+1)*(255+1)}=1HZ。


3.    实时时钟和日历

我们知道,实时时钟一般是这样表示的:时/分/秒/亚秒,其中时分秒可直接从RTC 时间寄存器 (RTC_TR)中读取,有关时间寄存器的说明具体见错误!未找到引用源。和错误!未找到引用源。。

图 431RTC 时间寄存器(RTC_TR)


表格 431 时间寄存器位功能说明

image.png?imageView2/2/w/550

亚秒由RTC 亚秒寄存器 (RTC_SSR)的值计算得到,公式为:亚秒值 = ( PREDIV_S – SS[15:0] ) / ( PREDIV_S + 1 ) ,SS[15:0]是同步预分频器计数器的值,PREDIV_S是同步预分频器的值。


图 432RTC亚秒寄存器(RTC_SSR)


日期包含的年月日可直接从RTC 日期寄存器 (RTC_DR)中读取。


图 433 RTC日期寄存器(RTC_DR)


表格 432 RTC日期寄存器位功能说明

image.png?imageView2/2/w/550

当应用程序读取日历寄存器时,默认是读取影子寄存器的内容,每隔两个 RTCCLK 周期,便将当前日历值复制到影子寄存器。我们也可以通过将 RTC_CR 寄存器的BYPSHAD 控制位置 1 来直接访问日历寄存器,这样可避免等待同步的持续时间。


RTC_CLK经过预分频器后,有一个512HZ的CK_APRE和1个1HZ的CK_SPRE,这两个时钟可以成为校准的时钟输出RTC_CALIB,RTC_CALIB最终要输出则需映射到RTC_AF1引脚,即PC13输出,用来对外部提供时钟。


4.    闹钟

RTC有两个闹钟,闹钟A和闹钟B,,当RTC运行的时间跟预设的闹钟时间相同的时候,相应的标志位ALRAF(在RTC_ISR寄存器中)和ALRBF会置1。利用这个闹钟我们可以做一些备忘提醒功能。


如果使能了闹钟输出(由RTC_CR的OSEL[0:1]位控制),则ALRAF和ALRBF会连接到闹钟输出引脚RTC_ALARM,RTC_ALARM最终连接到RTC的外部引脚RTC_AF1(即PC13),输出的极性由RTC_CR 寄存器的 POL 位配置,可以是高电平或者低电平。


5.    时间戳

时间戳即时间点的意思,就是某一个时刻的时间。时间戳复用功能 (RTC_TS) 可映射到 RTC_AF1 或 RTC_AF2,当发生外部的入侵事件时,即发生时间戳事件时, RTC_ISR 寄存器中的时间戳标志位 (TSF) 将置 1,日历会保存到时间戳寄存器( RTC_TSSSR、 RTC_TSTR 和 RTC_TSDR)中。时间戳往往用来记录危及时刻的时间,以供事后排查问题时查询。


6.    入侵检测

RTC自带两个入侵检测引脚RTC_AF1(PC13)和RTC_AF2(PI8),这两个输入既可配置为边沿检测,也可配置为带过滤的电平检测。当发生入侵检测时,备份寄存器将被复位。备份寄存器 (RTC_BKPxR) 包括20 个 32 位寄存器,用于存储 80 字节的用户应用数据。这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。


43.3 RTC初始化结构体讲解

标准库函数对每个外设都建立了一个初始化结构体,比如RTC_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如RTC_Init()调用,这些配置好的参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。


初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如。初始化结构体定义在stm32f4xx_rtc.h头文件中,初始化库函数定义在stm32f4xx_rtc.c文件中,编程时我们可以结合这两个文件内注释使用。


RTC初始化结构体用来设置RTC小时的格式和RTC_CLK的分频系数。


代码 431 RTC初始化结构体


1 typedef struct {


2 uint32_t RTC_HourFormat; /* 指定RTC小时格式*/


3


4 uint32_t RTC_AsynchPrediv; /* 配置RTC_CLK的异步分频因子 */


5


6 uint32_t RTC_SynchPrediv; /* 配置RTC_CLK的同步分频因子 */


7 } RTC_InitTypeDef;


1)    RTC_HourFormat:小时格式设置,有RTC_HourFormat_24和RTC_HourFormat_12两种格式,一般我们选择使用24小时制,具体由RTC_CR寄存器的FMT位配置。


2)    RTC_AsynchPrediv:RTC_CLK异步分频因子设置,7位有效,具体由RTC 预分频器寄存器RTC_PRER的PREDIV_A[6:0]位配置。


3)    RTC_SynchPrediv:RTC_CLK同步分频因子设置,15位有效,具体由RTC 预分频器寄存器RTC_PRER的PREDIV_S[14:0]位配置。


43.4 RTC时间结构体讲解

RTC时间初始化结构体用来设置初始时间,配置的是RTC时间寄存器RTC_TR。


代码 432 RTC时间结构体


1 typedef struct {


2 uint8_t RTC_Hours; /* 小时设置 */


3


4 uint8_t RTC_Minutes; /* 分钟设置 */


5


6 uint8_t RTC_Seconds; /* 秒设置 */


7


8 uint8_t RTC_H12; /* AM/PM 符号设置 */


9 } RTC_TimeTypeDef;


1)    RTC_Hours:小时设置,12小时制式时,取值范围为0~11,24小时制式时,取值范围为0~23。


2)    RTC_Minutes:分钟设置,取值范围为0~59。


3)    RTC_Seconds:秒钟设置,取值范围为0~59。


4)    RTC_H12:AM/PM设置,可取值RTC_H12_AM和RTC_H12_PM,RTC_H12_AM时则是24小时制,RTC_H12_PM则是12小时制。


43.5 RTC日期结构体讲解

RTC日期初始化结构体用来设置初始日期,配置的是RTC日期寄存器RTC_DR。


代码 433 RTC 日期结构体


1 typedef struct {


2 uint8_t RTC_WeekDay; /* 星期几设置 */


3


4 uint8_t RTC_Month; /* 月份设置 */


5


6 uint8_t RTC_Date; /* 日期设置 */


7


8 uint8_t RTC_Year; /* 年份设置 */


9 } RTC_DateTypeDef;


1)    RTC_WeekDay:星期几设置,取值范围为1~7,对应星期一~星期日。


2)    RTC_Month:月份设置,取值范围为1~12。


3)    RTC_Date:日期设置,取值范围为1~31。


4)    RTC_Year:年份设置,取值范围为0~99。


43.6 RTC闹钟结构体讲解

RTC闹钟结构体主要用来设置闹钟时间,设置的格式为[星期/日期]-[时]-[分]-[秒],共四个字段,每个字段都可以设置为有效或者无效,即可MASK。如果MASK掉[星期/日期]字段,则每天闹钟都会响。


代码 434 RTC闹钟结构体


1 typedef struct {


2 RTC_TimeTypeDef RTC_AlarmTime; /* 设定RTC时间寄存器的值:时/分/秒 */


3


4 uint32_t RTC_AlarmMask; /* RTC 闹钟掩码字段选择 */


5


6 uint32_t RTC_AlarmDateWeekDaySel; /*闹钟的日期/星期选择 */


7


8 uint8_t RTC_AlarmDateWeekDay; /* 指定闹钟的日期/星期


9 * 如果日期有效,则取值范围为1~31


10 * 如果星期有效,则取值为1~7


11 */


12    } RTC_AlarmTypeDef;


1)    RTC_AlarmTime:闹钟时间设置,配置的是RTC时间初始化结构体,主要配置小时的制式,有12小时或者是24小时,配套具体的时、分、秒。


2)    RTC_AlarmMask:闹钟掩码字段选择,即选择闹钟时间哪些字段无效,取值 可为:RTC_AlarmMask_None(全部有效)、RTC_AlarmMask_DateWeekDay(日期或者星期无效)、RTC_AlarmMask_Hours(小时无效)、RTC_AlarmMask_Minutes(分钟无效)、RTC_AlarmMask_Seconds(秒钟无效)、RTC_AlarmMask_All(全部无效)。比如我们选择RTC_AlarmMask_DateWeekDay,那么就是当RTC的时间的小时等于闹钟时间小时字段时,每天的这个小时都会产生闹钟中断。


3)    RTC_AlarmDateWeekDaySel:闹钟日期或者星期选择,可选择RTC_AlarmDateWeekDaySel_WeekDay或者RTC_AlarmDateWeekDaySel_Date。要想这个配置有效,则RTC_AlarmMask不能配置为RTC_AlarmMask_DateWeekDay,否则会被MASK掉。


4)    RTC_AlarmDateWeekDay:具体的日期或者星期几,当RTC_AlarmDateWeekDaySel设置成RTC_AlarmDateWeekDaySel_WeekDay时,取值为1~7,对应星期一~星期日,当设置成RTC_AlarmMask_DateWeekDay时,取值为1~31。


43.7 RTC—日历实验

利用RTC的日历功能制作一个日历,显示格式为:年-月-日-星期,时-分-秒。


43.7.1 硬件设计

该实验用到了片内外设RTC,为了确保在VDD断电的情况下时间可以保存且继续运行,VBAT引脚外接了一个CR1220电池座,用来放CR1220电池给RTC供电。


图 434 RTC 外接CR1220电池座子


43.7.2 软件设计

1.    编程要点

1)    选择RTC_CLK的时钟源;


2)    配置RTC_CLK的分频系数,包括异步和同步两个;


3)    设置初始时间,包括日期;


4)    获取时间和日期,并显示;


2.    代码分析

这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。我们创建了两个文件:bsp_rtc.c和bsp_rtc.h文件用来存RTC驱动程序及相关宏定义,中断服务函数则放在stm32f4xx_it.h文件中。


宏定义

代码 435 宏定义


1 // 时钟源宏定义


2 #define RTC_CLOCK_SOURCE_LSE


3 //#define RTC_CLOCK_SOURCE_LSI


4


5 // 异步分频因子


6 #define ASYHCHPREDIV 0X7F


7 // 同步分频因子


8 #define SYHCHPREDIV 0XFF


9


10


11


12 // 时间宏定义


13 #define RTC_H12_AMorPM RTC_H12_AM


14 #define HOURS 1 // 0~23


15 #define MINUTES 1 // 0~59


16 #define SECONDS 1 // 0~59


17


18 // 日期宏定义


19 #define WEEKDAY 1 // 1~7


20 #define DATE 1 // 1~31


21 #define MONTH 1 // 1~12


22 #define YEAR 1 // 0~99


23


24 // 时间格式宏定义


25 #define RTC_Format_BINorBCD RTC_Format_BIN


26


27 // 备份域寄存器宏定义


28 #define RTC_BKP_DRX RTC_BKP_DR0


29 // 写入到备份寄存器的数据宏定义


30 #define RTC_BKP_DATA 0X32F2


为了方便程序移植,我们把移植时需要修改的代码部分都通过宏定义来实现。具体的配合注释看代码即可。


RTC时钟配置函数

代码 436 RTC配置函数


1 /**


2 * @brief RTC配置:选择RTC时钟源,设置RTC_CLK的分频系数


3 * @param 无


4 * @retval 无


5 */


6 void RTC_CLK_Config(void)


7 {


8 RTC_InitTypeDef RTC_InitStructure;


9


10 /*使能 PWR 时钟*/


11 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


12 /* PWR_CR:DBF置1,使能RTC、RTC备份寄存器和备份SRAM的访问 */


13 PWR_BackupAccessCmd(ENABLE);


14


15 #if defined (RTC_CLOCK_SOURCE_LSI)


16 /* 使用LSI作为RTC时钟源会有误差


17 * 默认选择LSE作为RTC的时钟源


18 */


19 /* 使能LSI */


20 RCC_LSICmd(ENABLE);


21 /* 等待LSI稳定 */


22 while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {


23 }


24 /* 选择LSI做为RTC的时钟源 */


25 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);


26


27 #elif defined (RTC_CLOCK_SOURCE_LSE)


28


29 /* 使能LSE */


30 RCC_LSEConfig(RCC_LSE_ON);


31 /* 等待LSE稳定 */


32 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {


33 }


34 /* 选择LSE做为RTC的时钟源 */


35 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);


36


37 #endif /* RTC_CLOCK_SOURCE_LSI */


38


39 /* 使能RTC时钟 */


40 RCC_RTCCLKCmd(ENABLE);


41


42 /* 等待 RTC APB 寄存器同步 */


43 RTC_WaitForSynchro();


44


45 /*=====================初始化同步/异步预分频器的值======================*/


46 /* 驱动日历的时钟ck_spare = LSE/[(255+1)*(127+1)] = 1HZ */


47


48 /* 设置异步预分频器的值*/


49 RTC_InitStructure.RTC_AsynchPrediv = ASYNCHPREDIV;


50 /* 设置同步预分频器的值 */


51 RTC_InitStructure.RTC_SynchPrediv = SYNCHPREDIV;


52 RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;


53 /* 用RTC_InitStructure的内容初始化RTC寄存器 */


54 if (RTC_Init(&RTC_InitStructure) == ERROR) {


55 printf("nr RTC 时钟初始化失败 rn");


56 }


57 }


RTC配置函数主要实现两个功能,一是选择RTC_CLK的时钟源,根据宏定义来决定使用LSE还是LSI作为RTC_CLK的时钟源,这里我们选择LSE;二是设置RTC_CLK的预分频系数,包括异步和同步两个,这里设置异步分频因子为ASYNCHPREDIV(127),同步分频因子为ASYNCHPREDIV(255),则产生的最终驱动日历的时钟CK_SPRE=32.768/(127+1)*(255+1)=1HZ,则每秒更新一次。


RTC时间初始化函数

代码 437 RTC时间和日期设置函数


1 /**


2 * @brief 设置时间和日期


3 * @param 无


4 * @retval 无


5 */


6 void RTC_TimeAndDate_Set(void)


7 {


8 RTC_TimeTypeDef RTC_TimeStructure;


9 RTC_DateTypeDef RTC_DateStructure;


10


11 // 初始化时间


12 RTC_TimeStructure.RTC_H12 = RTC_H12_AMorPM;


13 RTC_TimeStructure.RTC_Hours = HOURS;


14 RTC_TimeStructure.RTC_Minutes = MINUTES;


15 RTC_TimeStructure.RTC_Seconds = SECONDS;


16 RTC_SetTime(RTC_Format_BINorBCD, &RTC_TimeStructure);


17 RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);


18


19 // 初始化日期


20 RTC_DateStructure.RTC_WeekDay = WEEKDAY;


21 RTC_DateStructure.RTC_Date = DATE;


22 RTC_DateStructure.RTC_Month = MONTH;


23 RTC_DateStructure.RTC_Year = YEAR;


24 RTC_SetDate(RTC_Format_BINorBCD, &RTC_DateStructure);


25 RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);


26 }


RTC时间和日期设置函数主要是设置时间和日期这两个结构体,然后调相应的RTC_SetTime和RTC_SetDate函数把初始化好的时间写到相应的寄存器,每当写完之后都会在备份寄存器里面写入一个数,以作标记,为的是程序开始运行的时候检测RTC的时间是否已经配置过。


具体的时间、日期、备份寄存器和写入备份寄存器的值都在头文件的宏定义里面,要修改这些值只需修改头文件的宏定义即可。


RTC时间显示函数

代码 438 RTC时间显示函数


1 /**


2 * @brief 显示时间和日期


3 * @param 无


4 * @retval 无


5 */


6 void RTC_TimeAndDate_Show(void)


7 {


8 uint8_t Rtctmp=0;


9 char LCDTemp[100];


10 RTC_TimeTypeDef RTC_TimeStructure;


11 RTC_DateTypeDef RTC_DateStructure;


12


13


14 while (1) {


15 // 获取日历


16 RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);


17 RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);


18


19 // 每秒打印一次


20 if (Rtctmp != RTC_TimeStructure.RTC_Seconds) {


21


22 // 打印日期


23 printf("The Date : Y:20%0.2d - M:%0.2d - D:%0.2d - W:%0.2drn",


24 RTC_DateStructure.RTC_Year,


25 RTC_DateStructure.RTC_Month,


26 RTC_DateStructure.RTC_Date,


27 RTC_DateStructure.RTC_WeekDay);


28


29 //液晶显示日期


30 //先把要显示的数据用sprintf函数转换为字符串,然后才能用液晶显示函数显示


31 sprintf(LCDTemp,"The Date : Y:20%0.2d - M:%0.2d - D:%0.2d - W:%0.2d",


32 RTC_DateStructure.RTC_Year,


33 RTC_DateStructure.RTC_Month,


34 RTC_DateStructure.RTC_Date,


35 RTC_DateStructure.RTC_WeekDay);


36


37 LCD_DisplayStringLineEx(10,50,48,48,(uint8_t *)LCDTemp,0);


38


39 // 打印时间


40 printf("The Time : %0.2d:%0.2d:%0.2d rnrn",


41 RTC_TimeStructure.RTC_Hours,


42 RTC_TimeStructure.RTC_Minutes,


43 RTC_TimeStructure.RTC_Seconds);


44


45 //液晶显示时间


46 sprintf(LCDTemp,"The Time : %0.2d:%0.2d:%0.2d",


47 RTC_TimeStructure.RTC_Hours,


48 RTC_TimeStructure.RTC_Minutes,

推荐阅读

史海拾趣

Fluke公司的发展小趣事

福禄克(Fluke)公司在电子行业中的发展历程充满了创新与突破,以下是五个与福禄克公司发展相关的故事:

1. 创立与初期发展

1948年,John Fluke先生在美国康涅狄格州的家中地下室创立了福禄克公司,并亲自设计了公司的第一款产品——VAW Meter(伏特、安培、瓦数表)。这一创举标志着福禄克在电子测试测量领域的初步探索与尝试。随着产品的不断推出和市场认可度的提升,福禄克逐渐在电子行业中站稳了脚跟。

2. 技术创新与市场拓展

多年来,福禄克公司一直致力于技术创新和产品升级。例如,福禄克推出的手持式电流表、接地阻抗测量仪表等产品,凭借其高精度和可靠性,在电力、通信、工业控制等多个领域得到了广泛应用。同时,福禄克还不断拓展其销售和服务网络,覆盖全球多个国家和地区,为全球客户提供优质的测试测量解决方案。

3. 新能源汽车领域的涉足

随着新能源汽车产业的快速发展,福禄克公司也积极涉足这一领域。新能源汽车中的锂电池、光纤等关键部件需要在使用过程中进行连续的温度监测。福禄克凭借其可靠的耐用性,为多家新能源汽车企业提供了安全可靠的测试测量产品及解决方案。这一举措不仅拓展了福禄克的市场领域,也进一步巩固了其在电子测试测量行业的领先地位。

4. 应对国际计量系统变革

当前国际计量系统正在经历历史性变革,福禄克公司密切关注这一世界热议话题。作为全球知名的电子测试仪器公司,福禄克已做好准备随时对应调整,以应对计量单位量子化等挑战。福禄克的这一举措体现了其作为行业领导者的前瞻性和应变能力。

5. 智能化与网络化发展

近年来,福禄克公司不断推动产品的智能化和网络化发展。例如,福禄克推出的在线式红外热像仪、带有Fieldsense技术的钳表等产品,不仅提高了测试测量的精度和效率,还实现了数据的实时传输和分析。这些创新产品满足了客户对智能化、网络化测试测量解决方案的需求,进一步推动了福禄克在电子行业中的发展。

以上五个故事展示了福禄克公司在电子行业中的发展历程和成就。从创立初期的艰难探索到如今的行业领导者地位,福禄克始终秉持着创新、质量和服务的理念不断前行。

蓝箭(BLUE ROCKET)公司的发展小趣事

为了提高产品质量和客户满意度,蓝箭电子从1997年开始通过ISO9001质量管理体系认证。随后,公司还通过了ISO14001环境管理体系认证、ISO/TS16949汽车行业质量管理体系标准认证以及OHSAS18001认证。这些认证不仅提升了公司的管理水平,也增强了客户对公司的信任。

Everspin公司的发展小趣事

在XXXX年,Everspin的股票开始在纳斯达克全球市场交易,股票代码为MRAM。这一上市动作不仅为Everspin提供了更多的资金支持,也进一步提升了其在行业中的知名度和影响力。此外,兆易创新旗下的GigaDevice半导体(香港)有限公司还斥资500万美元购买了Everspin约5%的股份,显示出市场对Everspin技术和发展前景的认可。

BROTHER公司的发展小趣事

在电子行业的发展过程中,技术创新始终是BROTHER公司的重要驱动力。公司注重研发投入,拥有一支高素质的研发团队,不断推出具有创新性和竞争力的新产品。同时,BROTHER还积极与高校、科研机构等合作,开展产学研合作,推动技术创新和产业升级。通过技术创新,BROTHER不仅提升了产品质量和性能,还降低了生产成本,提高了市场竞争力。

泰科天润(GPT)公司的发展小趣事

在电子行业的发展过程中,技术创新始终是BROTHER公司的重要驱动力。公司注重研发投入,拥有一支高素质的研发团队,不断推出具有创新性和竞争力的新产品。同时,BROTHER还积极与高校、科研机构等合作,开展产学研合作,推动技术创新和产业升级。通过技术创新,BROTHER不仅提升了产品质量和性能,还降低了生产成本,提高了市场竞争力。

DAICO公司的发展小趣事

随着业务的不断发展,DAICO公司开始拓展全球市场。公司在全球范围内设立了多个办事处和生产基地,以便更好地服务客户。同时,DAICO还积极寻求与全球合作伙伴的合作共赢,共同推动电子行业的发展。通过与合作伙伴的紧密合作,DAICO在技术研发、市场开拓等方面取得了更加显著的成果。

问答坊 | AI 解惑

直流电机PWM调速,C51、Proteus环境

分享一个利用AT89C51产生PWM信号控制直流电机调速的模拟模型。 软件环境:Keil C51,Proteus 已有文件:Keil C51工程文件,C51源文件,Proteus模型。已经产生的hex文件…

查看全部问答>

传感器产业发展的新动向

传感器技术是现代科技的前沿技术,传感器产业也是国内外公认的具有发展前途的高技术产业,它以其技术含量高、经济效益好、渗透能力强、市场前景广等特点为世人瞩目。     我国自动化方面的专家呼吁:目前复杂系统越来越复杂,自动化已经 ...…

查看全部问答>

【Labview】labview学习网站有哪些

大家学习labview都在哪些网站和论坛上混啊?     本人常去的有两个,www.ni.com这是NI的网站,学习labview怎么能不上呢!     其次是www.gsdzone.net 这是我常去的Labview论坛,里面有资深NI工程师潜伏哦!…

查看全部问答>

WHY???

在下面代码中发现产生INTSRC_CAM中断后若BIT_SUB_CAM_P和BIT_SUB_CAM_C都没触发 那就执行 “//有疑问的代码”标记的代码 即屏蔽掉了Camera所有中断并返回了SYSINTR_NOP 这样相应的IST得不到执行也就不会调用InterruptDone来打开屏蔽的中断那以后 ...…

查看全部问答>

PB定制wince系统黑屏

本人初学wince编程,想用Platform Builder搭建一个平台,于是照着一篇文章的介绍一步一步的做下来,到最后仿真器终端出现了,可是却没有图形界面,窗口上方有Emulator和Help的菜单,下来就是一片黑屏了。请高手指教一下问题可能出现再哪? …

查看全部问答>

请教版主,stm32的抗静电等级与潮敏是多少?

您好,版主! 我想请教下stm32的抗静电等级与潮敏各是多少呢? 静电等级:J8000 J5000 J2000 J1000 J500 J200 是那个级别的 是j2000吗? 潮敏:C1 C2 C3 C4 C5是那个级别的呢?…

查看全部问答>

霍尔传感器模块

先给个实物图(只一次发不知道怎么把图放在帖子中所以就放在附件中了) 这是网上找的一个程序,按道理说应该可以控制: 但是我用电压表测出来的输出信号只有几十毫安,并且在磁铁周期运动时变化之久几毫安?请问谁能解决这个问题? /*********** ...…

查看全部问答>

2013年电子设计大赛是不是9月7号晚上结束后就不能在做了

本帖最后由 paulhyde 于 2014-9-15 03:13 编辑 同题目    …

查看全部问答>

这里有----Multisim电子电路仿真教程

想学习模电的同学,也可以试试仿真软件哦,,这里有Multisim电子电路仿真教程,但动手还是主要的,,,,, 通过对该软件的学习和使用,读者可以轻松地拥有一个元件设备非常完善的虚拟电子实验室,进而可以完成电子电路的各种实验和设计。全书共9章 ...…

查看全部问答>

RIoTboard相关资料下载分享

以下是RIoTboard开发板相关的资料下载,分享一下,希望对大家有帮助。 ·        RIoTboard用户手册_中文:dl.vmall.com/c09taytfdw·        RIoTboard 原理图:dl.vmall.com/c0mvw ...…

查看全部问答>