国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F407的時鐘

這篇具有很好參考價值的文章主要介紹了STM32F407的時鐘。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

時鐘源

時鐘源用來為環(huán)形脈沖發(fā)生器提供頻率穩(wěn)定且電平匹配的方波時鐘脈沖信號。它通常由石英 晶體振蕩器和與非門組成的正反饋振蕩電路組成,其輸出送至環(huán)形脈沖發(fā)生器。

為什么 STM32 要有多個時鐘源

F4開發(fā)指南P107
STM32F407的時鐘

F407時鐘地圖

F4開發(fā)指南P108
STM32F407的時鐘

F407的五個時鐘源

HSI高速內(nèi)部時鐘源

High Speed Internal。RC 振蕩器,頻率為 16MHz??梢灾苯幼鳛橄到y(tǒng)時鐘或者用作 PLL輸入。

PLL鎖相環(huán)

  • PLL鎖相環(huán)的作用: F4開發(fā)指南4.3.1,P109STM32F407的時鐘
  • PLL鎖相環(huán)的配置: F4開發(fā)指南4.3.1,P109
    主PLL的計算方法:
    STM32F407的時鐘
  • 先經(jīng)過一個分頻系數(shù)為 M 的分頻器
  • 再經(jīng)過倍頻系數(shù)為 N 的倍頻器
  • 再經(jīng)過一個分頻系數(shù)為 P(第一個輸出 PLLP)或者 Q(第二個輸出 PLLQ)的分頻器
  • 最后才生成最終的主 PLL 時鐘。

若我們的外部晶振選擇 8MHz(HSE時鐘源)。設(shè)置相應(yīng)的分頻器 M=8,倍頻器倍頻系數(shù) N=336,分頻器分頻系數(shù) P=2,那么主 PLL 生成的第一個輸出高速時鐘 PLLP:

PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz

若SYSCLK時鐘源為PLL,那么SYSCLK時鐘為 168MHz。

LSE低速外部時鐘源

Low Speed External 。接頻率為 32.768kHz 的石英晶體。這個主要是 RTC 的時鐘源。

LSI低速內(nèi)部時鐘源

Low Speed Internal。RC 振蕩器,頻率為 32kHz 左右。供獨立看門狗和自動喚醒單元使用。

  • 看門狗時鐘源只能是低速的 LSI 時鐘。

HSE高速外部時鐘源

High Speed External

  • 外部接一個4-16M的晶振,可接石英/陶瓷諧振器
  • 可以作為選擇器1的輸入;
  • 可以÷2分頻之后作為選擇器1的輸入;
  • 經(jīng)過選擇器1之后可以作為選擇器2的輸入,HSI的2分頻之后也作為選擇器2的輸入,之后進入PLL(鎖相環(huán))來倍頻;
  • 也可以直接作為系統(tǒng)時鐘的時鐘源;

F4開發(fā)指南4.3.1,P108與P109

RTC時鐘源

RTC 的時鐘源可以選擇 LSI,LSE,以及HSE 分頻后的時鐘,HSE 分頻系數(shù)為 2~31。

外部晶振/陶瓷諧振器

  • 諧振器和負載電容要求必須盡可能地靠近振蕩器的引腳,減少失真和起振時間。外部用戶時鐘必須使用占空比約為 50% (左右)外部時鐘信號來驅(qū)動 OSC_IN 引腳,同時 OSC_OUT 引腳應(yīng)保持為高阻態(tài)。
  • 外部時鐘源
    STM32F407的時鐘

MCO輸出時鐘

選擇一個時鐘信號輸出到MCO引腳
F4開發(fā)指南P109C
輸出時鐘 MCO1 和 MCO2。
MCO1 是向芯片的 PA8 引腳輸出時鐘。它有四個時鐘來源分別為:HSI,LSE,HSE 和 PLL 時鐘。
MCO2 是向芯片的 PC9 輸出時鐘,它同樣有四個時鐘來源分為:HSE,PLL,SYSCLK 以及 PLLI2S
時鐘。MCO 輸出時鐘頻率最大不超過 100MHz。

系統(tǒng)時鐘

SYSCLK 系統(tǒng)時鐘來源有三個方面:HSI,HSE 和 PLL。
在我們實際應(yīng)用中,因為對時鐘速度要求都比較高我們才會選用 STM32F4 這種級別的處理器,所以一般情況下,都是采用 PLL 作為 SYSCLK時鐘源。也就是上文計算的168M。

  • 以太網(wǎng)PTP時鐘、AHB時鐘、APB1低速時鐘、APB2高速時鐘都是來源于系統(tǒng)時鐘。由系統(tǒng)時鐘分頻得到。
  • AHB最大時鐘為168MHz, APB2高速時鐘最大頻率為84MHz,而APB1低速時鐘最大頻率為 42MHz。

以太網(wǎng)PTP時鐘

直接使用系統(tǒng)時鐘。

AHB預分頻器

是Advanced High performance Bus的縮寫,譯作高級高性能總線,這是一種“系統(tǒng)總線”。

  • AHB主要用于高性能模塊(如CPU、DMA和DSP等)之間的連接。
  • AHB 系統(tǒng)由主模塊、從模塊和基礎(chǔ)結(jié)構(gòu)(Infrastructure)3部分組成,整個AHB總線上的傳輸都由主模塊發(fā)出,由從模塊負責回應(yīng)。
  • 該分頻器有1,2,4,64,16,128,256,512等可以選擇
    • 可以輸出一個HCLOCK,最高72M
    • 可以進入APB1預分頻器,產(chǎn)生PCLK1的時鐘,最高36M,可以掛一些低速的外設(shè)
    • 可以進入APB2預分頻器,產(chǎn)生PCLK2的時鐘,最高72M,可以掛高速外設(shè);2>1

APB預分頻器

Advanced Peripheral Bus,外圍總線
在使用任何的外設(shè)之前,都要使相應(yīng)的時鐘使能位開啟,否則就沒法使用

  • APB1 上面連接的是低速外設(shè),包括電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等
  • APB2 上面連接的是高速外設(shè)包括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。

CSS時鐘監(jiān)控系統(tǒng)

檢測到HSE失敗,就會切換到HSI

I2S時鐘源

來源于 PLLI2S 或者映射到 I2S_CKIN 引腳的外部時鐘。I2S 出于音質(zhì)的考慮,對時鐘精度要求很高。

內(nèi)部以太網(wǎng) MAC 時鐘的來源

對于 MII 接口來說,必須向外部PHY 芯片提供 25Mhz 的時鐘,這個時鐘,可以由 PHY 芯片外接晶振,或者使用STM32F4 的 MCO 輸出來提供。然后,PHY 芯片再給 STM32F4 提供ETH_MII_TX_CLK 和 ETH_MII_RX_CLK 時鐘。
對于 RMII 接口來說,外部必須提供 50Mhz 的時鐘驅(qū)動 PHY 和 STM32F4 的 ETH_RMII_REF_CLK,這個 50Mhz時鐘可以來自 PHY、有源晶振或者 STM32F4 的 MCO
我們的開發(fā)板使用的是RMII 接 口 , 使 用 PHY 芯 片 提 供 50Mhz 時 鐘 驅(qū) 動 STM32F4 的ETH_RMII_REF_CLK。

USB時鐘

外部 PHY 提供的 USB OTG HS(60MHZ)時鐘

系統(tǒng)時鐘(D部分)

系統(tǒng)時鐘的來源

系統(tǒng)時鐘SYSCLK可來源于三個時鐘源:
①、HSI振蕩器時鐘
②、HSE振蕩器時鐘
③、PLL時鐘

系統(tǒng)時鐘的設(shè)置

  • 在我們系統(tǒng)啟動的時候都會調(diào)用SystemInit ,用來設(shè)置系統(tǒng)的整個系統(tǒng)和總線時鐘。
  • SystemInit的執(zhí)行過程:F4開發(fā)指南,4.3.2,P111
    • RCC 時鐘配置寄存器 (RCC_CFGR)可以參考下文的RCC時鐘控制->RCC寄存器
    • SetSysClock的詳細內(nèi)容與執(zhí)行過程,F(xiàn)4開發(fā)指南4.3.2,P113
      STM32F407的時鐘

F407系統(tǒng)初始化時鐘的大小

在System_stm32f4xx.c文件,把PLL第一級分頻系數(shù)M修改為8,這樣達到主時鐘頻率為168MHz。

#define PLL_M 8
#define PLL_Q 7
#define PLL_N 336
#define PLL_P 2

所以我們的主 PLL 時鐘為168MHz。
同時,我們要在stm32f4xx.h里面修改外部時鐘HSE_VALUE值為8MHz

#if !defined   (HSE_V ALUE)  
  #define HSE_V ALUE    ((uint32_t)8000000) /*!< V alue of the External oscillator in Hz */ 
   
#endif /* HSE_V ALUE */ 

這里默認固件庫配置的是 25000000,我們外部時鐘為 8MHz,所以我們根據(jù)我們硬件情況修改為 8000000 即可。

系統(tǒng)時鐘分頻產(chǎn)生三種時鐘。FCLK,HCLK,PCLK都稱為系統(tǒng)時鐘,但區(qū)別如下,

FCLK

  • 提供給CPU內(nèi)核的時鐘信號,CPU的主頻就是指這個信號;

HCLK

  • 提供給高速總線AHB的時鐘信號。是系統(tǒng)時鐘經(jīng)過AHB分頻器而來。

PCLK

提供給低速總線APB的時鐘信號,默認是45MHz;CAN 位時序寄存器(CAN_BTR)

SytemInit調(diào)用

SystemInit 是整個設(shè)置系統(tǒng)時鐘的入口函數(shù)。這個函數(shù)對于我們使用 ST提供的 STM32F4 固件庫的話,會在系統(tǒng)啟動之后先執(zhí)行 main 函數(shù),然后再接著執(zhí)行 SystemInit函數(shù)實現(xiàn)系統(tǒng)相關(guān)時鐘的設(shè)置。這個過程設(shè)置是在啟動文件 startup_stm32f40_41xxx.s 中間設(shè)置的。所以我們不需要再在 main()函數(shù)中調(diào)用 SystemInit()函數(shù)。

總結(jié)一下 SystemInit()函數(shù)中設(shè)置的系統(tǒng)時鐘大?。?br> F4開發(fā)指南4.3.2,P113
STM32F407的時鐘

RCC時鐘使能寄存器

相關(guān)外設(shè)的時鐘實際是在 RCC 相關(guān)寄存器中配置的?!禨TM32F4 中文參考手冊》6.3 小節(jié)。

  • STM32F4 的外設(shè)在使用之前,必須對時鐘進行使能

掛載位置的搜索

  • 要使能 GPIOA,我們只需要在 stm32f4xx_rcc.h 頭文件里面搜索 GPIOA,就可以搜索到對應(yīng)的時鐘使能函數(shù)的第一個入口參數(shù)為RCC_AHB1Periph_GPIOA,從這個宏定義標識符一眼就可以看出,GPIOA 是掛載在 AHB1 下面。

RCC_AHB1PeriphClockCmd

RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

RCC_AHB1Periph

  *            @arg RCC_AHB1Periph_GPIOA:       GPIOA clock
  *            @arg RCC_AHB1Periph_GPIOB:       GPIOB clock 
  *            @arg RCC_AHB1Periph_GPIOC:       GPIOC clock
  *            @arg RCC_AHB1Periph_GPIOD:       GPIOD clock
  *            @arg RCC_AHB1Periph_GPIOE:       GPIOE clock
  *            @arg RCC_AHB1Periph_GPIOF:       GPIOF clock
  *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock
  *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock
  *            @arg RCC_AHB1Periph_GPIOI:       GPIOI clock
  *            @arg RCC_AHB1Periph_GPIOJ:       GPIOJ clock (STM32F42xxx/43xxx devices) 
  *            @arg RCC_AHB1Periph_GPIOK:       GPIOK clock (STM32F42xxx/43xxx devices)  
  *            @arg RCC_AHB1Periph_CRC:         CRC clock
  *            @arg RCC_AHB1Periph_BKPSRAM:     BKPSRAM interface clock
  *            @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock
  *            @arg RCC_AHB1Periph_DMA1:        DMA1 clock
  *            @arg RCC_AHB1Periph_DMA2:        DMA2 clock
  *            @arg RCC_AHB1Periph_DMA2D:       DMA2D clock (STM32F429xx/439xx devices)  
  *            @arg RCC_AHB1Periph_ETH_MAC:     Ethernet MAC clock
  *            @arg RCC_AHB1Periph_ETH_MAC_Tx:  Ethernet Transmission clock
  *            @arg RCC_AHB1Periph_ETH_MAC_Rx:  Ethernet Reception clock
  *            @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock
  *            @arg RCC_AHB1Periph_OTG_HS:      USB OTG HS clock
  *            @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock

NewState

ENABLE/DISABLE;

RCC_AHB2PeriphClockCmd

RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)

RCC_AHB2Periph

  *            @arg RCC_AHB2Periph_DCMI:   DCMI clock
  *            @arg RCC_AHB2Periph_CRYP:   CRYP clock
  *            @arg RCC_AHB2Periph_HASH:   HASH clock
  *            @arg RCC_AHB2Periph_RNG:    RNG clock
  *            @arg RCC_AHB2Periph_OTG_FS: USB OTG FS clock

RCC_AHB3PeriphClockCmd

RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState)

RCC_AHB3Periph

RCC_AHB3Periph_FSMC

RCC_AHB3Periph_FMC (STM32F42xxx/43xxx devices)  

RCC_APB1PeriphClockCmd

RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

RCC_APB1Periph

  *            @arg RCC_APB1Periph_TIM2:   TIM2 clock
  *            @arg RCC_APB1Periph_TIM3:   TIM3 clock
  *            @arg RCC_APB1Periph_TIM4:   TIM4 clock
  *            @arg RCC_APB1Periph_TIM5:   TIM5 clock
  *            @arg RCC_APB1Periph_TIM6:   TIM6 clock
  *            @arg RCC_APB1Periph_TIM7:   TIM7 clock
  *            @arg RCC_APB1Periph_TIM12:  TIM12 clock
  *            @arg RCC_APB1Periph_TIM13:  TIM13 clock
  *            @arg RCC_APB1Periph_TIM14:  TIM14 clock
  *            @arg RCC_APB1Periph_WWDG:   WWDG clock
  *            @arg RCC_APB1Periph_SPI2:   SPI2 clock
  *            @arg RCC_APB1Periph_SPI3:   SPI3 clock
  *            @arg RCC_APB1Periph_USART2: USART2 clock
  *            @arg RCC_APB1Periph_USART3: USART3 clock
  *            @arg RCC_APB1Periph_UART4:  UART4 clock
  *            @arg RCC_APB1Periph_UART5:  UART5 clock
  *            @arg RCC_APB1Periph_I2C1:   I2C1 clock
  *            @arg RCC_APB1Periph_I2C2:   I2C2 clock
  *            @arg RCC_APB1Periph_I2C3:   I2C3 clock
  *            @arg RCC_APB1Periph_CAN1:   CAN1 clock
  *            @arg RCC_APB1Periph_CAN2:   CAN2 clock
  *            @arg RCC_APB1Periph_PWR:    PWR clock
  *            @arg RCC_APB1Periph_DAC:    DAC clock
  *            @arg RCC_APB1Periph_UART7:  UART7 clock
  *            @arg RCC_APB1Periph_UART8:  UART8 clock

RCC_APB2PeriphClockCmd

void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)

RCC_APB2Periph

  *            @arg RCC_APB2Periph_TIM1:   TIM1 clock
  *            @arg RCC_APB2Periph_TIM8:   TIM8 clock
  *            @arg RCC_APB2Periph_USART1: USART1 clock
  *            @arg RCC_APB2Periph_USART6: USART6 clock
  *            @arg RCC_APB2Periph_ADC1:   ADC1 clock
  *            @arg RCC_APB2Periph_ADC2:   ADC2 clock
  *            @arg RCC_APB2Periph_ADC3:   ADC3 clock
  *            @arg RCC_APB2Periph_SDIO:   SDIO clock
  *            @arg RCC_APB2Periph_SPI1:   SPI1 clock
  *            @arg RCC_APB2Periph_SPI4:   SPI4 clock
  *            @arg RCC_APB2Periph_SYSCFG: SYSCFG clock
  *            @arg RCC_APB2Periph_TIM9:   TIM9 clock
  *            @arg RCC_APB2Periph_TIM10:  TIM10 clock
  *            @arg RCC_APB2Periph_TIM11:  TIM11 clock
  *            @arg RCC_APB2Periph_SPI5:   SPI5 clock
  *            @arg RCC_APB2Periph_SPI6:   SPI6 clock
  *            @arg RCC_APB2Periph_SAI1:   SAI1 clock (STM32F42xxx/43xxx devices) 
  *            @arg RCC_APB2Periph_LTDC:   LTDC clock (STM32F429xx/439xx devices) 

時鐘源配置

時鐘源使能函數(shù)

void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);

這些函數(shù)是用來使能相應(yīng)的時鐘源。

RCC_PLLCmd(ENABLE);

我們要使能相應(yīng)的時鐘源,調(diào)用對應(yīng)的函數(shù)即可。

時鐘源配置函數(shù)

void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM,
uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);

設(shè)置系統(tǒng)時鐘源為 HSI:RCC_HCLKConfig(RCC_SYSCLKSource_HSI);//配置時鐘源為 HSI
設(shè)置 APB1 總線時鐘為 HCLK 的 2 分頻:RCC_PCLK1Config(RCC_HCLK_Div2);

外設(shè)復位函數(shù)

void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

復位對應(yīng)的外

RCC時鐘控制

何為RCC

RCC,Reset and Clock Control(復位和時鐘控制),在絕大部分MCU芯片中都包含復位和時鐘控制模塊,也是MCU重要的組成部分。
主要用來設(shè)置系統(tǒng)時鐘 SYSCLK 、設(shè)置 AHB 分頻因子(決定 HCLK 等于多少)、設(shè)置 APB2 分頻因子(決定 PCLK2 等于多少)、設(shè)置 APB1 分頻因子(決定 PCLK1 等于多少)、設(shè)置各個外設(shè)的分頻因子;控制 AHB 、 APB2 和 APB1 這三條總線時鐘的開啟、控制每個外設(shè)的時鐘的開啟。

RCC寄存器

AHB1

STM32F407的時鐘

AHB2

STM32F407的時鐘

APB1 外設(shè)時鐘使能寄存器(RCC_APB1ENR)

STM32F407的時鐘

APB2 外設(shè)時鐘使能寄存器(RCC_APB2ENR)

STM32F407的時鐘用于 STM32F405xx/07xx 和 STM32F415xx/17xx 。

STM32F407的時鐘

CR寄存器

可以使能HSI、HSE、CSS、PLL,使能之后才能被打開和使用。使能之后不能立馬穩(wěn)定,所以需要一個標志位判斷時鐘是否穩(wěn)定,叫做就緒標志位。

CFGR寄存器

F4中文參考手冊,6.3.3,P118
設(shè)置時鐘源的選擇和分頻系數(shù)。
STM32F407的時鐘

PPRE2,APB2分頻

STM32F407的時鐘

PPRE1,APB1分頻

STM32F407的時鐘

HPRE,AHB分頻

STM32F407的時鐘

F407外設(shè)時鐘使能:

官方庫提供了五個打開 GPIO 和外設(shè)時鐘的函數(shù)分別為:

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

AHB1
STM32F407的時鐘

AHB2
STM32F407的時鐘

AHB3
STM32F407的時鐘

APB1
STM32F407的時鐘

APB2
STM32F407的時鐘

其他外設(shè)時鐘配置:

 RCC_ADCCLKConfig ()
  RCC_RTCCLKConfig();

狀態(tài)參數(shù)獲取參數(shù):

RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus()

RCC中斷相關(guān)函數(shù) :

 RCC_ITConfig()
  RCC_GetITStatus() 
   RCC_ClearITPendingBit()

RCC配置結(jié)構(gòu)體

typedef struct
{
  __IO uint32_t CR;       //HSI,HSE,CSS,PLL等的使能和就緒標志位 
  __IO uint32_t CFGR;     //PLL等的時鐘源選擇,分頻系數(shù)設(shè)定
  __IO uint32_t CIR;      // 清除/使能 時鐘就緒中斷
  __IO uint32_t APB2RSTR;  //APB2線上外設(shè)復位寄存器
  __IO uint32_t APB1RSTR;   //APB1線上外設(shè)復位寄存器
  __IO uint32_t AHBENR;    //DMA,SDIO等時鐘使能
  __IO uint32_t APB2ENR;   //APB2線上外設(shè)時鐘使能
  __IO uint32_t APB1ENR;   //APB1線上外設(shè)時鐘使能
  __IO uint32_t BDCR;        //備份域控制寄存器
  __IO uint32_t CSR;           //控制狀態(tài)寄存器
} RCC_TypeDef;

RTC時鐘

RTC時鐘介紹

  • 全稱為:實時時鐘Real time clock ,一個獨立的定時器。本質(zhì)上是一個掉電后還可以繼續(xù)運行的定時器。
  • 時鐘來源:F4開發(fā)指南297
    • STM32F4的 RTC時鐘源 RTCCLK 通過時鐘控制器,可以從 LSE時鐘、 LSI時鐘以及HSE時鐘三者中選擇。
    • 一般我們選擇 LSE,即外部 32.768Khz 晶振作為時鐘源(RTCCLK)
    • RTC 時鐘核心,要求提供 1Hz 的時鐘
  • RTC的四種功能:F4開發(fā)指南20.1,P297
    • STM32F4 的 RTC 日歷時間(RTC_TR)和日期(RTC_DR)寄存器,用于存儲時間和日期
    • 這些時間與日期可以通過與 PCLK1(APB1 時鐘)同步的影子寄存器來訪問,也可以通過時間和日期寄存器直接訪問,這樣可避免等待同步的持續(xù)時間。
  • 可編程鬧鐘
    • STM32F4 提供兩個可編程鬧鐘:鬧鐘 A(ALARM_A)和鬧鐘 B(ALARM_B)。
    • 通過 RTC_CR寄存器的 ALRAE 和 ALRBE 位置 1 來使能可編程鬧鐘功能。
    • 當日歷的亞秒、秒、分、小時、日期分別與鬧鐘寄存器 RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/RTC_ALRMBR中的值匹配時,則可以產(chǎn)生鬧鐘(需要適當配置)。
  • 周期性自動喚醒
    • STM32F4 的 RTC 不帶秒鐘中斷了,但是多了一個周期性自動喚醒功能。
    • 周期性喚醒功能,由一個 16 位可編程自動重載遞減計數(shù)器(RTC_WUTR)生成,可用于周期性中斷/喚醒。
    • 可以通過 RTC_CR 寄存器中的 WUTE 位設(shè)置使能此喚醒功能
  • 取消RTC模塊寫保護:F4開發(fā)指南20.1,P296

RTC時鐘框圖及解析

STM32F407的時鐘

RTC 由兩個主要部分組成
第一部分(APB1 接口)用來和 APB1 總線相連。
此單元還包含一組 16 位寄存器,可通過 APB1 總線對其進行讀寫操作。
APB1 接口由 APB1 總線時鐘驅(qū)動,用來與 APB1 總線連接。
另一部分(RTC 核心)由一組可編程計數(shù)器組成,分成兩個主要模塊。
第一個模塊是 RTC 的預分頻模塊,它可編程產(chǎn)生 1 秒的 RTC 時間基準 TR_CLK。
RTC 的預分頻模塊包含了一個 20位的可編程分頻器(RTC 預分頻器)。
如果在 RTC_CR 寄存器中設(shè)置了相應(yīng)的允許位,則在每個TR_CLK 周期中 RTC 產(chǎn)生一個中斷(秒中斷)。
第二個模塊是一個 32 位的可編程計數(shù)器(RTC_CNT),可被初始化為當前的系統(tǒng)時間,一個 32 位的時鐘計數(shù)器,按秒鐘計算,可以記錄 4294967296 秒,約合 136 年左右。
RTC 還有一個鬧鐘寄存器 RTC_ALR,用于產(chǎn)生鬧鐘。系統(tǒng)時間按 TR_CLK 周期累加并與存儲在 RTC_ALR 寄存器中的可編程時間相比較,如果 RTC_CR 控制寄存器中設(shè)置了相應(yīng)允許位,比較匹配時(即:RTC_CNT=RTC_ALR 時)將產(chǎn)生一個鬧鐘中斷,從而實現(xiàn)鬧鐘功能。

軟件是通過 APB1 接口訪問 RTC 的預分頻值、計數(shù)器值和鬧鐘值的
但RTC 內(nèi)核完全獨立于 RTC APB1 接口
相關(guān)可讀寄存器只在 RTC APB1 時鐘進行重新同步的 RTC 時鐘的上升沿被更新,RTC 標志也是如此。
這就意味著,如果 APB1 接口剛剛被開啟之后,在第一次的內(nèi)部寄存器更新之前,從 APB1 上讀取的 RTC 寄存器值可能被破壞了(通常讀到 0)。
因此,若在讀取 RTC 寄存器曾經(jīng)被禁止的 RTC APB1 接口,軟件首先必須等待 RTC_CRL 寄存器的 RSF位(寄存器同步標志位,bit3)被硬件置 1。

RTC的寄存器

RTC 的控制寄存器RTC_CR

RTC總共有 2 個控制寄存器 RTC_CRH 和 RTC_CRL,該寄存器用來控制中斷的,若要用到秒鐘中斷,該寄存器必須設(shè)置最低位為 1,以允許秒鐘中斷。

RTC_CRL 寄存器

第 0 位是秒鐘標志位,我們在進入 RTC中斷的時候,通過判斷這位來決定是不是發(fā)生了秒鐘中斷。
然后必須通過軟件將該位清零(寫0)。
第 1 位是鬧鐘標志位,當 RTC_CNT 的值等于 RTC_ALR 的值時,此位將由硬件置 1(可以判斷此位是否為 1 來判定是否產(chǎn)生了鬧鐘),如果設(shè)置了鬧鐘中斷(ALRIE=1),則將產(chǎn)生 RTC鬧鐘中斷,該位也必須軟件寫 0 清除。
第 3 位為寄存器同步標志位,我們在修改控制寄存器 RTC_CRH/CRL 之前,必須先判斷該位,是否已經(jīng)同步了,如果沒有則等待同步,在沒同步的情況下修改 RTC_CRH/CRL 的值是不行的。
第 4 位為配置標位,在軟件修改 RTC_CNT/RTC_ALR/RTC_PRL 的值的時候,必須先軟件置位該位,以允許進入配置模式。
第 5 位為 RTC 操作位,該位由硬件操作,軟件只讀。通過該位可以判斷上次對 RTC 寄存器的操作是否完成,如果沒有,我們必須等待上一次操作結(jié)束才能開始下一次操作。

RTC 預分頻裝載寄存器

2 個寄存器組成,RTC_PRLH 和RTC_PRLL。
這兩個寄存器用來配置 RTC 時鐘的分頻數(shù)的。
比如我們使用外部 32.768K 的晶振作為時鐘的輸入頻率,那么我們要設(shè)置這兩個寄存器的值為 32767,以得到一秒鐘的計數(shù)頻率。
RTC_PRLH 的各位描述
STM32F407的時鐘

RTC_PRLH 只有低四位有效,用來存儲 PRL 的 19~16 位。而 PRL的前 16 位,存放在 RTC_PRLL 里面,寄存器 RTC_PRLL 的各位描述
STM32F407的時鐘

RTC 預分頻器余數(shù)寄存器

該寄存器也有 2 個寄存器組成 RTC_DIVH 和 RTC_DIVL
這兩個寄存器的作用就是用來獲得比秒鐘更為準確的時鐘,
比如可以得到 0.1 秒,或者 0.01 秒等。
該寄存器的值自減的,用于保存還需要多少時鐘周期獲得一個秒信號。
在一次秒鐘更新后,由硬件重新裝載。這兩個寄存器和 RTC 預分頻裝載寄存器的各位是一樣的

RTC 計數(shù)器寄存器 RTC_CNT

該寄存器由 2 個 16位的寄存器組成 RTC_CNTH 和 RTC_CNTL,總共 32 位,用來記錄秒鐘值(TR_CLK=1Hz 的
情況下)。一般我們設(shè)置時間,就是設(shè)置 RTC_CNTH/RTC_CNTL 寄存器的值。
假定我們以 1970年為起始時間,那么當 RTC_CNTH=RTC_CNTL=0 的時候,就代表 1970 年 1 月 1 日 0 時 0 分,
這樣就可以很方便的根據(jù) RTC_CNT 的值計算當前時間了。
反過來,如果要設(shè)置時間,則只需要將當前時間的年份減去 1970,然后剩下的時間換算成秒鐘,寫入 RTC_CNT 即可完成時間設(shè)置。

鬧鐘寄存器 RTC_ALR

該寄存器同 RTC_CNT 一樣,也是由 2 個 16位的寄存器組 RTC_ALRH 和 RTC_ALRL 組成,總共 32 位,用來記錄鬧鐘時刻,實際上,RTC_ALR 就是一個用于同 RTC_CNT 比較的寄存器,當 RTC_CNT=RTC_ALR 的時候,就說明鬧鐘時間到了,需要鬧鈴。
因此 RTC_ALR 的設(shè)置和讀取完全同 RTC_CNT 一模一樣。
假定我們設(shè)置RTC_CNTH=RTC_CNTL=0,然后設(shè)置RTC_ALRH=0且RTC_ALRL=30,然后啟動RTC,
那么 30 秒鐘后,ALRF 將為 1,表示有鬧鐘產(chǎn)生,如果開啟了鬧鐘中斷(ALRIE=1),那么將產(chǎn)生鬧鐘中斷,這就是 STM32F1 的 RTC 鬧鐘原理。

備份區(qū)域控制寄存器RCC_BDCR

STM32F407的時鐘

RTC 的時鐘源選擇及使能設(shè)置都是通過這個寄存器來實現(xiàn)的,所以我們在 RTC 操作之前先要通過這個寄存器選擇 RTC 的時鐘源,然后才能開始其他的操作。

RTC 配置步驟

使能電源時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能 PWR 時鐘

PWR:F4中文參考手冊6.3.15,P139,Bit28

取消備份區(qū)寫保護

PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問

PWR_BackupAccessCmd:F1固件庫使用手冊14.2.2,P189

開啟外部低速振蕩器

RCC_LSEConfig(RCC_LSE_ON);// 開啟外部低速振蕩器

F1固件庫使用手冊15.2.16,P204,注意參數(shù)不完全一致。

選擇 RTC 時鐘,并使能

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //設(shè)選擇 LSE 作為 RTC 時鐘
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘

RCC_RTCCLKConfig F1固件庫使用手冊15.2.18,P205
STM32F407的時鐘

初始化 RTC,設(shè)置 RTC 的分頻

ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
 
typedef struct
{
uint32_t RTC_HourFormat;
uint32_t RTC_AsynchPrediv;
uint32_t RTC_SynchPrediv;
}RTC_InitTypeDef;
  • RTC_HourFormat 如果設(shè)置為 24 小時格式參數(shù)值可選擇 RTC_HourFormat_24,12 小時格式,參數(shù)值可以選擇 RTC_HourFormat_24。 F4中文參考手冊23.6.3控制寄存器CR,P589,Bit6

    • 位 6 FMT:小時格式 (Hour format)
      0:24 小時/天格式
      1:AM/PM 小時格式
  • 參數(shù) RTC_AsynchPrediv 用來設(shè)置 RTC 的異步預分頻系數(shù),也就是設(shè)置 RTC_PRER 預分頻器寄存器的 PREDIV_A 相關(guān)位。同時,因為異步預分頻系數(shù)是 7 位,所以最大值為 0x7F,不能超過這個值。
    STM32F407的時鐘

  • 參數(shù) RTC_SynchPrediv 用來設(shè)置 RTC 的同步預分頻系數(shù),也就是設(shè)置 RTC_PRER 寄存器的 PREDIV_S 相關(guān)位。同時,因為同步預分頻系數(shù)也是 15 位,所以最大值為 0x7FFF,不能超過這個值。

要想明白同步和異步要達到的目的,可以參考F4中文參考手冊23.3.1,P574。

同步和異步通道的區(qū)別在于同步發(fā)過去消息會發(fā)生阻塞,直到返回值才繼續(xù)運行。

設(shè)置 RTC 的時間


ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);

typedef struct
{
uint8_t RTC_Hours;
uint8_t RTC_Minutes;
uint8_t RTC_Seconds;
uint8_t RTC_H12;
}RTC_TimeTypeDef;

STM32F407的時鐘
最后一個參數(shù)的取值范圍:
STM32F407的時鐘

別用來設(shè)置 RTC 時間參數(shù)的小時,分鐘,秒鐘,以及 AM/PM 符號

設(shè)置 RTC 的日期

 ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
 typedef struct
{
uint8_t RTC_WeekDay;
uint8_t RTC_Month;
uint8_t RTC_Date;
uint8_t RTC_Year;
}RTC_DateTypeDef;

設(shè)置日期的星期幾,月份,日期,年份。

獲取 RTC 當前日期和時間

獲取當前 RTC 時間的函數(shù)為:

void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);

獲取當前 RTC 日期的函數(shù)為:

void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);

最終代碼

u8 My_RTC_Init(void)
{
RTC_InitTypeDef RTC_InitStructure;
u16 retry=0X1FFF;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能 PWR 時鐘
PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問
if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)//是否第一次配置?
{
RCC_LSEConfig(RCC_LSE_ON);//LSE 開啟
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
//檢查指定的 RCC 標志位設(shè)置與否,等待低速晶振就緒
{ retry++;
delay_ms(10);
}
if(retry==0)return 1; //LSE 開啟失敗.
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘
RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC 異步分頻系數(shù)(1~0X7F)
RTC_InitStructure.RTC_SynchPrediv = 0xFF;//RTC 同步分頻系數(shù)(0~7FFF)
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//24 小時格式
RTC_Init(&RTC_InitStructure);//初始化 RTC 參數(shù)
RTC_Set_Time(23,59,56,RTC_H12_AM); //設(shè)置時間
RTC_Set_Date(14,5,5,1); //設(shè)置日期
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050); //標記已經(jīng)初始化過了
}
return 0;
}

窗口看門狗時鐘

介紹

  • 窗口看門狗(WWDG Window Watch Dog Gou)通常被用來監(jiān)測由外部干擾或不可預見的邏輯條件造成的應(yīng)用程序背離正常的運行序列而產(chǎn)生的軟件故障。
  • 之所以稱為窗口就是因為其喂狗時間是一個有上下限的范圍內(nèi)(窗口),你可以通過設(shè)定相關(guān)寄存器,設(shè)定其上限時間(下限固定)。喂狗的時間不能過早也不能過晚。
  • 喂狗就是窗口看門狗的計數(shù)器T[6:0]被更新。
    STM32F407的時鐘

窗口看門狗的必要性

  • 對于一般的看門狗,程序可以在它產(chǎn)生復位前的任意時刻刷新看門狗,但這有一個隱患,有可能程序跑亂了又跑回到正常的地方,或跑亂的程序正好執(zhí)行了刷新看門狗操作,這樣的情況下一般的看門狗就檢測不出來了;
  • 如果使用窗口看門狗,程序員可以根據(jù)程序正常執(zhí)行的時間設(shè)置刷新看門狗的一個時間窗口,保證不會提前刷新看門狗也不會滯后刷新看門狗,這樣可以檢測出程序沒有按照正常的路徑運行非正常地跳過了某些程序段的情況

復位原理

W[6:0]即是 WWDG->CFR 的低七位。T[6:0]就是窗口看門狗的計數(shù)器,而 W[6:0]則是窗口看門狗的上窗口,下窗口值是固定的(0X40)。

  • 遞減計數(shù)器的值在 T6 位(WWDG->CR 的第六位)如果在變成 0 前不被刷新,看門狗電路在達到預置的時間周期時,會產(chǎn)生一個 MCU 復位。
  • 在遞減計數(shù)器達到窗口配置寄存器(WWDG->CFR)數(shù)值之前,如果 7 位的遞減計數(shù)器數(shù)值(在控制寄存器中)被刷新,也就是CFR寄存器被寫入, 那么也將產(chǎn)生一個 MCU 復位。
    STM32F407的時鐘

窗口看門狗超時時間

窗口看門狗的超時公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超時時間(單位為 ms)
Fpclk1:APB1 的時鐘頻率(單位為 Khz)
WDGTB:WWDG 的預分頻系數(shù)
T[5:0]:窗口看門狗的計數(shù)器低 6 位
STM32F407的時鐘

窗口看門狗的寄存器

控制寄存器(WWDG_CR)

STM32F407的時鐘

T6-0 看門狗計數(shù)器值

WWDG_CR 只有低八位有效,T[6:0]用來存儲看門狗的計數(shù)器值,隨時更新的,每個窗口看門狗計數(shù)周期(4096×2^ WDGTB)減 1。當該計數(shù)器的值從 0X40 變?yōu)?0X3F 的時候,將產(chǎn)生看門狗復位。

WDGA 看門狗激活位

看門狗的激活位,該位由軟件置 1,以啟動看門狗,并且一定要注意的是該位一旦設(shè)置,就只能在硬件復位后才能清零了。

配置寄存器(WWDG_CFR)

中文參考手冊19.6.2
STM32F407的時鐘

9 EWI early wakeup interrupt

如果啟動了看門狗并且允許中斷,當遞減計數(shù)器等于0x40時產(chǎn)生早期喚醒中斷(EWI),它可以用于喂狗以避免WWDG復位。

  • 提前喚醒中斷,也就是在快要產(chǎn)生復位的前一段時間(T[6:0]=0X40)來提醒我們,需要進行喂狗了,否則將復位!
  • 一般用該位來設(shè)置中斷,當窗口看門狗的計數(shù)器值減到 0X40 的時候,如果該位設(shè)置,并開啟了中斷,則會產(chǎn)生中斷,我們可以在中斷里面向 WWDG_CR 重新寫入計數(shù)器的值,來達到喂狗的目的。
  • 進入中斷后,必須在不大于 1 個窗口看門狗計數(shù)周期的時間(在 PCLK1 頻率為 36M 且 WDGTB 為 0 的條件下,該時間為 113us)內(nèi)重新寫 WWDG_CR,否則,看門狗將產(chǎn)生復位!
8-7 WDGTB 預分頻

STM32F407的時鐘

6-0 W[6:0] 7位窗口值

STM32F407的時鐘

狀態(tài)寄存器(WWDG_SR)

用來記錄當前是否有提前喚醒的標志。該寄存器僅有位 0 有效,其他都是保留位。
當計數(shù)器值達到 40h 時,此位由硬件置 1。它必須通過軟件寫 0 來清除。對此位寫 1 無效。即使中斷未被使能,在計數(shù)器的值達到 0X40的時候,此位也會被置 1。

使用步驟

使能看門狗時鐘

RCC_APB1PeriphClockCmd();

設(shè)置分頻系數(shù)

WWDG_SetPrescaler();

設(shè)置上窗口值

WWDG_SetWindowValue();

開啟提前喚醒中斷并分組(可選)

WWDG_EnableIT();
NVIC_Init();

使能看門狗

WWDG_Enable();

喂狗

WWDG_SetCounter();

編寫中斷服務(wù)函數(shù)

WWDG_IRQHandler();文章來源地址http://www.zghlxwxcb.cn/news/detail-496268.html

到了這里,關(guān)于STM32F407的時鐘的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32F407的介紹

    STM32F407的介紹

    內(nèi)核 32位 高性能ARM Cortex-M4處理器 時鐘: 高達168MHz,實際還可以超頻一點點 stm32f407的主頻通過PLL倍頻后能夠達到168MHz,而且芯片內(nèi)置一個16MHz的晶振和一個32KHz的晶振,可以滿足不同功耗的需求。 支持FPU(浮點運算)和DSP指令 144引腳 114個IO口 存儲器容量: 1024K FLASH, 192K

    2024年02月10日
    瀏覽(31)
  • 初識 STM32和STM32F407簡介

    初識 STM32和STM32F407簡介

    2007 年 6 月,ST 在北京發(fā)布了全球第一款基于 ARM Cortex M3 內(nèi)核的 32 位通用微控制 器芯片:STM32F103,以優(yōu)異的性能,豐富的資源,超高的性價比,迅速占領(lǐng)市場,從此一鳴 驚人,一發(fā)不可收拾,截止到 2020 年 6 月,STM32 累計出貨量超過 45 億顆。 戰(zhàn)艦開發(fā)板使用的 STM32F103ZET6

    2023年04月08日
    瀏覽(23)
  • STM32F407的PWM

    STM32F407的PWM

    泉水 STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產(chǎn)生 PWM 輸出。 高級定時器 TIM1 和 TIM8 可以同時產(chǎn)生多達 7 路的 PWM 輸出。 通用定時器也能同時產(chǎn)生多達 4路的 PWM 輸出 STM32F407 最多可以同時產(chǎn)生 30 路 PWM 輸出! 這里我們僅利用 TIM14的 CH1 產(chǎn)生一路 PWM 輸出。 如上所

    2024年02月17日
    瀏覽(20)
  • STM32F407 移植 FreeRTOS

    STM32F407 移植 FreeRTOS

    本實驗是基于正點原子 STM32F407ZG 探索者開發(fā)板完成的,所以需要一個STM32F407ZG 探索者開發(fā)板 用于移植的基礎(chǔ)工程(下面會講) FreeRTOS源碼(下面會講) 本實驗所有用到的代碼:基于正點原子STM32F407的FreeRTOS移植工程.zip 1.1 移植前準備 1.1.1 基礎(chǔ)工程 由于后續(xù)需要用到 LED、

    2024年02月08日
    瀏覽(28)
  • STM32F407 --USART使用

    目錄 1. 串口配置--普通模式 2. 實現(xiàn)數(shù)據(jù)的傳輸主函數(shù) 1)單引號雙引號的應(yīng)用數(shù)組傳輸 2)將調(diào)試信息用串口打印傳送到電腦上 1. 串口配置--普通模式 F407使用的M4內(nèi)核與F103使用的M3內(nèi)核不一樣,導致在使用配置上有區(qū)別。需要在F103配置的基礎(chǔ)上專門將GPIO的PIN配置成復用功能

    2024年02月16日
    瀏覽(26)
  • STM32F407 滴答定時器

    STM32F407 滴答定時器

    介紹STM32F407滴答定時器配置方法、使用方式,封裝延時函數(shù)得到精確的時間。 STM32F407參考手冊中第10章介紹了滴答定時器的校準值。 M4權(quán)威指南介紹滴答定時器的章節(jié),M3權(quán)威指南中與M4權(quán)威指南中的介紹一樣。 在sys.c文件中增加滴答定時器的代碼 在delay.c文件增加以下代碼

    2024年02月11日
    瀏覽(30)
  • 基于STM32F407的智能門鎖

    基于STM32F407的智能門鎖

    ????????在消費升級滲透在各個領(lǐng)域的今天,國民消費發(fā)生著巨大的變化,與每個人息息相關(guān)的家居行業(yè)也是如此。現(xiàn)今,越來越多的智能家居產(chǎn)品出現(xiàn)在普通老百姓的生活中,智能照明、智能窗簾、智能掃地機器人等各種智能產(chǎn)品都給人們的生活帶來了極大的便利。智能

    2024年02月11日
    瀏覽(21)
  • STM32F407添加DSP庫

    STM32F407添加DSP庫

    編譯程序出現(xiàn)以下報錯 出現(xiàn) “error: #5: cannot open source input file “arm_const_structs.h”: No such file or directory” 錯誤的原因是編譯器無法找到名為 “arm_const_structs.h” 的頭文件。 頭文件路徑錯誤 頭文件未安裝或丟失 編譯器配置問題 添加DSP庫 添加DSP庫可以參考這篇博客: STM32CubeMX關(guān)

    2024年02月05日
    瀏覽(35)
  • STM32F407 電機編碼器測量

    STM32F407 電機編碼器測量

    STM32的定時器功能非常強大,根據(jù)官方手冊,定時器的功能如下 高級定時器 TIM1 和 TIM8 主要特性 TIM1 和 TIM8 定時器具有以下特性: ● 16 位遞增、遞減、遞增/遞減自動重載計數(shù)器。 ● 16 位可編程預分頻器,用于對計數(shù)器時鐘頻率進行分頻(即運行時修改),分頻系數(shù) 介于

    2023年04月08日
    瀏覽(65)
  • STM32F407移植OpenHarmony筆記1

    參考文檔: OpenAtom OpenHarmony width=device-width,initial-scale=1.0 https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/get-code/gettools-acquire.md/ 搭建環(huán)境 安裝linux系統(tǒng): Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-91-generic x86_64) 下載源代碼:我選擇的是V3.2.4版本 https://repo.huaweicloud.com/openharmony/os/3.2.4/code-v3.2.4-Rele

    2024年01月25日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包