STM32 UART时钟初始化经验

STM32 UART时钟初始化经验

RCC时钟

由于设备APB(外部时钟中线)不一样,USART1用的是APB2,USART2~UART5用的是APB1,不注意是容易导致时钟启动失败:

typedef struct
{
	USART_TypeDef *	UARTx;
	uint8_t			    NVIC_IRQChannel;
	uint32_t		    comClk;
	uint32_t		    TXPortClk;
	uint32_t		    RXPortClk;
	GPIO_TypeDef *	TxPort;	
	uint16_t		    TxPin;
	GPIO_TypeDef *	RxPort;
	uint16_t		    RxPin;
  uint8_t         IRQPrio;
}boardCOMCfg;

boardCOMCfg boardComCfg[comNum] = {
	{	USART1,	USART1_IRQn, RCC_APB2Periph_USART1,	RCC_APB2Periph_GPIOA,	RCC_APB2Periph_GPIOA,	GPIOA,	GPIO_Pin_9,		GPIOA,	GPIO_Pin_10	,3},	
	{	USART2,	USART2_IRQn, RCC_APB1Periph_USART2,	RCC_APB2Periph_GPIOA,	RCC_APB2Periph_GPIOA,	GPIOA,	GPIO_Pin_2,		GPIOA,	GPIO_Pin_3	,3},	
	{	USART3,	USART3_IRQn, RCC_APB1Periph_USART3,	RCC_APB2Periph_GPIOB,	RCC_APB2Periph_GPIOB,	GPIOB,	GPIO_Pin_10,	GPIOB,	GPIO_Pin_11 ,3},	
	{	UART4,	UART4_IRQn,	 RCC_APB1Periph_UART4,	RCC_APB2Periph_GPIOC,	RCC_APB2Periph_GPIOC,	GPIOC,	GPIO_Pin_10,	GPIOC,	GPIO_Pin_11 ,2},	
	{	UART5,	UART5_IRQn,	 RCC_APB1Periph_UART5,	RCC_APB2Periph_GPIOC,	RCC_APB2Periph_GPIOD,	GPIOC,	GPIO_Pin_12,	GPIOD,	GPIO_Pin_2  ,1}
};

u8 boardComInit(u8 comX,u32 bound){
  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;	
  //comX ·¶Î§ÊÇ1-5
  if(comX==0 || comX>5)
  {
    return 1;
  }
 
  if(comX == 1)
    RCC_APB2PeriphClockCmd(boardComCfg[comX-1].comClk , ENABLE);
  else
    RCC_APB1PeriphClockCmd(boardComCfg[comX-1].comClk , ENABLE);
  
  RCC_APB1PeriphClockCmd(boardComCfg[comX-1].TXPortClk , ENABLE);
  RCC_APB2PeriphClockCmd(boardComCfg[comX-1].RXPortClk, ENABLE);
  
	USART_DeInit(boardComCfg[comX-1].UARTx);
  
	/* Configure USART Tx as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = boardComCfg[comX-1].TxPin; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
  GPIO_Init(boardComCfg[comX-1].RxPort, &GPIO_InitStructure);
   
    /* Configure USART Rx as input floating */	  
  GPIO_InitStructure.GPIO_Pin = boardComCfg[comX-1].RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(boardComCfg[comX-1].TxPort, &GPIO_InitStructure);  
  
   //USART 
	USART_InitStructure.USART_BaudRate = bound;					
	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_Rx | USART_Mode_Tx;	

    USART_Init(boardComCfg[comX-1].UARTx, &USART_InitStructure); 		
  
   //NVIC
  NVIC_InitStructure.NVIC_IRQChannel = boardComCfg[comX-1].NVIC_IRQChannel;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = boardComCfg[comX-1].IRQPrio;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);							
  USART_ITConfig(boardComCfg[comX-1].UARTx, USART_IT_RXNE, ENABLE);	
  
  USART_Cmd(boardComCfg[comX-1].UARTx, ENABLE);                    
  
  return 0;
}

波特率

猜你喜欢

转载自blog.csdn.net/qq_27741499/article/details/89849717