STM32系统学习——RCC(使用HSE/HSI配置时钟)

发布者:xxoke624最新更新时间:2018-12-17 来源: eefocus关键字:STM32  RCC  HSE  HSI  配置时钟 手机看文章 扫描二维码
随时随地手机看文章

RCC :reset clock control 复位和时钟控制器。主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,STM32 的一切时钟的来龙去脉都会了如指掌。


一、RCC主要作用——时钟部分 


设置系统时钟SYSCLK、设置AHB分频因子(决定HCLK是多少)、设置APB2分频因子(设定PCLK2等于多少)、设置APB1分频因子(决定PCLK1等于多少);控制AHB/APB2/APB1这3条总线开启,控制每个外设时钟的开启。 


对于SYSCLK、HCLK、PCLK2、PCLK1这4个时钟的配置一般是:PCLK2=HCLK=SYSCLK=PLLCLK=72MHz,PCLK1=HCLK/2=36MHz.这个配置是库函数的标准配置。


二、系统时钟 

 

STM32时钟树 


系统时钟包括了: 


1.HSE高速外部时钟(常用8MHz无源晶振); 


2.PLL时钟源(来源有HSE和HSI/2,一般选HSE作为时钟来源); 


3.PLL时钟PLLCLK(通过设置PLL的倍频因子,一般8Mx9=72MHz,72MHz是官方推荐稳定运行时钟,最高128MHz); 


4.系统时钟SYSCLK(一般SYSCLK=PLLCLK=72MHz); 


5.AHB总线时钟HCLK(是系统时钟SYSCLK经过AHB分频器分频后得到的时钟,也就是APB总线时钟,一般设置1分频,HCLK=SYSSCLK=72MHz); 


6.APB2总线时钟HCLK2(APB2总线时钟PCLK2由 HCLK经过高速APB2预分频器得到,分频因子可以是:[1,2,4,8,16],具体由时钟配置寄存器CFGR的位13-11:PPRE2[2:0]决定,一般设置为 1 分频,即 PCLK2 = HCLK =72M); 


7.APB1总线时钟HCLK1(APB1 总线时钟 PCLK1 由 HCLK 经过低速 APB 预分频器得到,HCLK1 属于低速的总线时钟,最高为 36M,这里只需粗线条的设置好 APB1 的时钟即可。我们这里设置为 2分频,即 PCLK1 = HCLK/2 = 36M)设置系统时钟函数在库函数system_stm32f10x.c


                                    代码清单:设置系统时钟库函数


1

1 static void SetSysClockTo72(void)

2 {

3 __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

5 // ① 使能 HSE,并等待 HSE 稳定 

6 RCC->CR |= ((uint32_t)RCC_CR_HSEON);

8 // 等待 HSE 启动稳定,并做超时处理 

9 do {

10 HSEStatus = RCC->CR & RCC_CR_HSERDY;

11 StartUpCounter++;

12 } while ((HSEStatus == 0) &&(StartUpCounter !=HSE_STARTUP_TIMEOUT));

13 

14 if ((RCC->CR & RCC_CR_HSERDY) != RESET) {

15 HSEStatus = (uint32_t)0x01;

16 } else {

17 HSEStatus = (uint32_t)0x00;

18 }

19 // HSE 启动成功,则继续往下处理 

20 if (HSEStatus == (uint32_t)0x01) {

21

22 //-----------------------------------------------------------

23 // 使能 FLASH 预存取缓冲区 */

24 FLASH->ACR |= FLASH_ACR_PRFTBE;

25 

26 // SYSCLK 周期与闪存访问时间的比例设置,这里统一设置成 2

27 // 设置成 2 的时候,SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,

28 // 如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了

29 // 0:0 < SYSCLK <= 24M

30 // 1:24< SYSCLK <= 48M

31 // 2:48< SYSCLK <= 72M */

32 FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

33 FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;

34 //------------------------------------------------------------

35 

36 // ② 设置 AHB、APB2、APB1 预分频因子

37 // HCLK = SYSCLK

38 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

39 //PCLK2 = HCLK

40 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

41 //PCLK1 = HCLK/2

42 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

43 

44 //③ 设置 PLL 时钟来源,设置 PLL 倍频因子,PLLCLK = HSE * 9 = 72 MHz

45 RCC->CFGR &= (uint32_t)((uint32_t)

46 ~(RCC_CFGR_PLLSRC

47 | RCC_CFGR_PLLXTPRE

48 | RCC_CFGR_PLLMULL));

49 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE

50 | RCC_CFGR_PLLMULL9);

51 

52 // ④ 使能 PLL

53 RCC->CR |= RCC_CR_PLLON;

54 

55 // ⑤ 等待 PLL 稳定

56 while ((RCC->CR & RCC_CR_PLLRDY) == 0) {

57 }

58 

59 // ⑥ 选择 PLL 作为系统时钟来源

60 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

61 RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

62 

63 // ⑦ 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟

64 while ((RCC->CFGR&(uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){

65 }

66 } else {// 如果 HSE 启动失败,用户可以在这里添加错误代码出来

67 }

68 }


三、其他时钟 


1. USB时钟 


USB 时钟是由 PLLCLK 经过 USB 预分频器得到,分频因子可以是:[1,1.5],具体的由时钟配置寄存器 CFGR的位 22:USBPRE配置。USB的时钟最高是 48M,根据分频因子反推过来算 ,PLLCLK 只 能 是 48M 或 者 是 72M。 一 般我 们 设 置 PLLCLK=72M ,USBCLK=48M。USB 对时钟要求比较高,所以 PLLCLK 只能是由 HSE 倍频得到,不能使用 HSI倍频。 


2. Cortex系统时钟 


Cortex 系统时钟由 HCLK 8 分频得到,等于 9M,Cortex 系统时钟用来驱动内核的系统定时器 SysTick,SysTick 一般用于操作系统的时钟节拍,也可以用做普通的定时。 


3. ADC时钟 


ADC时钟由PCLK2经过ADC预分频器得到,分频因子可以是[2,4,6,8],具体的由时钟配置寄存器 CFGR的位 15-14:ADCPRE[1:0]决定。很奇怪的是怎么没有 1分频。ADC时钟最高只能是 14M,如果采样周期设置成最短的 1.5 个周期的话,ADC 的转换时间可以达到最短的 1us。如果真要达到最短的转换时间 1us 的话,那 ADC 的时钟就得是 14M,反推PCLK2 的时钟只能是:28M、56M、84M、112M,鉴于 PCLK2 最高是 72M,所以只能取28M和 56M。 


4. RTC时钟、独立看门狗时钟 


RTC 时钟可由 HSE/128 分频得到,也可由低速外部时钟信号 LSE 提供,频率为32.768KHZ,也可由低速内部时钟信号 HSI 提供,具体选用哪个时钟由备份域控制寄存器BDCR的位9-8:RTCSEL[1:0]配置。独立看门狗的时钟由LSI提供,且只能是由LSI提供,LSI是低速的内部时钟信号,频率为 30~60KHZ直接不等,一般取 40KHZ。 


5. MCO时钟输出 


MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在 STM32 F1系列中 由 PA8 复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。MCO 的时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK,具体选哪个由时钟配置寄存器CFGR的位 26-24:MCO[2:0]决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控 MCO引脚的时钟输出来验证我们的系统时钟配置是否正确。


四、如何配置系统时钟 


1、使用HSE 


将HSE经过PLL倍频之后作为系统时钟,通常的配置是:HSE=8MHz,PLL的倍频因子为9,系统时钟SYSCLK=72MHz。在程序来到main函数之前,启动文件statup_stm32f10x_hd.s已经调用SystemInit()函数,把系统时钟初始化为72MHz,SystemInit()函数在库文件system_stm32f10x.c中定义。 


2.使用HSI 


如果PLL的时钟来源是HSE,那么当HSE故障时,不仅HSE不能使用,连PLL也会关闭,此时系统会自动切换HSI为系统时钟,此时SYSCLK=HSI=8MHz,如果没有开启CSS和CSS中断的话,整个系统只能在低速率运行,跟系统瘫痪没什么两样。如果开启了CSS,当HSE故障,可以在CSS中断中采取补救措施,使用HSI,并把系统时钟设置为更高的频率,最高是64MHz,一般足够使用如ADC/SPI等,但是思考原来SYSCLK=72MHz,现在外设时钟肯定都变了,外设工作会被打乱。我们是不是在设置 HSI 时钟的时候,也重新调整外设总线的分频因子,即 AHB,APB2 和 APB1 的分频因子,使外设的时钟达到跟 HSE 没有故障之前一样。但是这个也不是最保障的办法,毕竟不能一直使用 HSI,所以当 HSE 故障时还是要采取报警措施。 


还有一种情况是,有些用户不想用 HSE,想用 HSI,但是又不知道怎么用 HSI 来设置系统时钟,因为调用库函数都是使用 HSE,下面我们给出个使用 HSI 配置系统时钟例子。


                                代码清单:HSE作为系统时钟来源

1

1 void HSE_SetSysClock(uint32_t pllmul)

2 {

3 __IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;

5 // 把 RCC 外设初始化成复位状态,这句是必须的

6 RCC_DeInit();

8 //使能 HSE,开启外部晶振, STM32F103 系列开发板用的是 8M

9 RCC_HSEConfig(RCC_HSE_ON);

10 

11 // 等待 HSE 启动稳定

12 HSEStartUpStatus = RCC_WaitForHSEStartUp();

13 

14 // 只有 HSE 稳定之后则继续往下执行

15 if (HSEStartUpStatus == SUCCESS) {

16 //-----------------------------------------------------------------//

17

18 // 使能 FLASH 预存取缓冲区

19 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

20 

21 // SYSCLK 周期与闪存访问时间的比例设置,这里统一设置成 2

22 // 设置成 2 的时候,SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,

23 // 如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了

24 // 0:0 < SYSCLK <= 24M

25 // 1:24< SYSCLK <= 48M

26 // 2:48< SYSCLK <= 72M

27 FLASH_SetLatency(FLASH_Latency_2);

28 //-----------------------------------------------------------------//

29 

30 // AHB 预分频因子设置为 1 分频,HCLK = SYSCLK

31 RCC_HCLKConfig(RCC_SYSCLK_Div1);

32 

33 // APB2 预分频因子设置为 1 分频,PCLK2 = HCLK

34 RCC_PCLK2Config(RCC_HCLK_Div1);

35 

36 // APB1 预分频因子设置为 1 分频,PCLK1 = HCLK/2

37 RCC_PCLK1Config(RCC_HCLK_Div2);

38 

39 //-----------------设置各种频率主要就是在这里设置-------------------//

40 // 设置 PLL 时钟来源为 HSE,设置 PLL 倍频因子

41 // PLLCLK = 8MHz * pllmul

42 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul);

43 //-------------------------------------------------------------//

44 

45 // 开启 PLL

46 RCC_PLLCmd(ENABLE);

47 

48 // 等待 PLL 稳定

49 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {

50 }

51 

52 // 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLK

53 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

54 

55 // 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟

56 while (RCC_GetSYSCLKSource() != 0x08) {

57 }

58 } else {

59 // 如果 HSE 开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理

60 // 当 HSE 开启失败或者故障的时候,单片机会自动把 HSI 设置为系统时钟,

61 // HSI 是内部的高速时钟,8MHZ

62 while (1) {

63 }

64 }

65 }


这个函数采用库函数编写,有个形参pllmul,用来设置PLL的倍频因子,调用的时候形参可以是:RCC_PLLMul_x , x:[2,3,…16],这些宏来源于库函数的定义,宏展开是一些 32 位的十六进制数,具体功能是配置了时钟配置寄存器 CFGR 的位 21-18PLLMUL[3:0],预先定义好倍频因子,方便调用。 


函数调用举例:HSE_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:8MHZ * 9 =72MHZ。 HSE_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:8MHZ * 16 = 128MHZ超频慎用。


                                    代码清单:HSI作为系统时钟来源

1

1 void HSI_SetSysClock(uint32_t pllmul)

2 {

3 __IO uint32_t HSIStartUpStatus = 0;

5 // 把 RCC 外设初始化成复位状态,这句是必须的

6 RCC_DeInit();

8 //使能 HSI

9 RCC_HSICmd(ENABLE);

10 

11 // 等待 HSI 就绪

12 HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;

13 

14 // 只有 HSI 就绪之后则继续往下执行

15 if (HSIStartUpStatus == RCC_CR_HSIRDY) {

16 //-------------------------------------------------------------//

17

18 // 使能 FLASH 预存取缓冲区

19 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

20 

21 // SYSCLK 周期与闪存访问时间的比例设置,这里统一设置成 2

22 // 设置成 2 的时候,SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,

23 // 如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了

24 // 0:0 < SYSCLK <= 24M

25 // 1:24< SYSCLK <= 48M

26 // 2:48< SYSCLK <= 72M

27 FLASH_SetLatency(FLASH_Latency_2);

28 //------------------------------------------------------------//

29 

30 // AHB 预分频因子设置为 1 分频,HCLK = SYSCLK

31 RCC_HCLKConfig(RCC_SYSCLK_Div1);

32 

33 // APB2 预分频因子设置为 1 分频,PCLK2 = HCLK

34 RCC_PCLK2Config(RCC_HCLK_Div1);

35 

36 // APB1 预分频因子设置为 1 分频,PCLK1 = HCLK/2

37 RCC_PCLK1Config(RCC_HCLK_Div2);

38 

39 //-----------设置各种频率主要就是在这里设置-------------------//

40 // 设置 PLL 时钟来源为 HSE,设置 PLL 倍频因子

41 // PLLCLK = 4MHz * pllmul

42 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);

43 //-- -----------------------------------------------------//

44 

45 // 开启 PLL

46 RCC_PLLCmd(ENABLE);

47 

48 // 等待 PLL 稳定

49 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {

50 }

51 

52 // 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLK

53 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

54 

55 // 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟

56 while (RCC_GetSYSCLKSource() != 0x08) {

57 }

58 } else {

59 // 如果 HSI 开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理

60 // 当 HSE 开启失败或者故障的时候,单片机会自动把 HSI 设置为系统时钟,

61 // HSI 是内部的高速时钟,8MHZ

62 while (1) {

63 }

64 }

65 }



HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时钟 SYSCLK只能是 HSI/2*16=4*16=64MHZ。 


函数调用举例:HSI_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:4MHZ * 9 =36MHZ。


3、MCO输出 


在STM32F103中,PA8可以复用为MCO的引脚,对外提供时钟输出,也可以用示波器监控该引脚输出判断系统时钟是否设置正确。


                                        代码清单:MCO初始化

1

1 /*

2 * 初始化 MCO 引脚 PA8

3 * 在 F103 系列中 MCO 引脚只有一个,即 PA8,在 F4 系列中,MCO 引脚有两个

4 */

5 void MCO_GPIO_Config(void)

6 {

7 GPIO_InitTypeDef GPIO_InitStructure;

8 // 开启 GPIOA 的时钟

9 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

10 

11 // 选择 GPIO8 引脚

12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

13 

14 //设置为复用功能推挽输出

15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

16 

17 //设置 IO 的翻转速率为 50M

18 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

19 

20 // 初始化 GPIOA8

21 GPIO_Init(GPIOA, &GPIO_InitStructure);

22 }



                                        代码清单:MCO输出时钟选择

1

1 // 设置 MCO 引脚输出时钟,用示波器即可在 PA8 测量到输出的时钟信号,

2 // 我们可以把 PLLCLK/2 作为 MCO 引脚的时钟来检测系统时钟是否配置准确

3 // MCO 引脚输出可以是 HSE,HSI,PLLCLK/2,SYSCLK

4 //RCC_MCOConfig(RCC_MCO_HSE);

5 //RCC_MCOConfig(RCC_MCO_HSI);

6 //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);

7 RCC_MCOConfig(RCC_MCO_SYSCLK);


初始化MCO引脚后,可以直接调用库函数RCC_MCOConfig()来选择MCO时钟来源。


                                            代码清单:main

1

1 int main(void)

2 {

3 // 程序来到 main 函数之前,启动文件:statup_stm32f10x_hd.s 已经调用

4 // SystemInit()函数把系统时钟初始化成 72MHZ

5 // SystemInit()在 system_stm32f10x.c 中定义

6 // 如果用户想修改系统时钟,可自行编写程序修改

8 // 重新设置系统时钟,这时候可以选择使用 HSE 还是 HSI

10 // 使用 HSE 时,SYSCLK = 8M * RCC_PLLMul_x, x:[2,3,...16],最高是 128M

11 HSE_SetSysClock(RCC_PLLMul_9);

12 

13 // 使用 HSI 时,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是 64MH

14 //HSI_SetSysClock(RCC_PLLMul_16);

15 

16 // MCO 引脚初始化

17 MCO_GPIO_Config();

18 

19 // 设置 MCO 引脚输出时钟,用示波器即可在 PA8 测量到输出的时钟信号,

20 // 我们可以把 PLLCLK/2 作为 MCO 引脚的时钟来检测系统时钟是否配置准确

21 // MCO 引脚输出可以是 HSE,HSI,PLLCLK/2,SYSCLK

22 //RCC_MCOConfig(RCC_MCO_HSE);

23 //RCC_MCOConfig(RCC_MCO_HSI);

24 //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);

25 RCC_MCOConfig(RCC_MCO_SYSCLK);

26 

27 // LED 端口初始化

28 LED_GPIO_Config();

29 while (1) {

30 LED1( ON ); // 亮

31 Delay(0x0FFFFF);

32 LED1( OFF ); // 灭

33 Delay(0x0FFFFF);

34 }

35 }


在main中,可以调用HSE_SetSysClock()或者HSI_SetSysClock()这两个函数把系统时钟设置成为各种常用的时钟,然后通过MCO引脚监控 ,或者通过LED闪烁的快慢体验不同的系统时钟对同一软件延时函数的影响。

关键字:STM32  RCC  HSE  HSI  配置时钟 引用地址:STM32系统学习——RCC(使用HSE/HSI配置时钟)

上一篇:stm32时钟配置 STM32CubeMX配置时钟
下一篇:STM32寄存器列表 RCC时钟相关寄存器

推荐阅读最新更新时间:2024-03-16 16:20

STM32 重新理解GPIO配置以及配置PWM波输出
最近做了个SD卡BOOTLOARDER程序。在测试过程中,想到可以利用板子的LED灯进行萤火虫灯的制作,通过BOOTLOARDER将APP文件下载到板子里面查看LED灯的闪烁。可能是因为太过自信,这么个小程序能搞不定,所以并没有仔细阅读DATASHEET,导致最终费了半天时间才查出原因。 此为引子,便有了这篇文章。 我的板子LED灯引脚为PB5,引脚功能为: 该引脚TIM3_CH2为REMAP功能,引脚配置如下: view plain copy print ? GPIO_InitTypeDef GPIO_InitStructure; /*配置时钟*/ RCC_APB1PeriphClockC
[单片机]
<font color='red'>STM32</font> 重新理解GPIO<font color='red'>配置</font>以及<font color='red'>配置</font>PWM波输出
嵌入式STM32学习笔记(2)——点亮LED灯及用中断让其闪烁
这里直接开始码代码了,至于前期的准备工作比如配置MDK-keil,或配置IAR等,大家可以在网上找对应的教程,这里不赘述了;直接讲代码如何撸吧,代码里我做了详细注释: 1)编译器IAR8,系统win10; 2)板子:STM32F103C8T6核心板,如下: 3)下载器:ST-LINK/V2仿真下载器; 4)板子上LED对应的引脚是GPIOC, GPIO_Pin_13;在IAR对应的stm32F103X模板DRIVER目录下添加:led.c,led.h,timer.c,timer.h文件,如下: 5)led.c 代码如下: #include led.h /*LED_G 驱动 GPIO 初始化函数*/ vo
[单片机]
嵌入式<font color='red'>STM32</font>学习笔记(2)——点亮LED灯及用中断让其闪烁
使用Keil MDK运行第一个STM32程序
1.1.1 使用Keil MDK运行第一个STM32F10X程序 在上一小节中已经详细介绍了使用Keil MDK和标准外设库创建一个工程的过程,下面将介绍基于这个工程来编写一个小程序,通过这个程序我们可以初步了解: STM32标准外设库的简单使用过程 STM32外设的使用方法和大致流程 程序的编译、链接、下载步骤 利用Keil MDK的在线仿真功能进行软件仿真的简要步骤 1. 程序的编写 (1)程序实现的功能 为了方便各位读者的入门和理解,这个小程序的功能非常简单,作为本书功能实践的第一个程序,其功能当然也是最为经典的“Hello World!”了,只不过不是简单的屏幕输出,而是利用硬件的串口进行输出,同时作为单
[单片机]
使用Keil MDK运行第一个<font color='red'>STM32</font>程序
8、STM32定时器原理与使用(内附代码)
1.定义 设置等待时间,到达等待时间之后执行指定的硬件操作。 定时器最基本的功能就是定时,比如说定时发送串口数据,定时采集AD数据,也可以产生PWM方波等,定时器产生PWM控制电机状态是工业控制的普通。 2、STM32F4xx系列的芯片:2个高级控制定时器(TIM1和TIM8)、10个通用定时器(10TIM2-TIM5,TIM9-TIM14)、2个基本定时器(TIM6和TIM7)、2个看门狗定时器 具体可参考中文参考手册了解其特性及原理 3、定时器计数模式: 通用定时器可以向上计数、向下计数、向上向下双向计数模式。 ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且
[单片机]
8、<font color='red'>STM32</font>定时器原理与使用(内附代码)
STM32 对内部FLASH读写接口函数
简介:因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。 原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from th
[单片机]
STM32H7可在STM32上启动安全模块安装
我们启动STM32H7的安全软件安装 (SFI) 功能,并在 STM32 微控制器上启动安全模块安装 (SMI)。当时,利用这些新的硬件安全功能所必需的一些软件解决方案需要更加完善。既然它们已准备好迎接黄金时段,我们决定看看 SMI,看看是什么让 SFI 在 STM32H7 上独一无二,因为新型号代表了我们最新的旗舰安全 MCU。此外,我们还参加了Arm TechCon 2019,并希望突出推动这些设备的一些创新。 SFI 和 SBSFU:安全系统在其生命周期各个阶段的基础 安全固件安装 (SFI) 现在是一种相对流行的技术,它使系统制造商能够将其固件的加密版本发送给 OEM。由于代码只能在 MCU 内部解密,因此开发人员
[单片机]
stm32的HAL库i2c从机实现
stm32的i2c默认就是slave模式,本文基于HAL库实现中断方式的接收和发送,首先是初始化gpio和i2c,代码如下: I2C_HandleTypeDef I2cHandle; void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE() ; __HAL_RCC_GPIOC_CLK_ENABLE() ; /**I2C3 GPIO Configuration PA8 ------ I2C3_SCL PC9 -----
[单片机]
<font color='red'>stm32</font>的HAL库i2c从机实现
FF HSE现场总线概述
FF HSE现场总线   1998年,美国Fieldbus Foundation(FF)基金会决定采用高速以太网(High Speed Ethernet,HSE)技术开发H2现场总线,作为现场总线控制系统控制级以上通信网络的主干网,它与H1现场总线整合构成信息集成开放的体系结构,给出了系统结构。HSE网络遵循标准的以太网规范,并根据过程控制的需要适当增加了一些功能,但这些增加的功能可以在标准的Ethernet结构框架内无缝地进行操作,因而FF HSE总线可以使用当前流行的商用(COTS)以太网设备。100Mbps以太网拓扑是采用交换机形成星形连接,这种交换机具有防火墙功能,以阻断特殊类型的信息出入网络。HSE使用标准的IEEE8
[模拟电子]
FF <font color='red'>HSE</font>现场总线概述
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved