1. 程式人生 > >STM32F429之USART管腳複用

STM32F429之USART管腳複用

在f429中   

      USART1串列埠1  tx/rx PA9 PA10     串列埠1、6 APB2時鐘

USART2串列埠2  PA2 PA3           串列埠2、3、4、5、7 APB1時鐘


什麼叫管腳複用

STM32F4有很多的內建外設,這些外設的外部引腳都是與GPIO複用的。也就是說,一個GPIO如果可以複用為內建外設的功能引腳,那麼當這個GPIO作為內建外設使用的時候,就叫做複用。

以USART2為例TX,RX分別對應PD5,PD6

1.時鐘使能

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOD,ENABLE);

  USARTx_CLOCKCMD(RCC_APB2Periph_USART1, ENABLE);使能USART時鐘

   2.GPIO初始化

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

配置TX複用功能
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5  ;  

  GPIO_Init(GPIOD, &GPIO_InitStructure);

配置RX複用功能

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

連線TX、RX到USART

  GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,USARTx_RX_AF);

  GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,USARTx_TX_AF);

3.USART配置
  USART_InitStructure.USART_BaudRate = 115200;   波特率配置

  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控制模式同時使用接收和傳送

  USART_Init(USARTx, &USART_InitStructure);   寫入
    

  USART_Cmd(USARTx, ENABLE);  使能串列埠

}

具體程式如下A9,A10引腳

/**
  ******************************************************************************
  * @file    bsp_usart.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   Öض¨Ïòc¿âprintfº¯Êýµ½usart¶Ë¿Ú
  ******************************************************************************
  * @attention
  *
  * ʵÑéƽ̨:±ü»ð  STM32 F429 ¿ª·¢°å  
  * ÂÛ̳    :http://www.firebbs.cn
  * ÌÔ±¦    :http://firestm32.taobao.com
  *
  ******************************************************************************
  */ 
  
#include "./usart/bsp_usart.h"


 /**
  * @brief  USART GPIO ÅäÖÃ,¹¤×÷ģʽÅäÖá£115200 8-N-1 
  * @param  ÎÞ
  * @retval ÎÞ
  */
void USARTx_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
		
  RCC_AHB1PeriphClockCmd(USARTx_RX_GPIO_CLK|USARTx_TX_GPIO_CLK,ENABLE);

  /* ʹÄÜ USART ʱÖÓ */
  USARTx_CLOCKCMD(USARTx_CLK, ENABLE);
  
  /* GPIO³õʼ»¯ */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  /* ÅäÖÃTxÒý½ÅΪ¸´Óù¦ÄÜ  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  USARTx_TX_PIN  ;  
  GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);

  /* ÅäÖÃRxÒý½ÅΪ¸´Óù¦ÄÜ */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  USARTx_RX_PIN;
  GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);
  
 /* Á¬½Ó PXx µ½ USARTx_Tx*/
  GPIO_PinAFConfig(USARTx_RX_GPIO_PORT,USARTx_RX_SOURCE,USARTx_RX_AF);

  /*  Á¬½Ó PXx µ½ USARTx__Rx*/
  GPIO_PinAFConfig(USARTx_TX_GPIO_PORT,USARTx_TX_SOURCE,USARTx_TX_AF);
  
  /* ÅäÖô®DEBUG_USART ģʽ */
  /* ²¨ÌØÂÊÉèÖãºDEBUG_USART_BAUDRATE */
  USART_InitStructure.USART_BaudRate = USARTx_BAUDRATE;
  /* ×Ö³¤(Êý¾Ýλ+УÑéλ)£º8 */
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;	
  /* ֹͣλ£º1¸öֹͣλ */
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  /* УÑéλѡÔñ£ºÅ¼Ð£Ñé */  
	USART_InitStructure.USART_Parity = USART_Parity_No;
  /* Ó²¼þÁ÷¿ØÖÆ£º²»Ê¹ÓÃÓ²¼þÁ÷ */
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  /* USARTģʽ¿ØÖÆ£ºÍ¬Ê±Ê¹ÄܽÓÊպͷ¢ËÍ */
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* Íê³ÉUSART³õʼ»¯ÅäÖà */
  USART_Init(USARTx, &USART_InitStructure); 
	
  /* ʹÄÜ´®¿Ú */
  USART_Cmd(USARTx, ENABLE);
}

///Öض¨Ïòc¿âº¯Êýprintfµ½´®¿Ú£¬Öض¨Ïòºó¿ÉʹÓÃprintfº¯Êý
int fputc(int ch, FILE *f)
{
		/* ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ýµ½´®¿Ú */
		USART_SendData(USARTx, (uint8_t) ch);
		
		/* µÈ´ý·¢ËÍÍê±Ï */
		while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///Öض¨Ïòc¿âº¯Êýscanfµ½´®¿Ú£¬ÖØдÏòºó¿ÉʹÓÃscanf¡¢getcharµÈº¯Êý
int fgetc(FILE *f)
{
		/* µÈ´ý´®¿ÚÊäÈëÊý¾Ý */
		while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(USARTx);
}

/*********************************************END OF FILE**********************/