stm32 實現外部晶振變換有2種方法:
第一種修改系統庫函式:
第一步,開啟stm32f10x.h,將
#define hse_value ((uint32_t)8000000) 修改為: #define hse_value ((uint32_t)12000000) 重要必須做
第二步,開啟system_stm32f10x.c,修改pll引數,將
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 &= (uint32_t)((uint32_t)~(rcc_cfgr_pllsrc | rcc_cfgr_pllxtpre | rcc_cfgr_pllmull)); 如果是16m晶振,可改變pllxtpre
rcc->cfgr |= (uint32_t)(rcc_cfgr_pllsrc_hse | rcc_cfgr_pllmull6);
第三步,自己試驗,不設定第三步,串列埠通訊傳送資料也正常,開啟建立的stm32工程,選擇projects-〉options for target ***,找到target標籤,外接的晶振預設是8mhz,我們將外接的晶振引數修改為12mhz,確定儲存,再編譯,除錯即可。
第二種使用標準庫函式:
使用下列火哥的**(只是改變了pllmull6),不需要設定上面的第一步和第三步串列埠通訊也正常。但有時需要修改第一步(試驗證明)。**如下:
#include "bsp_rccclkconfig.h"
void hse_setsysclk( uint32_t rcc_pllmul_x )
else
}
#ifndef __bsp_rccclkconfig_h
#define __bsp_rccclkconfig_h
#include "stm32f10x.h"
void hse_setsysclk( uint32_t rcc_pllmul_x );
#endif /*__bsp_rccclkconfig_h */
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_rccclkconfig.h"//新增
/** * @brief 主函式
* @param 無
* @retval 無
*/int main(void)
; usart_config();
hse_setsysclk( rcc_pllmul_6 );//新增
printf( "串列埠printf函式測試\n" );
// usart_sendbyte(debug_usartx,'a');
// usart_sendhalfword(debug_usartx, 0xff56);
// usart_sendstr(debug_usartx, "歡迎使用秉火stm32f103開發板 \n");
// usart_sendarray(debug_usartx, a,10);
while (1)
}
STM32F103外部晶振由8M變為12M
官方提供的庫檔案中,hse 外部高速時鐘 預設為8mhz,最高主頻為8 9 72mhz,如果將hse變為12mhz,不修改庫檔案的話,最高主頻則變為12 9 108mhz,最典型的問題就是usart可以通訊,但是接收到的資料與傳送的不一致,並且找不到啥原因,害的我瞎折騰了一整天,下面列舉需要修改的地...
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
STM32f103之外部中斷
一 背景 有個需求,io口檢測上公升沿,然後做相應的動作。在此記錄stm32f103的外部中斷結構及配置方法,以備下次快速上手使用。有許多不太明白,又是老司機 d 幫忙,真的是站在別人的肩膀上會讓你看的更遠,走的更快,感謝老司機。二 正文 stm32f103有68個可遮蔽中斷。但是,真正能用的其實遠...