1、单片机启动
启动过程,先运行启动文件,启动文件里面有一段汇编代码,先执行汇编代码,接着配置时钟,随即进入主函数。
查看单片机主频
2、自己配置时钟树
void RCC_Init(void)
{
RCC_ClocksTypeDef RCC_Clocks;
ErrorStatus HSEStartUpStaus;
RCC_DeInit(); // 把RCC外设初始化成复位状态,这句是必须的
RCC_ClockSecuritySystemCmd(ENABLE); //使能系统安全
RCC_HSEConfig(RCC_HSE_ON); //打开HSE,外部高速时钟
HSEStartUpStaus = RCC_WaitForHSEStartUp(); //等待HSE开启
if (SUCCESS == HSEStartUpStaus) //成功开始分频
{
//----------------------------------------------------------------------//
// 使能FLASH 预存取缓冲区
FLASH_PrefetchBufferCmd(ENABLE);
// SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2
// 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,
// 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了
// 0:0 < SYSCLK <= 24M
// 1:24< SYSCLK <= 48M
// 2:48< SYSCLK <= 72M
FLASH_SetLatency(FLASH_Latency_2);
//----------------------------------------------------------------------//
// AHB预分频因子设置为1分频,HCLK = SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// APB1预分频因子设置为2分频,PCLK1 = HCLK/2
RCC_PCLK1Config(RCC_SYSCLK_Div2);
// APB2预分频因子设置为1分频,PCLK2 = HCLK
RCC_PCLK2Config(RCC_SYSCLK_Div1);
//-----------------设置各种频率主要就是在这里设置-------------------//
// 设置PLL时钟来源为HSE,HSE=8MHz
// PLLM:PLL_VCO input clock =(HSE or HSI /PLLM)
// PLLN:PLL_VCO output clock =(PLL_VCP input clock)*PLLN
// PLLP:System Clock =PLL_VCO output clock/PLLP
// PLLQ:配置SD卡读写,USB等功能,暂时不用
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
//------------------------------------------------------------------//
// 开启PLL
RCC_PLLCmd(ENABLE);
// 等待 PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 读取时钟切换状态位,确保PLLCLK被选为系统时钟
while (RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ // 如果HSE开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理
// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,
// HSI是内部的高速时钟,8MHZ
while (1)
{
}
}
}
3、GPIO口使用
3.1、输出模式
// 1、配置GPIO外设时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC |
RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_DMA1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //配置结构体
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //配置的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //配置模式,OUTPUT/INPUT
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //输出模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //是否需要上拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //配置A组引脚
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);//引脚设置高电平
//GPIO_ResetBits(GPIOA,GPIO_Pin_0); //A组GPIO引脚0设置低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) //置低电平
void GPIO_setBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) //置高电平
3.2、输入模式
// 1、配置GPIO外设时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC |
RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_DMA1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //根据电路图和芯片配置是否下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) //读取电平
3.3、转换功能
通讯类的IIC、ADC等功能