1. 程式人生 > >STM32使用非8M晶振時如何修改程式碼

STM32使用非8M晶振時如何修改程式碼

目前能找到的大部分程式碼都是預設8M外部晶振的,若使用的晶振不是8M則需要作一些修改。例如這次我使用的外部晶振是12M的,作如下修改。

    1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)處的值(改為12MHz)。此處修改影響Debug時觀察到的時鐘數值。

    

    2.在system_stm32f10x.c開頭的註釋裡有:

      * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on
      *    the product used), refer to "
HSE_VALUE" define in "stm32f10x.h" file. * When HSE is used as system clock source, directly or through PLL, and you * are using different crystal you have to adapt the HSE value to your own * configuration.

       根據描述,將stm32f10x.h中大約在0121行找到,修改掉。

複製程式碼
    #if !defined  HSE_VALUE
    #ifdef STM32F10X_CL   
    
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #else #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ #endif /* STM32F10X_CL */ #endif /* HSE_VALUE */
複製程式碼

    不過很奇怪的是,即使修改了此處的值,PLL的時鐘還是不正確(程式依舊講PLL按9倍頻配置)。此處有待進一步探究(目前暫時只知道編譯的程式碼沒有用到HSE_VALUE)。

    3.順著程式碼尋找原因,最後發現真正起作用的部分在system_stm32f10x.c裡的SetSysClockTo72(void)函式(0993行,這裡假設我們希望MCU工作在72MHZ)。

        在1058行有這樣一段程式碼:

#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

       註釋部分是函式自帶的,真正起作用的部分在這裡,因此把RCC_CFGR_PLLMULL9改為RCC_CFGR_PLLMULL6。

相關推薦

STM32使用8M如何修改程式碼

目前能找到的大部分程式碼都是預設8M外部晶振的,若使用的晶振不是8M則需要作一些修改。例如這次我使用的外部晶振是12M的,作如下修改。     1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)處的值(改為

stm32變更外部如何配置時鐘、以及HSI的使用

void RCC_Configuration(void) {         /* RCC system reset(for debug purpose) */         RCC_DeInit();         RCC_HSICmd(ENABLE);        //開啟內部高速時鐘    

STM32不同外部工程的配置問題

遇到的問題:同樣的串列埠配置程式碼在一種407開發板上能正常輸出,但是換到另一種407開發板上後就出現亂碼,檢查串列埠輸出波形後發現,電平轉換晶片沒有問題,但是波特率卻有問題。問題原因:   經過故障排查發現出現上述問題的原因是兩種STM32F407使用的外部晶振的頻率不一樣

STM32:外部時鐘配置

void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); //INPUT HSE = 24M Err

STM32使用內部和外部

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用內部RC振盪器而不使用外部晶振,請按照下面方法處理:1)對於100腳或144腳的產品,OSC_IN應接地,OSC_OUT應懸空。2)對於少於100腳的產品,有2種接法:2.1)OSC_IN和OSC_

基於WINAVR + avr studio 4 使用外部及延可能遇到的問題( By-炬本)

第一步,使用外部晶振 1.    連線isp下載線 2.    開啟avr fighter a” 如下介面,在熔絲位那框架,點選“讀取”     (注:上圖是預設的熔絲位) b.單擊滑鼠,把熔絲位改為下圖(僅是JTAGEN 和CKOPT 為0),單擊寫入: 這樣就能使用

stm32 外接問題

由於STM32F10x庫官方採用的是預設的外接8MHz晶振,因此造成很多使用者也採用了8MHz的晶振,但是,8MHz的晶振不是必須的,其他頻點的晶振也是可行的,只需要在庫中做相應的修改就行。     在論壇上看到很多使用者反映,使用外接12MHz的晶振,會造成很多的問題,如USART的波特率不正確,Syst

關於Nucleo-STM32板沒有,時鐘頻率的來源

        剛入手的一塊Nucleo-STM32F303RE開發板,高興之餘發現板上竟然沒有晶振,不過有出廠程式,燈能閃,難道用了內部晶振?帶著疑問百度了一下,有人說是和板上st-link共用8M晶振,那麼到底是不這樣呢? 一、結論:        下載這塊板的使用者手冊

STM32系列修改外部以及程式碼修改(f103、f105為例)

剛剛接觸STM32的時候,用的都是8M晶振。比如你想更換到為外部晶振為12M,但是主頻仍想用72M的。該如何設定?或者想倍頻到更高的主頻該怎麼修改? 例子就直接直接拿<正點原子>的例子吧! 屬性 原來 現在 外部晶

STM32F407ZG微控制器由例程預設推薦的8M換為自定義的4-26M的注意事項

相信作為一名STM32新手,大家都是從官網上下載例程來學習。現在firmwave的最新版本為1.1.0,下載地址為 http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&docty

STM32使用外部16MHZ修改程式點

做小封裝產品設計的朋友或許知道3225-4PIN的晶振,為何8MHZ晶振批量價格要到2元一片,而16MHZ晶振只需要0.4元甚至更少。究其原因是因為3225封裝的晶振目前全球最低頻率一般為8MHZ,而國內8MHZ達不到精度指標,所以市場上的8MHZ晶振一般為進口晶振,因此成

當手頭上沒有示波器,如何通過程式碼測試stm32外部是否工作

1.首先檢視stm32手冊,可以知道有一個時鐘控制暫存器(RCC_CR),在該暫存器中,第16位和第0位和25位和24位分別為: HSEON:外部高速時鐘使能 (External high-speed clock enable) HSION:內部高速時鐘使能

【springboot】spring boot修改程式碼後無需重啟設定,在開發實現熱部署

熱部署是什麼 大家都知道在專案開發過程中,常常會改動頁面資料或者修改資料結構,為了顯示改動效果,往往需要重啟應用檢視改變效果,其實就是重新編譯生成了新的Class檔案,這個檔案裡記錄著和程式碼等對應的各種資訊,然後Class檔案將被虛擬機器的ClassLoader載入。 而熱部署正是利用了這

VB winsock傳送提示 "執行錯誤'40006'",我怎麼修改程式碼

這個方法是很好的,但是我在用的時候出現報錯: 引數不可選 然後我改成這樣 '判斷是否連線了,才傳送資料 j = 1 Do Until Winsock1.State = 7 Or j > 600 j =

stm32f429ig上的ucLinux修改外部頻率

將stm32f429i-discovery開發板的 emcraft uclinux 例程移植到秉火stm32f429的開發板上,由於stm32f429i-discovery上使用的是8MHZ外部晶振,而秉火stm32f429的開發板使用的是25MHZ的晶振。 u-boot部分 修改u

STM32外部不起

晶片:STM32F429 開發平臺:Keil 問題: STM32外部晶振不起振,選擇了內部16MHZ,從而導致延時函式、波特率、定時器等等有問題。 有源晶振和無源晶振的區別 有源晶振一般4個腳,一個電源,一個接地,一個訊號輸出端,一個NC(空腳)。有個點標記的為1腳,按逆

51微控制器 Keil C 延程式的簡單(12MHz,一個機器週期1us.)

一. 500ms延時子程式 void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 產生的彙

spring boot修改程式碼後無需重啟設定,在開發實現熱部署

熱部署是什麼大家都知道在專案開發過程中,常常會改動頁面資料或者修改資料結構,為了顯示改動效果,往往需要重啟應用檢視改變效果,其實就是重新編譯生成了新的Class檔案,這個檔案裡記錄著和程式碼等對應的各種資訊,然後Class檔案將被虛擬機器的ClassLoader載入。而熱部署

談一談修改程式碼加註釋的原則和方法

暮鼓集    行走集 原作於2008年06月01日,軟體部培訓稿 我們修改程式碼時少不了要加一些註釋,這基本的原則是“言簡意賅”,只要做到大家能看懂,在版本比較工具(BC及VSS)中能一目瞭然,這就可以了。 下面介紹一些方法供大家參考:

關於除錯----在單步執行某個程式的中間修改原始碼,當修改程式碼之後移動到下一步,偵錯程式自動在執行下一語句之前重新編譯

在單步執行某個程式的中間修改原始碼,當修改程式碼之後移動到下一步時,偵錯程式自動在執行下一語句之前重新編譯。所以說如果編譯過程中出了問題,修改了程式,即使不手動停止重新啟動程式,直接執行的話也沒有問題的,編譯器會預設重新編譯啟動。