stm32自学笔记第3版pdf

您所在的位置:网站首页 stm32自学笔记第3版pdf stm32自学笔记第3版pdf

stm32自学笔记第3版pdf

2023-03-25 17:19| 来源: 网络整理| 查看: 265

零基础学stm32要多久?

有c语基础,找本书,找个视频教程,买个开发板,动手学着做东西,只要你舍得花点钱,每天花点时间。一两个月可以学个入门。学精通的话,那就看个人怎么学了。

学stm32的体会

首先,关于STM32入门,这个可能需要的是指导教程和技术论文。说实话STM32并不难,因为你可以把它当作单片机来用,至少不会让你觉得入门很难的,具体的,你可以买个开发板,现在开发板市场上多的是,买个口碑好的。

其次,具体一点话,要学习STM32,第一步可能要理解系统时钟,因为不管你要用到任何片内外设或者是IO口什么的,首先第一步就是要初始化时钟。至于内部寄存器,说实话确实很多,不过你用到某一块,再看那一块的寄存器,这样更有针对性。

stm32fir实时吗

实时。英文缩写:RTC。显示年、月、日、时、分、秒、星期,自动计算闰年,能够区分每个月的天数。

RTC特点:能从RTC获取到具体的日期时间,断掉后再开机时间仍然准确。

RTC模块分为两种,一种集成在芯片内部,另外一种是外接RTC芯片。

芯片集成:

1.外设、模块功能

集成→直接用内部寄存器/寄存器配置

没有集成→外接模块

2.协议

集成

(USART,IIC,SPI…)直接用芯片内部控制器进行控制

没有集成

1.IO模拟。

2.芯片内有没有读写时序一致的协议

例: 8080协议→驱动屏幕,内部没有集成8080

FSMC:静态存储器,读写时序与8080一致

用FSMC模拟8080驱动屏幕

STM32内部实时时钟介绍

BCD:二进制的十进制码

BIN:二进制

HEX:十六进制

BCD码表示时间:

15:39

0001 0101:0011 1001

  实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 RTC 还包含用于管理低功耗模式的自动唤醒单元。

  两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。

  系统可以自动将月份的天数补偿为 28、 29(闰年)、 30 和 31 天。并且还可以进行夏令时(在夏季的某一天会在凌晨时分跳过一小时,而后会在冬季补回来)补偿。

  其它 32 位寄存器还包含可编程的闹钟亚秒、 秒、分钟、小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。

  上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。

  无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内, RTC 便不会停止工作。

STM32内部实时时钟特点

RTC的电源部分

LSI,LSE,HSE 都可提供时钟给RTC,但对于某些器件来说,可能没有外部晶振提供时钟,所以最好使用内部低速时钟提供时钟源。

当主电源 VDD 断电时,可通过 VBAT (纽扣电池)电压为实时时钟 (RTC)、 RTC 备份寄存器和备份 SRAM(BKP SRAM) 供电。

访问RTCRTC备份域数据、需要按照以下步骤

将 RCC_APB1ENR 寄存器中的 PWREN 位置 2.使能电源接口时钟

电源控制器中的PWR_CR的DBP位值1(使能对备份域的访问)

选择RTC时钟源(LSI LSE HSE)

1.配置RCC_BDCR中的RTCSEL[1:0]、选择时钟源

2.如果选择了HSE、需要配置RCC_CFGR中的RTCPRE[4:0]位进行分频

对RCC_BDCR中的RTCCEN[15]位进行编程、使能RTC时钟

STM32内部实时时钟框架

RTC基本日历功能框架分析

基本日历功能主要就是让日历模块正常工作(1秒1秒地计数),我们从日历时间读取出当前实时时间日期。也就是说,日历的工作频率就是1HZ。

RTC寄存器写保护

上电复位后、所有的RTC寄存器受到写保护、取消写保护必须按照以下顺序将对应的密钥写入关键字寄存器(RTC_WPR)

1)0xCA写入RTC_WPR

2) 0x53写入 RTC_WPR

RTC进入初始化模式(设置日历寄存器要注意)

要编程包括时间格式和预分频器配置在内的初始时间和日期日历值,需按照以下顺序操作:

将 RTC_ISR 寄存器中的 INIT 位置 1 以进入初始化模式。在此模式下,日历计数器将停止工作并且其值可更新。

轮询 RTC_ISR 寄存器中的INITF 位。当 INITF置1时进入初始化阶段模式。大约需要2个RTCCLK 时钟周期(由于时钟同步)。

要为日历计数器生成 1 Hz 时钟,应首先编程 RTC_PRER 寄存器中的同步预分频系数,然后编程异步预分频系数。即使只需要更改这两个字段中之一,也必须对 RTC_PRER寄存器执行两次单独的写访问。

在影子寄存器( RTC_TR 和 RTC_DR)中加载初始时间和日期值,然后通过 RTC_CR寄存器中的 FMT 位配置时间格式( 12 或 24 小时制)。

通过清零 INIT 位退出初始化模式。随后,自动加载实际日历计数器值,在 4 个 RTCCLK时钟周期后重新开始计数。

RTC同步(读取日历值要注意)

  每次将日历寄存器中的值复制到RTC_SSR、RTC_TR和RTC_DR影子寄存器时,RTC_ISR寄存器中的 RSF 位都会置1(日历影子寄存器已同步 )。每两个 RTCCLK 周期执行一次复制。为确保这 3 个值来自同一时刻点,读取 RTC_SSR 或 RTC_TR 时会锁定高阶日历影子寄存器中的值,直到读取RTC_DR。为避免软件对日历执行读访问的时间间隔小于 2 个 RTCCLK 周期:第一次读取日历之后必须通过软件将 RSF 清零,并且软件必须等待到 RSF 置 1 之后才可再次读取RTC_SSR、 RTC_TR 和 RTC_DR 寄存器。

/*

函 数 名:Rtc_Config

函数功能:实时时钟RTC初始化

返 回 值:无

形 参:无

备 注:

*/

void Rtc_Config(void)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //打开电源接口时钟

PWR_BackupAccessCmd(ENABLE); //启动寄存器访问

RCC_LSICmd(ENABLE); //打开LSI时钟

// RCC_LSEConfig(RCC_LSE_ON); //打开LSE时钟

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //选择LSI时钟为RTC时钟源

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

RTC_WriteProtectionCmd(DISABLE); //取消写保护

RTC_EnterInitMode();

RTC_InitTypeDef rtc_InitTypeDef; //初始化结构体

rtc_InitTypeDef.RTC_AsynchPrediv = 0x7f; //异步分频

rtc_InitTypeDef.RTC_HourFormat = RTC_HourFormat_24; //24小时格式

rtc_InitTypeDef.RTC_SynchPrediv = 0xff; //同步分频

RTC_Init(rtc_InitTypeDef); //RTC初始化

Rtc_Set_Data(22,9,2,5);

Rtc_Set_Time(RTC_H12_PM,17,0,0);

RTC_ExitInitMode();

}

/*

函 数 名:Rtc_Set_Time

函数功能:设置初始时间

返 回 值:ErrorStatus 设置成功失败的标志

形 参:u8 h12,u8 hour,u8 min,u8 sec

备 注:

*/

ErrorStatus Rtc_Set_Time(u8 h12,u8 hour,u8 min,u8 sec)

{

RTC_TimeTypeDef rtc_TimeTypeDef; //时间结构体

rtc_TimeTypeDef.RTC_H12 = h12; //AM 或 24 小时制

rtc_TimeTypeDef.RTC_Hours = hour; //小时

rtc_TimeTypeDef.RTC_Minutes = min; //分钟

rtc_TimeTypeDef.RTC_Seconds = sec; //秒

return RTC_SetTime(RTC_Format_BIN,rtc_TimeTypeDef); //BIN格式,时间初始化

}

/*

函 数 名:Rtc_Set_Data

函数功能:设置初始日期

返 回 值:ErrorStatus 设置成功失败的标志

形 参:u8 year,u8 month,u8 date,u8 weekday

备 注:

*/

ErrorStatus Rtc_Set_Data(u8 year,u8 month,u8 date,u8 weekday)

{

RTC_DateTypeDef rtc_DateTypeDef; //日期结构体

rtc_DateTypeDef.RTC_Year = year; //年

rtc_DateTypeDef.RTC_Month = month; //月

rtc_DateTypeDef.RTC_Date = date; //日

rtc_DateTypeDef.RTC_WeekDay = weekday; //星期

return RTC_SetDate(RTC_Format_BIN,rtc_DateTypeDef); //BIN格式,日期初始化

}

/*

函 数 名:RTC_print

函数功能:时间打印

返 回 值:无

形 参:无

备 注:

*/

void RTC_print(void)

{

RTC_TimeTypeDef RTC_Time;

RTC_DateTypeDef RTC_Data;

RTC_GetTime(RTC_Format_BIN,RTC_Time);

RTC_GetDate(RTC_Format_BIN,RTC_Data);

printf("20%d年%d月%d日星期%d ",RTC_Data.RTC_Year,RTC_Data.RTC_Month,RTC_Data.RTC_Date,RTC_Data.RTC_WeekDay);

printf("%d:%d:%d\r\n",RTC_Time.RTC_Hours,RTC_Time.RTC_Minutes,RTC_Time.RTC_Seconds);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

RTC可编程闹钟

可编程闹钟介绍

  RTC 单元提供两个可编程闹钟,即闹钟 A 和闹钟 B。

  可通过将RTC_CR寄存器中的ALRAE和ALRBE位置1来使能可编程闹钟功能。如果日历亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR和RTC_ALRMBSSR/RTC_ALRMBR 中编程的值相匹配则 ALRAF 和 ALRBF 标志会被置为 1可通过RTC_ALRMAR 和 RTC_ALRMBR 寄存器的 MSKx 位以及 RTC_ALRMASSR和 RTC_ALRMBSSR 寄存器的 MASKSSx 位单独选择各日历字段。可通过 RTC_CR 寄存器中 的 ALRAIE 和 ALRBIE 位使能闹钟中断。

  闹钟 A 和闹钟 B(如果已通过 RTC_CR 寄存器中的位 OSEL[0:1] 使能)可连接到 RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 极性。

编程闹钟

要对可编程的闹钟(闹钟 A 或闹钟 B)进行编程或更新,必须执行类似的步骤:

将 RTC_CR 寄存器中的 ALRAE 或 ALRBE 位清零以禁止闹钟 A 或闹钟 B。

轮询 RTC_ISR 寄存器中的 ALRAWF 或 ALRBWF 位,直到其中一个置 1,以确保闹钟

寄存器可以访问。大约需要 2 个 RTCCLK 时钟周期(由于时钟同步)。

编程闹钟 A 或闹钟 B 寄存器(RTC_ALRMASSR/RTC_ALRMAR 或 RTC_ALRMBSSR/

RTC_ALRMBR)。

将 RTC_CR 寄存器中的 ALRAE 或 ALRBE 位置 1 以再次使能闹钟 A 或闹钟 B。

闹钟中断

u8 alarm_flag;

/*

函 数 名:ALarm_Config

函数功能:RTC闹钟初始化

返 回 值:无

形 参:无

备 注:

*/

void ALarm_Config(u32 week)

{

RTC_AlarmCmd(RTC_Alarm_A,DISABLE); //关闭闹钟A

RTC_AlarmTypeDef rtc_AlarmTypeDef;

rtc_AlarmTypeDef.RTC_AlarmDateWeekDay = week;

rtc_AlarmTypeDef.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay; //每固定星期报警

rtc_AlarmTypeDef.RTC_AlarmMask = RTC_AlarmMask_None; //与日历时间完全匹配

rtc_AlarmTypeDef.RTC_AlarmTime = Rtc_alarmA_time(RTC_H12_PM,17,0,10);

RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,rtc_AlarmTypeDef);

EXTI_InitTypeDef EXTI17_InitTypeDef;

EXTI17_InitTypeDef.EXTI_Line = EXTI_Line17; //外部中断线17

EXTI17_InitTypeDef.EXTI_LineCmd = ENABLE; //外部中断使能

EXTI17_InitTypeDef.EXTI_Mode = EXTI_Mode_Interrupt; //中断寄存器模式

EXTI17_InitTypeDef.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发

EXTI_Init(EXTI17_InitTypeDef);

RTC_ITConfig(RTC_IT_ALRA,ENABLE); //打开ALARMA中断

NVIC_InitTypeDef nvic_InitTypeDef; //中断初始化

nvic_InitTypeDef.NVIC_IRQChannel = RTC_Alarm_IRQn; //中断号

nvic_InitTypeDef.NVIC_IRQChannelPreemptionPriority = 0; //占先优先级

nvic_InitTypeDef.NVIC_IRQChannelSubPriority = 2; //次级优先级

nvic_InitTypeDef.NVIC_IRQChannelCmd = ENABLE; //NVIC中断响应

NVIC_Init(nvic_InitTypeDef); //初始化NVIC中断

RTC_AlarmCmd(RTC_Alarm_A,ENABLE); //闹钟使能

}

/*

函 数 名:Rtc_alarmA_time

函数功能:设置闹钟时间

返 回 值:RTC_TimeTypeDef 闹钟时间结构体

形 参:u8 h12,u8 hour,u8 min,u8 sec,RTC_TimeTypeDef* RTC_TimeStruct

备 注:

*/

RTC_TimeTypeDef Rtc_alarmA_time(u8 h12,u8 hour,u8 min,u8 sec)

{

RTC_TimeTypeDef Alarm_Time;

Alarm_Time.RTC_H12 = h12;

Alarm_Time.RTC_Hours = hour;

Alarm_Time.RTC_Minutes = min;

Alarm_Time.RTC_Seconds = sec;

return Alarm_Time;

}

/*

函 数 名:RTC_Alarm_IRQHandler

函数功能:RTC闹钟中断服务函数

返 回 值:无

形 参:无

备 注:

*/

void RTC_Alarm_IRQHandler(void)

{

if(RTC_GetFlagStatus(RTC_FLAG_ALRAF))

{

RTC_ClearFlag(RTC_FLAG_ALRAF);

alarm_flag = 1;

}

EXTI-PR |= (0x01 17); //挂起寄存器写1清零

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

打开CSDN APP,看更多技术内容

STM32-RTC实时时钟_ONE_Day|的博客_stm32内置rtc可采用...

RTC时钟源有三种来源,分别是HSE的128分频,LSE时钟源,LSI时钟源,一般RTC选择的是LSE时钟源,也就是外部低速时钟源,外接一个32.768KHz的晶振,因为这个时钟源比较准确 RTC组成 APB1接口:用来和APB1总线相连。通过APB1接口可以访问RTC的相关...

继续访问

16.STM32RTC实时时钟知识与实验_stm32 rtc_普通的不普通少年的博客-CSD...

1.实时时钟 RTC是一个独立的BCD定时器/计数器。RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包括用于管理低功耗模式的自动唤醒单元。 有两个32位的寄存器,包含二进制吗十进制格式BCD的...

继续访问

i2c_rtc.rar_dsp28335_iic rtc_iic 读取rtc实验

首先 通过模拟IIC接口,往RTC寄存器中写一个预设时间,再通过模拟IIc读取RTC寄存器中的时间,观察秒钟的变化情况。

i2c底层数据传输解析之RTC实时时钟

在i2c上进行数据传输,都是通过一个叫i2c_smbus_xfer的函数进行传输,这个函数被i2c_smbus函数族所调用,不同的i2c_smbus函数族的函数调用时都会传入一个i2c_smbus_xfer_emulated函数的switch中所需要的size,在case分支中将不同的数据写入i2c_msg结构体成员,然后执行i2c_smbus_xfer_emulated中的i2c_transfer,i2c_transfer最终调用了i2c_algorithm算法实现中的master_xfer周期性的发送i

继续访问

STM32实时时钟_面向offer编程的博客_获取clk时钟 stm32

STM32实时时钟 RTC(real time clock)实时时钟 STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM...

继续访问

STM32之RTC实时时钟

RTC实时时钟简介: STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM32中唯一一个具有这个功能功能的外设.(RTC外设的复杂之处不在于它的定时,而在于它掉电还可以继续运行的特性) 所谓掉电,是指电源Vpp断开的情况下,为了RTC外设掉电可以继续运行,必须给STM32芯片通过VBAT引脚街上锂电池.当主电源VDD有效时,由VDD给RTC外设供电.当VDD掉电后,

继续访问

【STM32】详解RTC实时时钟的概念和配置示例代码

RTC实时时钟

继续访问

STM32之RTC

简介:STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 框图: 相关寄存器: 控制寄存器 第 0 位是秒钟标志位,我们在进入闹钟中断的时候,通过判断这位来决定是不是发生了秒钟中断。然后必须通过软件将该位清零(写0) 第 3 位为寄存器同步标志位,我们在修改控制寄存器 RTC_CRH/CRL 之前,必须先判断该位,是否已经同步了,如果没有则等待同步,在没同步的情

继续访问

STM32基础10--实时时钟(RTC)

目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量 重写周期唤醒回调函数 重写闹钟中断函数 前言 在做51单片机项目时,如果需要年月日时分秒的时间记录,会在51单片机上面外挂一个DS1302的时钟芯片,再加上时间芯片的外围电路。但在STM32F407中,不再需...

继续访问

STM32精英版(正点原子STM32F103ZET6开发板)学习篇15——RTC实时时钟+备份区域BKP

摘抄自正点原子官方PPT 什么是RTC?   RTC (Real Time Clock):实时时钟,是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。   RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域(断电后还会工作),即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备

继续访问

嵌入式--RTC实时时钟原理及相关库函数功能

嵌入式--RTC实时时钟原理及相关库函数功能

继续访问

STM32日历读取,设置和输出

一、了解时钟RTC RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。 RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高

继续访问

STM32基于固件库学习笔记(11)RTC实时时钟

使用RTC实时时钟的秒中断打印当前时间。(相当于使用简单的定时器每一秒中断打印时间)

继续访问

STM32:RTC实时时钟原理

STM32:RTC实时时钟原理

继续访问

DS1307实时时钟RTC读取(STM32)记录

最开始将函数从51单片机移植过来,如何整都读取出来的数据是65,不是实时时钟数据,查了下手册,发现必须4.5V-5.5V供电才可以,没有办法,跳线解决,但SCL与SDA采用3.3V+10K电阻上拉倒没有问题; 读取函数设置如下(PB12 PB13): //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_...

继续访问

STM32-RTC实时时钟-毫秒计时实现

阅读目录 1、RTC时钟简介 2、软硬件设计 3、时钟配置与函数编写 4、秒钟计时原理 5、毫秒计时原理 6、修改时间 OS:Windows 64 Developmentkit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 回到顶部 1、RTC时钟简介 STM32的实时时钟(RTC)是一个独立的定时器,在相应软件配置下,可提供时钟日历的功能。 详细资料请参考ALIENTEK的官方文档——《STM32F1开发指南(精英版-库函数版)》,以下为博主摘录要..

继续访问

FPGA-使用RTC时钟芯片进行时钟读取(数码管显示)

做时钟显示如果用单片机做,会产生很大的累积误差,本程序采用时钟芯片PCF8563 一:芯片主要电气特性: 1)大工作电压范围:1.0~5.5V 2)400KHz 的 I2C 总线接口(VDD=1.8~5.5V 时)。 时钟频率最大400KH 3)i2C 总线从地址:读,0A3H;写,0A2H . 二:管脚 电路接线图: top.v: mod...

继续访问

51-DS1302实时时钟

51单片机

继续访问

STM32——实时时钟RTC的日历读取

STM32的 RTC 外设(Real Time Clock),实质是一个掉电后还继续运行的定时器。从定时器的角度来说,相对于通用定时器 TIM 外设,它十分简单,只有很纯粹的计时和触发中断的功能;但从掉电还继续运行的角度来说,它却是 STM32 中唯一一个具有如此强大功能的外设。所以 RTC 外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性。STM32的 RTC 外设(Real Time Clock),实质是一个掉电后还继续运行的定时器。

继续访问

STM32CubeMX之RTC电子钟

RTC由两个主要部分组成(见下图)。第一部分(APB1 接口 )用来和APB1 总线相连。此单元还包含一组16位寄存器,可通过APB1 总线对其进行读写操作。APB1 接口由APB1 总线时钟驱动,用来与APB1 总线接口。另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1 秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC 预分频器)。

继续访问

最新发布 基于STM32实现RTC实时时钟

rtc实时时钟是一个很重要的内容,今天要配置的时RTC唤醒中断,它在很多地方都会被用到。今天需要配置的东西会有点多,代码长度也会比较长。实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、两个可编程 闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模式的自动唤醒单元。两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星 期几、日期、月份和年份。此外,还可提供二进制格式的亚

stm32寄存器开发的意义

本文主要是简述如何创建一个STM32的基础工程,以及在工程文件中所添加文件(头文件以及原文件)的意义。本文不使用RTE,使用的芯片为STM32F103ZET6,KEIL,使用LL相关库函数。因为文件的含义是根据本人的理解,可能存在错误的地方,欢迎讨论。

二、STM32文件架构

我们先来看下ARM的文件架构图

从图中我们不难看出,其实最简单的路径就是直接从Application Code(应用层代码)调用CMSIS-Core来实现对CPU-Core、Core-Peripherais、Other--Peripherais来运算和控制。这种方法可不可行呢,肯定是可行的。但是这样会存在一些问题。

第一:CMSIS-CORE中是对CORE和Peripherais的一些定义。这些定义一般是操作硬件的寄存器的结构体。例如你想要操作某一个外设,你就必须知道这个外设的每个寄存器的位置在哪里,以及每个寄存器的作用,并且确保你不会在设置寄存器的值的时候出错。这种方式称为寄存器开发

第二:即使不怕困难完成了第一步,那么接下来你就会面临第二个问题:移植。你通过第一步完成的程序的移植性是很低的。为什么呢?你每切换一款芯片都会可能导致不兼容,因为即使采用的同一个框架,每个厂家都可以根据自己的需求去改变外设的数量以及位置。这就可能导致你在应用层设置的寄存器地址和结构是不通用,甚至同一个厂家同一个架构下也会有不同型号的芯片,那就更加不用提更换厂家甚至是更换芯片架构的情况了。

为了解决寄存器开发的不足,Silicon Vendor(生产制造商)提供了一套叫做HAL(硬件抽象层)的东西。什么是HAL?按照个人理解就是把操作硬件也就是操作寄存器的动作有机的封装起来,让我们不再需要去关注怎么操作寄存器也就是硬件,而是使用了一些有意义的宏或者函数来代替,方便我们的编写程序。这个解决了上面的问题一。对于问题二是怎么解决的呢,刚才也说到HAl使用了一些有意义的宏或者函数来代替,这些宏或者函数在这个厂家对每一个同架构的芯片都是一样。例如在STM32F1的串口初始化的LL库函数为LL_USART_Init(USART1),那么即使你切换到STM32F3也是在应用层调用LL_USART_Init(USART1),只需要把STM32的HAL文件替换为STM32F3的HAL文件就行,如果他们USART1外设的寄存器位置不一样,那么在HAL文件的定义中就已经修改好了,应用层的代码无需修改。这样就大大的减少了移植的难度。

现在我们的路径变为了Application Code(应用层代码)------DEVICE HAL --------CMSIS-Core --------CPU-Core、Core-Peripherais、Other--Peripherais。这种方式我们称为库函数开发。

三、库函数开发的基础工程文件(不带系统)

根据上面的描述,我们把文件分成四个大的部分(不带系统):CMSIS-CORE,STARTUP,HAL,Application Code

其中CMSIS-CORE也会细分三个部分:Peripherais-CORE,Peripherais-Device,compiler:

Peripherais-CORE:

具体文件:

1.cmsis_compiler.h(compiler)

2.cmsis_armcc.h (compiler)

3.cmsis_version.h (compiler)

4.core_cm3.h (Peripherais-CORE)

5.stm32f1xx.h (Peripherais-Device)

6.stm32f103xe.h (Peripherais-Device)

1.cmsis_compiler.h

该文件是一个编译声明文件,主要作用:

1.声明使用哪个编译器编译。本文采用的Keil的环境所以使用的是armcc的编译方式

2.cmsis_armcc.h

该文件是一个编译器头文件,主要作用:

1.申明编译器的部分特殊寄存器的操作

3.cmsis_version.h

该文件是一个编译器版本文件,主要作用:

1.申明编译器的版本

4.core_cm3.h

该文件的是一个申明M3架构的内核外设的文件,主要作用:

1.申明core_register

2.申明NVIC_register

3.申明SCB_register

4.申明Systick_register

5.申明Debug_register

6.申明MPU_register(可选)

5.stm32f1xx.h

该文件使用制造商提供的头文件,主要作用是:

1.根据Keil的宏定义去添加对于F1系列芯片的外设申明文件

6.stm32f103xe.h

该文件的使用制造商的头文件,主要作用是:

1.申明stm32f103系列芯片的所有外部外设的中断、位置,结构体,以及寄存器操作的相关宏定义

Startup:

1.startup_stm32f103xe.s

2.system_stm32f1xx.c

3.system_stm32f1xx.h

1.startup_stm32f103xe.s

该文件是一个启动文件,主要的作用有:

1.初始化堆栈

2.异常以及中断的定义,以及部分异常的实现

3.调用SystemInit函数初始化时钟(system)

4.调动main函数进入application code

2.system_stm32f1xx.c

该文件主要是系统时钟初始换函数实现。主要作用:

1.初始化时钟

3.system_stm32f1xx.h

该文件主要是系统时钟初始换函数申明。主要作用:

1.申明时钟初始化函数

HAL:本文采用的ST的LL库,下面采用的也是LL库的示例。目前示例的工程的点亮一个LED

1. stm32f1xx_ll_bus.h

该文件主要是申明对外设总线时钟操作宏定义。主要作用:

1.定义总线时钟相关的操作

2.stm32f1xx_ll_gpio.c 和stm32f1xx_ll_gpio.c

这两个文件是LL库对GPIO外设文件,主要作用:

1.对GPIO外设数量、位置、结构、基本操作的申明以及定义

3.其他:LL库线的C文件以及H文件还有很多,我们可以根据我们自己的需要进行添加,不一定需要把整个LL库都添加进去。例如:ADC,USART等等等等。该工程只是点亮LED,所以不需要其他文件。LL库的头文件以及源文件有以下这些(STM32F1系列)

Application Code:应用层代码,主要是我们业务逻辑。该工程只有main.c文件,用于点亮LED

main.c的主要代码如下:

整体文件架构图:

PS:以上就是该项目的本地树结构。该结构只是个人的风格,每个人可以根据自己的风格创建自己的结构

三、如何在KEIL中建立该工程并编译烧录

1、KEIL安装,网上有很多优秀的文章,自行参考,不在赘述

2、建立基本工程(选择芯片STMF103ZE)

3、建立工程文件架构、添加源文件。参考其他文章。个人喜欢和本地目录的架构保持一致,添加好文件后的Keil工程架构如图:

4.添加头文件到编译路径

魔术棒----》c/c++------》Include Paths

5.添加全局的宏定义

STM32F103xE和USE_FULL_LL_DRIVER

STM32F103xE:用于告诉stm32f1xx文件,最后添加f1系列具体哪个型号的头文件进来

USE_FULL_LL_DRIVER:用来启动LL库的编译。

6.编写application code(main.c)文件

7.编译

8.烧录(需要连接电脑,模拟器,芯片)具体你使用的是哪个模拟器相关设置请参考其他文章

9.LED指示灯正常亮起。

四、总结

至此,一个最最最基本的用LL库去点亮LED的工程已经建好了。本文只是在描述stm32工程文件的架构思路,在实际应用中你们可以使用的不同框架以及型号的芯片,不要照搬,要懂得根据自己的实际情况是使用合适的文件。本文仅作为参考

打开CSDN APP,看更多技术内容

STM32 三种开发方式:寄存器、标准库函数、HAL库_太阳火神的美丽人生的博...

STM32 单片机是由芯片内嵌的处理器内核和外设电路构成,相当于PC电脑的CPU、内存、主板、硬盘,所有这些都集成在一块不到一厘米见方的芯片中,通过引脚与外围电路集成,连接不同设备,以不同协议进行通过,如 USART、SPI、IIC、CAN,所有这些...

继续访问

STM32笔记(二)初识寄存器与固件库开发的简介_CYRIL0124的博客-CSDN博 ...

后面我们还可以再定义一个函数用于操作所需要操作的寄存器,这时候只需要填入参数就可以实现运用函数来操作配置各种寄存器或者各种外设的功能了,这也就是固件库实现的基本思想。 这是固件库操作GPIO外设的一个函数,可以简单参考一下 ...

继续访问

stm32入门 第二周 IO口实验,了解库函数开发和寄存器开发的区别

本文内容基于 P11 GPIO工作模式: 输入模式1:浮空输入 输入模式2:输入上拉模式 输入模式3:输入下拉模式 由于浮空输入模式的电压不确定,容易误读,检测高电平时一般用输入下拉模式,检测低电平时一般用输入上拉模式。 输入模式4:模拟模式 输出模式1:开漏输出 输出控制电路输出1时,N-MOS断开,实际输出由外部上拉下拉决定,输出0时,N-MOS闭合,实际输出0,实际输出可以由输入数据..

继续访问

Stm32寄存器与库函数概览(摘自固件库使用手册).doc

本手册内容为STM32各标准库操作相应寄存器的手册,可为STM32库函数开发提供参考

STM32寄存器版和库函数版.zip

STM32寄存器版和库函数版,配合stm32日更2nd使用更佳,本文讲述了STM32寄存器版和库函数版的创建

Stm32寄存器与库函数概览(摘自固件库使用手册).zip

在网上看到一份关于STM32单片机开发资料,其中整理了STM32单片机常用寄存器的名称和功能,还有各个功能相关库函数的函数名和函数功能。可做为开发时的参考。

STM32学习笔记(二):新建STM32F103工程

1、前言 前面已经介绍了怎么安装keil5.29和破解keil5.29,下面进行STM32F103的新建工程。 2、工程的准备 在进行创建工程前,需要做好如下几个前提。 1)STM32F103的芯片包 2)准备好STM32的固件库 3)创建好工程文件和目录 以下为上面三个准备的步骤: 2.1:芯片包的下载 下面这个是芯片包的官方下载地址。 链接: 下载完芯片包之后直接双击打开进行安装就行了,这个安装的路劲是默认的,就是你的keil安装的路劲下的某个文件夹,这个不用理会,直接傻瓜式点击下一步,一直点击就行了,然后等待安装 大家可以下载相

STM32学习笔记1:KEIL5配置stm32开发环境,以及新建工程的步骤。

一、下载安装keil5.(这里不多做介绍,网上有很多资料了) 二、下载安装stm32的pack包。 –pack包下载链接点这里 正常界面如下,使用浏览器的ctrl+F功能快速搜索到对应的系列进行下载。 如果网页打不开,或者找不到下载包的地方,解决方法请点击这里。 下载下来的包是一个zip文件。这个包应该有两种使用方法。我目前尝试的是第一种,后续再补第二种。 第一种: 把后缀名改zip改为pack,然后双击打开安装。这样是直接集成到keil软件里面了。这种方法快可以快速上手,配置简单。但是一旦更

继续访问

STM32官方标准固件库开发与寄存器开发的区别

一句话概括关系:固件库就是函数的集合,固件库函数的作用就是:向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于STM32这种级别的MCU,数百个寄存器记起来何谈容易,于是推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一套API供开发者使用。大多数情况下,你不需要知道操作的是哪个寄存器,你只需要知道调用哪些函数即可。 对比一下:入下面只需要知道GPIO_SetBi...

继续访问

最新发布 STM32使用寄存器开发底层驱动学习(USART+DMA)

代码简洁明了,当然需要我们注释好,不然比标准库更难看懂。方便快捷,只需要一本《手册》就可以查看所有的寄存器,不需要像标准库那样记、找每个函数、每个参数的作用。

继续访问

STM32之GPIO配置(寄存器/库函数)

GPIO初始化结构体 GPIO初始化 先声明GPIO初始化的结构体;然后打开GPIO所挂载的总线的时钟;再对结构体成员进行配置,包括GPIO的引脚,模式,速度;最后对GPIO的结构体进行初始化并选定指定的GPIO组。 GPIO_Mode相关内容 模拟输入、浮空输入、下拉输入、上拉输入、通用开漏输出、通用推挽输出、复用开漏输出、复用推挽输出。 GPIO相关函数 ①GPIO初始化函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_In

继续访问

库函数开发与寄存器开发

在以前 8 位机时代的程序开发中,一般直接配置芯片的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 8位机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。 对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方...

继续访问

cmsis_iar.h

发现了"cmsis_iar.h",需要的人可以下载来看看!

C语言中头文件和源文件的注意事项

C语言中头文件和源文件的注意事项 文章目录C语言中头文件和源文件的注意事项0.前言1.实现步骤1.1 拆分前1.2 拆分后2.总结2.1头文件内容2.2 源文件(.c)内容2.3 函数声明和定义 0.前言 因为C语言编程或者C++语言编程,经常要添加头文件,不像Python中直接引入第三库就可以(import),但是嵌入式编程中C还是主流,Python目前这方面的应用还是比较少的,故如果完成一个大...

继续访问

C++中头文件与源文件的区别

本文转自: 一、源文件如何根据#include来关联头文件 1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。 2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来

继续访问

STM32库函数与寄存器的区别

#STM32库函数与寄存器# 1.固件库是什么?与寄存器有什么关系? 固件库就是函数的集合,向下与寄存器直接打交道,向上提供用户调用函数的接口(API) 2.最佳使用情况 寄存器:单独对IO口状态控制,对寄存器进行位操作(如51) 调试debug时对寄存器进行位操作(需要理解与什么寄存器有关并理解过程,调试时翻阅寄存器手册) 库函数:寄存器数量过多(如STM32)调用库函数 ...

继续访问

stm32初学者是应该学寄存器好还是学库函数好?

作者:jiwangbujiu链接:来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。我个人认为,在回答这个问题之前,你得先问清楚自己,我学习stm32、或者再往更深的地方走,我学习单片机,究竟是为了什么?你现在是处于什么状态?你是学生还是已经参加工作了?你的专...

继续访问

AT24CXX系列芯片在STM32F103单片机下的读写程序

本程序取自正点原子开发板,应用于STM32F103单片机,适用AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256,AT24C512系列I2C存储芯片。 一、sys.h #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //////////////////////////////////////////////////////////////.

继续访问

STM32开发方式及基本介绍

STM32的开发有三种方式 1.寄存器版本 2.库函数版本 3.HAL库版本 一、库函数开发与寄存器开发的关系 很多人都是从学51单片机转而想进一步学习STM32,他们习惯了51单片机的寄存器开发方式,ST官方库摆在面前会不知道从何下手。其实简单来说,固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口。 举一个例子来解释 STM32 固件库到底是什么,和寄存器开发有什么关系。 在51的开发中我们常常是直接操作寄存器,比如要控制某些 IO 口的状态,我们直接

继续访问

热门推荐 STM32库函数和寄存器的区别

库函数版和寄存器版的系统时钟设置的区别: **1.**库函数的目的是让用户应用的,而寄存器更加原始 库函数的系统时钟是默认设置的,且放在启动文件里。而寄存器版的系统时钟是Stm32_Clock_Init(336,8,2,7);. **2.**库函数的快捷的,但不是每个芯片都有的;寄存器是复杂的,但是每个芯片厂商都有提供系统的寄存器设置信息。 分别打开库函数和寄存器版的I/O口设置: 库函数: RC...

继续访问

CMSIS玩家的“阴间成就”指南

【说在前面的话】认真说起来,从事嵌入式系统开发职业的“玩家”们基本都听说过CMSIS吧?虽然不清楚它在系统中具体“有什么卵用”,但或多或少都接受过“CMSIS的毒打”——不知不觉间,达成了...

继续访问

C 语言操作寄存器开发

在使用C语言操作寄存器前,仍需要先分析《开发板原理图》和《参考手册》,从而得知需要操作哪些外设寄存器,假设读者已经了解需要操作哪些外设寄存器。 本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语言操作寄存器开发\”。 使用C语言之前,需要先设置栈,如代码段 6.3.1 所示,在上电复位后立即设置栈,随后跳入main函数执行。 代码段 6.3.1 设置栈(startup_stm32f10x_hd.s) ; Reset handler Reset_H

继续访问

stm32寄存器开发与库开发

stm32

一本STM32自学笔记/蒙博宇编著/第二版/北京航天航空大学出版社的书配套开发板应该是哪块板?

我觉得源码最重要。先下载开发板附带的源码,看哪家的资料组织更整齐,编码规范,代码更易阅读的。要速成最好看源码对原理图,不懂的地方猜功能,然后修改测试自己想法是否正确,不懂再到网络上找答案,提高自学的能力。觉得带系统的st是可以一周入门的,毕竟资料很多

stm32自学笔记 第2版 pdf用的是keil还是iar

stm32一般使用的是keil编译比较多,IAR开发STM32也可以,其实不管什么编译器,设置都很简单,功能也很完善,keil强在能够软件仿真,辅助功能强大。

学习STM32入门要多久

有单片机方面的基础的话,学起来很快的,一两个月就可以搞明白,半年时间就能搞得很熟了!关键是要在开发板上多实践,实践出真知啊!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3