STMF4串列埠通訊使用

shishusheng發表於2024-07-14

目錄
  • STMF4串列埠通訊使用
    • USART的使用流程
    • 注意

STMF4串列埠通訊使用

前提回顧:
串列埠通訊概念介紹1
STM32串列埠通訊概念介紹2
針對特定stm32F4板子的串列埠接線

摺疊文字 USART指的是通用同步非同步收發器,是STM32中的序列通訊裝置,STM32F407ZET6一共提供了6個序列介面供使用者使用,其中4個為USART,2個為UART。UART指的是通用非同步收發器,其實就是在USART的基礎上裁掉了同步通訊的功能,只保留了非同步通訊。 可以看到STM32中的USART採用工業標準中常用的NRZ編碼進行通訊,NRZ碼指的是不歸零碼(Non-Return-Zero),指的是每次傳輸1bit資料後電平不歸零,其實還有一種RZ碼,指的是歸零碼(Return-Zero),指的是每次傳輸1bit資料後需要電平歸零。

平時大家一般都是使用串列埠的非同步通訊功能,區分同步還是非同步其實很簡單,就是看是否在通訊是對外提供時鐘輸出。

USART的使用流程

  1. 開啟KEIL5工程,然後把ST公司提供的標準外設庫的關於USART的原始檔新增到工程中

  2. 參考並分析ST公司提供的程式碼例程以及提供的關於USART原始檔的開頭註釋,進行理解

image

點選檢視程式碼

void USART1_Config(u32 baud)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//開啟了GPIO埠時鐘  PA9和PA10
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	//開啟USART1的時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//選擇GPIO引腳的複用功能
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_USART1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
	
	//配置GPIO引腳 注意:複用模式
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_9|GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//配置串列埠引數+對串列埠初始化
	USART_InitStructure.USART_BaudRate = baud;																			        
    //波特率
	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);

	//配置NVIC引數 + 對NVIC初始化
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	//選擇USART1的中斷源,接收到資料則觸發中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//開啟串列埠
	USART_Cmd(USART1, ENABLE);
}

//利用串列埠傳送一個字串
void  USART1_SendString(const char *str)
{
	while(*str)
	{
		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );
		 USART_SendData(USART1,*str++);
		 		
	}
}

//前臺程式就是中斷服務程式,該程式是不需要手動呼叫的,當中斷觸發之後CPU會自動跳轉過來執行該函式
void USART1_IRQHandler(void)
{
	uint8_t data;
  //判斷中斷是否發生
  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  {   
		//從USART1中接收一個位元組
		data = USART_ReceiveData(USART1);  //一次只能接收一個位元組   
		
		//把接收到的資料轉發出去
		USART_SendData(USART1,data);
  }
}

int main()
{
	
	//1.硬體的初始化
	USART1_Config(9600);
	
	while(1)
	{
		 	//把接收到的資料轉發出去
		  USART_SendData(USART1,'h');
		  delay_ms(500);
		
	}
}





注意

  • 如果打算串列埠傳送字串,由於字串屬於字元序列,所以按照順序傳送字元,由於串列埠外設的傳送資料暫存器是8bit的,所以每次只能傳送1個字元,並且只有等上一次字元傳送完成,才可以傳送下一個字元。
  • 可以透過檢測串列埠外設的傳送資料暫存器是否為空,來判斷待傳送的位元組是否傳送完成,所以需要檢測狀態標誌。
  • 配置GPIO引腳 注意:複用模式
  • 接收資料用上中斷,要用上NVIC->NVIC、EXIT學習

參考李明軒老師第9天的筆記

相關文章