?? common.c
字號:
/* ************************************************************* **
系統時鐘配置
============
* 描 述:.c 包含
* 1.系統時鐘配置的函數
* 2.系統延時函數(SysTick)
* 3.IO操作函數
* .h 包含
* 1.常用無符號數據類型定義
* 2.對應頭文件中包含IO口操作宏定義
* 文 件 名:common.c
* 芯 片 型 號:STM32F10x
* 庫 版 本:STM32F10x_StdPeriph_Lib_V3.5.0
* 程 序 員:張偉亮
* 創 建 日 期:XXXX-XX-XX
* 版 本:V1.0
* *************************修 訂 信 息************************* **
* 修 訂 日 期:
* 當 前 版 本:
* 內 容 描 述:
** ************************************************************* */
#include "stm32f10x.h"
#include "common.h"
/* ---------------------------全局變量-------------------------- */
static u16 fac_ms; //ms延時系數
static u32 fac_us; //us延時系數
/* ************************************************************* **
* 函數名稱:void System_Init(void)
* 函數功能:設置HCLK、PCLK1、PCLK2、FLASH預取緩沖
* 入口參數:無
* 出口參數:無
** ************************************************************* */
void System_Init(void)
{
ErrorStatus HSEStartUpStatus; //一個ErrorStartus枚舉值,存儲HSE起振狀態
RCC_DeInit(); //將外設RCC寄存器重設為缺省值
RCC_HSEConfig(RCC_HSE_ON); //輸入參數: RCC_HSE_ON-開啟
// RCC_HSE_OFF-關閉
// RCC_HSE_BYPASS-晶振被外部時鐘旁路
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振,若超時時間到則退出
//返回SUCCESS:HSE晶振穩定就緒
//返回ERROR :HSE晶振未就緒
if(SUCCESS == HSEStartUpStatus) //HSE晶振穩定且就緒
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //設置AHB時鐘(HCLK),源自系統時鐘SYSCLK
//輸入參數如下:
//RCC_SYSCLK_Div1: AHB時鐘=系統時鐘
//RCC_SYSCLK_Div2: AHB時鐘=系統時鐘/2
//RCC_SYSCLK_Div4: AHB時鐘=系統時鐘/4
//RCC_SYSCLK_Div8: AHB時鐘=系統時鐘/8
//RCC_SYSCLK_Div16: AHB時鐘=系統時鐘/16
//RCC_SYSCLK_Div64: AHB時鐘=系統時鐘/64
//RCC_SYSCLK_Div128: AHB時鐘=系統時鐘/128
//RCC_SYSCLK_Div256: AHB時鐘=系統時鐘/256
//RCC_SYSCLK_Div512: AHB時鐘=系統時鐘/512
RCC_PCLK1Config(RCC_HCLK_Div2); //設置低速PCLK1時鐘(最大36MHz),源自AHB時鐘(HCLK)
//輸入參數如下:
//RCC_HCLK_Div1: APB1時鐘=HCLK
//RCC_HCLK_Div2: APB1時鐘=HCLK2
//RCC_HCLK_Div4: APB1時鐘=HCLK/4
//RCC_HCLK_Div8: APB1時鐘=HCLK/8
//RCC_HCLK_Div16: APB1時鐘=HCLK/16
RCC_PCLK2Config(RCC_HCLK_Div1); //設置高速PCLK2時鐘(最大72MHz),源自AHB時鐘(HCLK)
//輸入參數如下:
//RCC_HCLK_Div1: APB1時鐘=HCLK
//RCC_HCLK_Div2: APB1時鐘=HCLK2
//RCC_HCLK_Div4: APB1時鐘=HCLK/4
//RCC_HCLK_Div8: APB1時鐘=HCLK/8
//RCC_HCLK_Div16: APB1時鐘=HCLK/16
FLASH_SetLatency(FLASH_Latency_2); //設置FLASH延時周期
//輸入參數如下:
//FLASH_Latency_0 0延時周期
//FLASH_Latency_1 1延時周期
//FLASH_Latency_2 2延時周期
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //設置FLASH預取指
//輸入參數如下:
//FLASH_PrefetchBuffer_Enable 預取指使能
//FLASH_PrefetchBuffer_Disable 預取指失能
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //設置PLL時鐘源及倍頻數
//輸入參數如下:
//-----------------參數1設置PLL時鐘源:
//RCC_PLLSource_HSI_Div2 PLL輸入時鐘=HSI時鐘/2
//RCC_PLLSource_HSE_Div1 PLL輸入時鐘=HSE時鐘
//RCC_PLLSource_HSE_Div2 PLL輸入時鐘=HSE時鐘/2
//-----------------參數2設置PLL倍頻數:
//RCC_PLLMul_2 PLL輸入時鐘*2
//RCC_PLLMul_3 PLL輸入時鐘*3
//RCC_PLLMul_4 PLL輸入時鐘*4
//RCC_PLLMul_5 PLL輸入時鐘*5
//RCC_PLLMul_6 PLL輸入時鐘*6
//RCC_PLLMul_7 PLL輸入時鐘*7
//RCC_PLLMul_8 PLL輸入時鐘*8
//RCC_PLLMul_9 PLL輸入時鐘*9
//RCC_PLLMul_10 PLL輸入時鐘*10
//RCC_PLLMul_11 PLL輸入時鐘*11
//RCC_PLLMul_12 PLL輸入時鐘*12
//RCC_PLLMul_13 PLL輸入時鐘*13
//RCC_PLLMul_14 PLL輸入時鐘*14
//RCC_PLLMul_15 PLL輸入時鐘*15
//RCC_PLLMul_16 PLL輸入時鐘*16
RCC_PLLCmd(ENABLE); //設置PLL使能或使能
//輸入參數如下:
//ENABLE 使能PLL
//DISABLE 失能PLL
while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); //檢查指定的RCC標志位設置與否,返回標志狀態
//輸入參數如下:
//RCC_FLAG_HSIRDY HSI晶振就緒
//RCC_FLAG_HSERDY HSE晶振就緒
//RCC_FLAG_PLLRDY PLL就緒
//RCC_FLAG_LSERDY LSE晶振就緒
//RCC_FLAG_LSIRDY LSI晶振就緒
//RCC_FLAG_PINRST 管腳復位
//RCC_FLAG_PORRST POR/PDR復位
//RCC_FLAG_SFTRST 軟件復位
//RCC_FLAG_IWDGRST IWDG復位
//RCC_FLAG_WWDGRST WWDG復位
//RCC_FLAG_LPWRRST 低功耗復位
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //選擇系統時鐘
//輸入參數如下:
//RCC_SYSCLKSource_HSI 選擇HSI作為系統時鐘
//RCC_SYSCLKSource_HSE 選擇HSE作為系統時鐘
//RCC_SYSCLKSource_PLLCLK 選擇PLL作為系統時鐘
while( 0x08 != RCC_GetSYSCLKSource() ); //返回用作系統時鐘的時鐘源
//返回值如下:
//0x00: HSI作為系統時鐘
//0x04: HSE作為系統時鐘
//0x08: PLL作為系統時鐘
}
else //HSE晶振未就緒
{}
}
/* ************************************************************* **
* 函數名稱:void Delay_Init(void)
* 函數功能:SysTick初始化
* 入口參數:系統時鐘頻率
* 出口參數:無
** ************************************************************* */
void Delay_Init(u8 m_SysClk)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //設置時鐘源
//輸入參數如下:
//SysTick_CLKSource_HCLK_Div8 SysTick時鐘源為AHB時鐘源/8
//SysTick_CLKSource_HCLK SysTick時鐘源為AHB時鐘源
fac_us = m_SysClk/8; //設置us系數
fac_ms = (u16)fac_us*1000; //設置ms系數
}
/* ************************************************************* **
* 函數名稱:void Delay_ms(unsigned int ms)
* 函數功能:毫秒延時
* 入口參數:需要延時的時間,單位ms
* 出口參數:無
** ************************************************************* */
void Delay_ms(u16 m_ms)
{
//--------------------變量聲明
u32 Temp;
//--------------------功能實現
SysTick->LOAD = (m_ms*fac_ms); //裝載延時時間
SysTick->VAL = 0X00; //清除計數器值為0
SysTick->CTRL = 0X01; //使能計數
do
{Temp = SysTick->CTRL;}
while((Temp&0x01) && !(Temp&(0X0001<<16))); //檢測是否遞減到0
SysTick->CTRL = 0X00; //失能計數
SysTick->VAL = 0X00; //清除計數器值為0
}
/* ************************************************************* **
* 函數名稱:void Delay_us(unsigned int us)
* 函數功能:微妙延時
* 入口參數:需要延時的時間單位us
* 出口參數:無
** ************************************************************* */
void Delay_us(u32 m_us)
{
//--------------------變量聲明
u32 Temp;
//--------------------功能實現
SysTick->LOAD = (m_us*fac_us); //裝載延時時間
SysTick->VAL = 0X00; //清除計數器值為0
SysTick->CTRL = 0X01; //使能計數
do
{Temp = SysTick->CTRL;}
while((Temp&0x01) && !(Temp&(0X0001<<16))); //檢測是否遞減到0
SysTick->CTRL = 0X00; //失能計數
SysTick->VAL = 0X00; //清除計數器值為0
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -