?? init.c
字號:
/******************************************************************************
* 這是STM32的模塊初始化程序
*******************************************************************************/
/* Private define ------------------------------------------------------------*/
//#define PRINTF_EN
/* Includes ------------------------------------------------------------------*/
//#include "stm32f10x_lib.h"
#include "stm32f10x.h"
#ifdef PRINTF_EN
#include <stdio.h>
#endif
/* Private typedef -----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
//void NVIC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void Init_Device(void);
/* Private functions ---------------------------------------------------------*/
////////////////////////////////////////////////////////////////////////////////
// 下面是系統RCC模塊的初始化,這部分比較復雜
// 某些功能模塊(如USART,RTC等)的相關時鐘使能,被放在各自的模塊初始化函數中
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : 系統時鐘設置
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振穩定
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//如果外部晶振啟動成功,則進行下一步操作
if (HSEStartUpStatus==SUCCESS)
{
//設置HCLK(AHB時鐘)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1) = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2) = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
//FLASH時序控制
//推薦值:SYSCLK = 0~24MHz Latency=0
// SYSCLK = 24~48MHz Latency=1
// SYSCLK = 48~72MHz Latency=2
FLASH_SetLatency(FLASH_Latency_2);
//開啟FLASH預取指功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//PLL設置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//啟動PLL
RCC_PLLCmd(ENABLE);
//等待PLL穩定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系統時鐘SYSCLK來自PLL輸出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切換時鐘后等待系統時鐘穩定
while (RCC_GetSYSCLKSource()!=0x08);
}
//下面是給各模塊開啟時鐘
//啟動GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA ,ENABLE);
//啟動AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
return;
}
////////////////////////////////////////////////////////////////////////////////
// GPIO設置
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PC口4567腳設置GPIO輸出,推挽 2M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//KEY2 KEY3 JOYKEY
//位于PD口的3 4 11-15腳,使能設置為輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
return;
}
////////////////////////////////////////////////////////////////////////////////
//下面是USART模塊的初始化
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* Function Name : USART_Configuration
* Description : USART設置
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//啟動USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//USART1_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1模塊配置
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
#if USART_RXINT_EN
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
#endif
USART_Cmd(USART1, ENABLE);
return;
}
////////////////////////////////////////////////////////////////////////////////
// 以下是系統各模塊的初始化功能函數,將調用上述定義的函數,完成系統的初始化
// main.c中只需調用本函數即可
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* Function Name : Init_Device
* Description : Init all the system moudles
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Init_Device(void)
{
RCC_Configuration();
//GPIO_Configuration();
USART_Configuration();
//NVIC_Configuration();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -