创建一个STM32F0xx工程模板

之前一直是使用stm32f103系列,直接使用正点原子的教程,并没有关注过创建工程的问题,现在由于某些原因,需要使用stm32f072c8t6,引脚功能大致相同,但没有现成能用的工程,所以需要手动创建一个工程。

参考博客1:https://blog.csdn.net/qq_37449342/article/details/102683798?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

参考博客2:https://blog.csdn.net/lgh1231/article/details/86567510?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

推荐参考博客2进行创建。博客1中的第17点,需要再添加一个”…\Libraries\CMSIS\Include“,否则编译会出现找不到”core_cm0.h“文件的提示。

数据手册:https://html.alldatasheetcn.com/html-pdf/933910/STMICROELECTRONICS/STM32F072C8/82062/42/STM32F072C8.html

因为项目需要用到串口2,3。我在调试的时候串口1,2都能正常使用,但是串口3不知道为什么初始化失败。之后查看数据手册发现,串口1,2用的是GPIO_AF_1,串口3用的是GPIO_AF_4,数据手册41-43页。。就是因为这个我调了两天。。。。
下面贴出我的串口1,2,3的初始化,我用的是stm32f072c8t6。

void USART1_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;		
	NVIC_InitTypeDef NVIC_InitStructure;	
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);	/* 使能AHB时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//使能串口时钟,串口1是	RCC_APB2PeriphClockCmd	
	
	
	//NVIC_Init
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 	


	//GPIO_Init
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
    
	 /* 定义USART TX_RX 引脚为复用输出 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;		//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;				//复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//高速
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;				//推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;				 //上拉
	GPIO_Init(GPIOA, &GPIO_InitStructure); 		
	
	
	/* USARTx configured as follow:
	- BaudRate = 115200 baud  
	- Word Length = 8 Bits
	- Stop Bit = 1 Stop Bit
	- Parity = No Parity
	- Hardware flow control disabled (RTS and CTS signals)
	- Receive and transmit enabled
	*/
	//USART1_Init
	USART_InitStructure.USART_BaudRate = bound;				//设定波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//8数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;		//1停止位个数
	USART_InitStructure.USART_Parity = USART_Parity_No;			//无校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//不用流量控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//使能接收和发送功能
	USART_Init(USART1, &USART_InitStructure); //初始化串口1
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_Cmd(USART1, ENABLE);                    //使能串口1 
}

void USART2_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;		
	NVIC_InitTypeDef NVIC_InitStructure;	
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);	/* 使能AHB时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);		//使能串口时钟,串口2是	RCC_APB1PeriphClockCmd
	
	
	//NVIC_Init
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 	


	//GPIO_Init
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
    
	 /* 定义USART TX_RX 引脚为复用输出  PA2是TX,PA3是RX */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;		//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;				//复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//高速
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;				//推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;				 //上拉
	GPIO_Init(GPIOA, &GPIO_InitStructure); 	
	
	
	/* USARTx configured as follow:
	- BaudRate = 115200 baud  
	- Word Length = 8 Bits
	- Stop Bit = 1 Stop Bit
	- Parity = No Parity
	- Hardware flow control disabled (RTS and CTS signals)
	- Receive and transmit enabled
	*/
	//USART2_Init
	USART_InitStructure.USART_BaudRate = bound;				//设定波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//8数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;		//1停止位个数
	USART_InitStructure.USART_Parity = USART_Parity_No;			//无校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//不用流量控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//使能接收和发送功能
	USART_Init(USART2, &USART_InitStructure); //初始化串口2
	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_Cmd(USART2, ENABLE);                    //使能串口2 	
}

void USART3_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;		
	NVIC_InitTypeDef NVIC_InitStructure;	
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);	/* 使能AHB时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);		//使能串口时钟,串口3是	RCC_APB1PeriphClockCmd
	
		//NVIC_Init
	NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;	//USART3_4_IRQn
	NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 		

	//GPIO_Init
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_4); 
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_4);
   
	 /* 定义USART TX_RX 引脚为复用输出 PB10是TX,PB11是RX*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;		//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;				//复用模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//高速
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;				//推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;				 //上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure); 	

	/* USARTx configured as follow:
	- BaudRate = 115200 baud  
	- Word Length = 8 Bits
	- Stop Bit = 1 Stop Bit
	- Parity = No Parity
	- Hardware flow control disabled (RTS and CTS signals)
	- Receive and transmit enabled
	*/
	//USART3_Init
	USART_InitStructure.USART_BaudRate = bound;				//设定波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//8数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;		//1停止位个数
	USART_InitStructure.USART_Parity = USART_Parity_No;			//无校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//不用流量控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//使能接收和发送功能
	USART_Init(USART3, &USART_InitStructure); //初始化串口3

	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断

	USART_Cmd(USART3, ENABLE);                    //使能串口3 	

}

还有时钟配置。记录一下。。

void RCC_Configuration()
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
 
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
            
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
	  
	  //
	  //初始化内部晶振 HSI
	  //
	  /* At this stage the HSI is already enabled */
	  
	  /* Enable Prefetch Buffer and set Flash Latency */
	  FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
	  
	  /* HCLK = SYSCLK */
	  RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
	  
	  /* PCLK = HCLK */
	  RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
	  //
	  //这里和外部晶振不一样,请注意
	  //
	  /* PLL configuration = (HSI/2) * 12 = ~48 MHz */
	  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL));  //清空PLLSRC和PLLMUL
	  RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLMUL12);  //HSI两分频,乘以12,倍频到48MHz
	  
	  /* Enable PLL */
	  RCC->CR |= RCC_CR_PLLON;
	  
	  /* Wait till PLL is ready */
      while((RCC->CR & RCC_CR_PLLRDY) == 0)
      {
      }
	  
	  /* Select PLL as system clock source */
	  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
	  RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
	  
	  /* Wait till PLL is used as system clock source */
	  while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
	  {
	  }
  }  
}

实在还懒的话,这个是我自己弄的一个stm32f072c8t6的空工程,下载地址:https://download.csdn.net/download/Emb_2333/12350545

你可能感兴趣的:(我的专栏)