📄 target.c
字号:
/* Includes ------------------------------------------------------------------*/
#include "config.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
ErrorStatus HSEStartUpStatus;
SPI_InitTypeDef SPI_InitStructure;
/* Private function prototypes -----------------------------------------------*/
void RCCConfiguration(void);
void NVICConfiguration(void);
void GPIOConfiguration(void);
void SysTickConfiguartion(void);
/***********************************************************************************************
* Name: void TargetInit(void)
* Input:
* Output:
* Function: 初始化硬件
* Notes:
***********************************************************************************************/
void TargetInit(void)
{
RCCConfiguration(); // 系统时钟初始化
NVICConfiguration(); // 可屏蔽中断初始化
SysTickConfiguartion(); // 系统定时器初始化
GPIOConfiguration(); // IO初始化
}
/***********************************************************************************************
* Name: void RCCConfiguration(void)
* Input:
* Output:
* Function: RCC初始化,配置系统时钟源
* Notes: 如果改变时钟,请同时修改config.h中的时钟定义
***********************************************************************************************/
void RCCConfiguration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit(); // RCC配置为默认模式
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); // 允许外部高速时钟
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // 等待外部时钟正常
if(HSEStartUpStatus == SUCCESS)
{
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1); // 系统时钟分频(1,2,4,8-512),1分频
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); // APB2分频(1,2,4-16),1分频,最大72MHz
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); // APB1分频(1,2,4-16),2分频,最大36MHz
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2); // SYSCLK(系统时钟)周期与闪存访问时间的比例
// FLASH_Latency_0:零等待状态,当0<SYSCLK≤24MHz
// FLASH_Latency_1:一个等待状态,当24MHz<SYSCLK≤48MHz
// FLASH_Latency_2:两个等待状态,当48MHz<SYSCLK≤72MHz
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 使能闪存预取缓冲区
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL倍频系数,9倍频
/* Enable PLL */
RCC_PLLCmd(ENABLE); // 使能PLL
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}; // 等待PLL正常
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 选择PLL作为系统时钟Fcclk
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08){}; // 等待PLL作为系统时钟正常
}
/* Enable GPIOA, GPIOB and AFIO clocks */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA
| RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO // 辅助功能IO(复用功能IO)
| RCC_APB2Periph_SPI1
| RCC_APB2Periph_USART1, ENABLE);
/* Enable USART2 clocks */
//RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2, ENABLE);
/* Enable USART2 clocks */
// RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART3, ENABLE);
}
/***********************************************************************************************
* Name: void NVICConfiguration(void)
* Input:
* Output:
* Function: 可屏蔽中断配置
* Notes:
***********************************************************************************************/
void NVICConfiguration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断向量表空间
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART2 Interrupt */
// NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
/* Enable the USART3 Interrupt */
// NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
/* Configure and enable SPI1 interrupt -------------------------------------*/
// NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
/***********************************************************************************************
* Name: void GPIOConfiguration(void)
* Input:
* Output:
* Function:
* Notes:
***********************************************************************************************/
void GPIOConfiguration(void){
GPIO_InitTypeDef gpio_init;
// LED引脚配置
gpio_init.GPIO_Pin = GPIO_LED_LED0;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_LED, &gpio_init);
GPIO_SetBits(GPIO_LED,GPIO_LED_LED0);
// LCD引脚配置
// LCD控制脚
gpio_init.GPIO_Pin = GPIO_LCD_CON_RD + GPIO_LCD_CON_CD + GPIO_LCD_CON_WR + GPIO_LCD_CON_CE;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_LCD_CON, &gpio_init);
GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CD);
GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_WR);
GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);
GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_RD); // 读始终使能
// LCD数据脚,先配置成输入脚,在LCD控制中修改引脚配置
gpio_init.GPIO_Pin = GPIO_LCD_DATA_DATAS;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIO_LCD_DATA, &gpio_init);
}
/***********************************************************************************************
* Name: void SysTickConfiguartion(void)
* Input:
* Output:
* Function: 系统定时器配置
* Notes:
***********************************************************************************************/
void SysTickConfiguartion(void)
{
/* SysTick end of count event each 1ms with input clock equal to 9MHz (HCLK/8, default) */
//SysTick_SetReload(9000*80);
SysTick_SetReload(9000); // 设置系统tick工作在1ms((Fcclk/8)/9000(us))
/* Enable SysTick interrupt */
SysTick_ITConfig(ENABLE);
/* Enable the SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Enable);
}
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -