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);//
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);//等待資料傳送完
}