/*******************************************************************************
* 文件名 : main.c
* 作者 : Losingamong
* 時間 : 08/08/2008
* 文件描述 : 主函數(shù)
********************************************************************************/
/* 頭文件 ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
//*****************************************************************
//* SystemTick-Register
//*******************************************************************
#define SYSTICK_TENMS (*((volatile unsigned long *)0xE000E01C))
#define SYSTICK_CURRENT (*((volatile unsigned long *)0xE000E018))
#define SYSTICK_RELOAD (*((volatile unsigned long *)0xE000E014))
#define SYSTICK_CSR (*((volatile unsigned long *)0xE000E010))
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Systick_Configuration(void);
void Delay_Second(void);
/****************************************************
* 函數(shù)名 :Systick_Configuration
* 函數(shù)描述 :設(shè)置Systick定時器,重裝時間為0.1秒;
* 輸入?yún)?shù) : 無
*****************************************************/
void Systick_Configuration(void)
{
SYSTICK_CURRENT=0; //當前值寄存器
SYSTICK_RELOAD=20000; //重裝載寄存器,系統(tǒng)時鐘20M中斷一次1mS
SYSTICK_CSR|=0x06;// HCLK作為Systick時鐘,Systick中斷使能位
}
unsigned long TimingDelay; // 延時時間,注意定義為全局變量
void SysTick_Handler(void) //中斷函數(shù)
{
extern unsigned long TimingDelay; // 延時時間,注意定義為全局變量
SYSTICK_CURRENT=0;
if (TimingDelay != 0x00)
TimingDelay--;
}
void Delay(unsigned long nTime) //延時函數(shù)
{
SYSTICK_CSR|=0x07; // 使能SysTick計數(shù)器
TimingDelay = nTime; // 讀取延時時間
while(TimingDelay != 0); // 判斷延時是否結(jié)束
SYSTICK_CSR|=0x06;// 關(guān)閉SysTick計數(shù)器
}
//毫秒級的延時
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=8000; //自己定義8000
while(i--) ;
}
}
/****************************************************
* 函數(shù)名 : main
* 函數(shù)描述 : Main 函數(shù)
* 輸入?yún)?shù) : 無
* 輸出結(jié)果 : 無
* 返回值 : 無
*****************************************************/
int main(void)
{
/* 設(shè)置系統(tǒng)時鐘 */
RCC_Configuration();
/* 設(shè)置GPIO端口 */
GPIO_Configuration();
Systick_Configuration();//設(shè)置定時器;
GPIO_ResetBits(GPIOA , GPIO_Pin_8); // PA.2輸出低電平
delay_ms(300);
GPIO_SetBits(GPIOA , GPIO_Pin_8); // PA.3輸出高電平
while(1)
{
GPIO_ResetBits(GPIOA , GPIO_Pin_8 ); // PA.2輸出低電平
delay_ms(50);
GPIO_SetBits(GPIOA , GPIO_Pin_8 ); // PA.3輸出高電平
delay_ms(50);
GPIO_ResetBits(GPIOB, GPIO_Pin_9); // PB.9輸出低電平,燈亮
// Delay(50);
delay_ms(50);
GPIO_SetBits(GPIOB, GPIO_Pin_9); // PB.9輸出高電平,燈滅
// Delay(50);
delay_ms(50);
}
}
/*******************************************************************************
* 函數(shù)名 : RCC_Configuration
* 函數(shù)描述 : 設(shè)置系統(tǒng)各部分時鐘
* 輸入?yún)?shù) : 無
* 輸出結(jié)果 : 無
* 返回值 : 無
*******************************************************************************/
void RCC_Configuration(void)
{
/* 定義枚舉類型變量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 復(fù)位系統(tǒng)時鐘設(shè)置*/
RCC_DeInit();
/* 開啟HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE起振并穩(wěn)定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判斷HSE起是否振成功,是則進入if()內(nèi)部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 選擇HCLK(AHB)時鐘源為SYSCLK 1分頻 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 選擇PCLK2時鐘源為 HCLK(AHB) 1分頻 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 選擇PCLK1時鐘源為 HCLK(AHB) 2分頻 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 設(shè)置FLASH延時周期數(shù)為2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能FLASH預(yù)取緩存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 選擇鎖相環(huán)(PLL)時鐘源為HSE 1分頻,倍頻數(shù)為9,則PLL輸出頻率為 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL輸出穩(wěn)定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 選擇SYSCLK時鐘源為PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待PLL成為SYSCLK時鐘源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 打開APB2總線上的GPIOA時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
}
/*******************************************************************************
* 函數(shù)名 : GPIO_Configuration
* 函數(shù)描述 : 設(shè)置各GPIO端口功能
* 輸入?yún)?shù) : 無
* 輸出結(jié)果 : 無
* 返回值 : 無
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 設(shè)置PA2,PA3口為推挽輸出,最大翻轉(zhuǎn)頻率為50MHz*/
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
/*設(shè)置PA8口為推挽輸出,*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;//| GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;//開漏輸出 GPIO_Mode_Out_PP;//推挽輸出
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//OD開漏輸出 GPIO_Mode_Out_PP;//推挽輸出
GPIO_Init(GPIOB , &GPIO_InitStructure);
}
|