1. 程式人生 > >stm32f4串列埠初始化

stm32f4串列埠初始化

IO口配置的一般步驟

  • 1 定義一個IO口初始化結構體
  • 2 IO時鐘使能
  • 3 IO模式設定
  • 4 呼叫IO口初始化函式

串列埠配置的一般步驟

  • 1 定義一個IO口初始化結構體,定義一個串列埠初始化結構體
  • 2 IO時鐘使能
  • 3 串列埠時鐘使能
  • 4 IO模式設定
  • 5 IO口初始化
  • 6 串列埠引數配置
  • 7 串列埠初始化
  • 8 串列埠使能

1. 宣告結構體變數

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStruct; 

    GPIO_InitTypeDef(IO口)是一個結構體變數,包括GPIO_Pin(u16型別),GPIOSpeed(GPIOSpeed_TypeDef 型別)和GPIOMode(GPIOMode_TypeDef 型別),之後在設定引腳時會再用到。

2. RCC時鐘設定

  • RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時鐘

  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘

-串列埠1模組時鐘暫存器:RCC_APB2Periph_USART1;

-串列埠1埠(PA9/PA10)的時鐘暫存器:RCC_AHB1Periph_GPIOA;

3. 設定引腳的IO功能模式和speed

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);//

串列埠1對應引腳複用對映,GPIOA9複用為USART1
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);//串列埠1對應引腳複用對映,GPIOA10複用為USART1

/* 定義USART1-TX引腳PA9 */ 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //IO口第9腳

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//複用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推免複用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 定義USART1-RX引腳 PA10 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //IO口第10腳

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//不確定
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//不確定
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不確定

GPIO_Init(GPIOA, &GPIO_InitStructure);

4. 串列埠初始化設定

USART_InitStructure.USART_BaudRate=115200;//波特率

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(USART1, &USART_InitStructure); //把以上設定寫入暫存器中(串列埠1)

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟相關中斷

//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//傳送中斷

USART_Cmd(USART1, ENABLE); //使能串列埠1

5. 中斷設定

NVIC_InitTypeDef  NVIC_InitStructure; //宣告結構體變數

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //IRQ通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//主優先順序

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//次優先順序

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能

NVIC_Init(&NVIC_InitStructure); //根據指定的引數初始化VIC暫存器

6.中斷服務程式
void USART1_IRQHandler(void) //中斷函式,(重寫了)
{
u16 DATA;

USART1->SR;//防止首字元丟失
//unsigned char ch;

if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//判斷如果收到了資料,收到資料CR1中RXNE位為1,該函式的返回值為1,則執行if包含的語句
{
DATA=USART_ReceiveData(USART1);//讀取資料
USART_SendData(USART1,DATA);//傳送讀到的資料
}
//while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=SET);//等待PC的訊息
//order=USART_ReceiveData(USART1);//讀取收到的訊息
//USART_SendData(USART1,order);//傳送訊息
//while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待資料傳送完
}