STM32学习——入门到放弃篇_1

1、单片机启动

        启动过程,先运行启动文件,启动文件里面有一段汇编代码,先执行汇编代码,接着配置时钟,随即进入主函数。

        查看单片机主频

        

2、自己配置时钟树

stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)的配置 - chaina_家长 - 博客园 (cnblogs.com)

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等功能

4、NVIC配置 (嵌套中断控制器)

中断-N

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值