日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F407野火霸天虎系列笔记(三)UART通信

發布時間:2024/1/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F407野火霸天虎系列笔记(三)UART通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言


????????我在學習的過程中,經歷過毫無頭緒,找到一堆學習資料卻不知從何開始的痛苦。我希望我整理的筆記,不光可以方便自己在以后的項目中拿來即用,也希望能夠對那些喜歡玩硬件、愛折騰的小伙伴有所幫助。如果你們覺得我的文章對你們有用,歡迎大家點贊+收藏,讓我知道,我的工作是有價值的。

? ? ? ? 這篇筆記,綜合參考了野火、正點原子、st官方以及網絡上的一些資料,然后經過我自己的思考、嘗試與實踐,從而整理出來的。感謝那些愿意在學習的路上分享自己知識與經驗的前輩。
?

二、學習筆記

(一)、學習思路

1.初始化GPIO口

2.連接GPIO到復用的映射上

3.配置USART

? ? ? ? 串口參數初始化

? ? ? ? 串口使能

4.開啟中斷,初始化NVIC,使能NVIC

5.串口中斷服務函數

(二)、理論和代碼部分

協議層

起始位(1),位0-位7,校驗位(1),停止位(1)

必要函數了解:

獲取狀態標志位函數

// 獲取狀態標志位 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); // 清除狀態標志位 void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); // 獲取中斷狀態標志位 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); // 清除中斷狀態標志位 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

接收發送數據函數

// 發送數據到串口(通過寫USART_DR寄存器發送數據) void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); // 接收數據(從USART_DR寄存器讀取接收到的數據) uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

串口配置函數

// 串口初始化:波特率,數據字長,奇偶校驗,硬件流控以及收發使能 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); // 使能串口 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); // 使能相關中斷 void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);

1.初始化GPIO口

PA9為TX,PA10為RX.模式選擇復用模式

GPIO_InitTypeDef GPIO_InitStruct;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed = GPIO_Low_Speed;GPIO_Init(GPIOA, &GPIO_InitStruct);

2.連接GPIO到復用的映射上

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

3.串口初始化并且使能串口

注意對應開啟的時鐘在RCC頭文件中找

USART_InitTypeDef USART_InitStruct;/* 使能 USART 時鐘 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/* 配置串DEBUG_USART 模式 *//* 波特率設置:DEBUG_USART_BAUDRATE */USART_InitStruct.USART_BaudRate = 9600;/* 字長(數據位+校驗位):8 */USART_InitStruct.USART_WordLength = USART_WordLength_8b;/* 停止位:1個停止位 */USART_InitStruct.USART_StopBits = USART_StopBits_1;/* 校驗位選擇:不使用校驗 */USART_InitStruct.USART_Parity = USART_Parity_No;/* 硬件流控制:不使用硬件流 */USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/* USART模式控制:同時使能接收和發送 */USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/* 完成USART初始化配置 */USART_Init(DEBUG_USART, &USART_InitStruct); //使能串口 USART_Cmd(USART1, ENABLE);

4.配置中斷控制器和使能USART接收中斷

NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中斷控制器組選擇 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART為中斷源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 搶斷優先級為1 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子優先級為1 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure); //打開串口1的接收中斷,當串口1接收到數據時會觸發此中斷 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

5.中斷服務函數

注意以下:

1.中斷服務函數不能傳入參數;

2.中斷服務函數不能有返回值;

3.不要在函數中使用printf

/*** @brief 中斷接收處理函數* @param 無* @retval 無*/ void DEBUG_USART_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USART,USART_IT_RXNE)!=RESET)// 接收到數據{ ucTemp = USART_ReceiveData( DEBUG_USART );// 獲得串口1接收到的數據USART_SendData(DEBUG_USART,ucTemp); // 通過串口1發送數據} }

6。其他函數

/*** @brief 由單片機向電腦端發送一個字節* @param pUSARTx是單片機的串口* @param ch是發送的字節* @retval 無*/void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發送一個字節USART */USART_SendData(pUSARTx,ch);/* 等待發送數據寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }/*** @brief 由單片機向電腦端發送一個字節串* @param pUSARTx是單片機的串口* @param str是發送的字節串* @retval 無*/void Usart_SendString( USART_TypeDef * pUSARTx, char *str) {unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/*等待發送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){} }/*** @brief 由單片機向電腦端發送一個16進制數字* @param pUSARTx是單片機的串口* @param ch是發送的16進制數字* @retval 無*/void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch) {uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 發送高八位 */USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 發送低八位 */USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }///重定向c庫函數printf到串口,重定向后可使用printf函數 int fputc(int ch, FILE *f) {/* 發送一個字節數據到串口 */USART_SendData(DEBUG_USART, (uint8_t) ch);/* 等待發送完畢 */while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET); return (ch); }///重定向c庫函數scanf到串口,重寫向后可使用scanf、getchar等函數 int fgetc(FILE *f) {/* 等待串口輸入數據 */while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USART);

總結

以上是生活随笔為你收集整理的STM32F407野火霸天虎系列笔记(三)UART通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。