串口通信寄存器/庫函數配置、實例編寫

常用的串口相關寄存器

  • USART_SR狀態寄存器
  • USART_DR數據寄存器
  • USART_BRR波特率寄存器

串口操作相關庫函數(省略入口參數):

void USART_Init(); //串口初始化:波特率,數據字長,奇偶校驗,硬件流控以及收發使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相關中斷void USART_SendData();//發送數據到串口,DR
uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據FlagStatus USART_GetFlagStatus();//獲取狀態標志位
void USART_ClearFlag();//清除狀態標志位
ITStatus USART_GetITStatus();//獲取中斷狀態標志位,若有數據到來則返回一。
void USART_ClearITPendingBit();//清除中斷狀態標志位

在這里插入圖片描述

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
例如我們要判斷讀寄存器是否非空(RXNE),操作庫函數的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我們要判斷發送是否完成(TC),操作庫函數的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);

在這里插入圖片描述

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

在這里插入圖片描述

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

波特率計算方法:

在這里插入圖片描述在這里插入圖片描述
串口配置的一般步驟

  • 串口時鐘使能,GPIO時鐘使能,都是這一個函數:
RCC_APB2PeriphClockCmd();
  • 串口復位:
USART_DeInit(); 這一步不是必須的
  • GPIO端口模式設置:
GPIO_Init(); 
TX的模式設置為GPIO_Mode_AF_PP
RX的模式設置為浮空輸入( GPIO_Mode_IN_FLOATING)
或帶上拉輸入(GPIO_Mode_IPU)
  • PS :外設的GPIO的MODE配置:
    在這里插入圖片描述

  • 串口參數初始化:

USART_Init();
這個函數的第一個入口參數是指定初始化的串口標號,這里選擇 USART1。
第二個入口參數是一個 USART_InitTypeDef 類型的結構體指針,這個結構體指針的成員變量用
來設置串口的一些參數。一般的實現格式為:
USART_InitStructure.USART_BaudRate = bound; //波特率設置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為 8 位數據格式
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_Init();USART_ITConfig();
  • 使能串口:
USART_Cmd();
  • 編寫中斷處理函數:
USARTx_IRQHandler();
  • 串口數據收發:
void USART_SendData();//發送數據到串口,DR
uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據
  • 串口傳輸狀態獲取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

USART.h部分代碼:

#ifndef __UART_H
#define __UART_H
#include "stm32f10x.h"void My_Usart_Init(void);//串口、GPIO、中斷初始化函數
void USART1_IRQHandler(void);//中斷函數#endif

USART.c部分代碼:

#include "USART.h"
void My_Usart_Init(void)
{USART_InitTypeDef USART_InitStrue;GPIO_InitTypeDef GPIO_InitSture;NVIC_InitTypeDef NVIC_InitSture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA時鐘使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口時鐘使能USART_DeInit( USART1);//串口復位GPIO_InitSture.GPIO_Pin=GPIO_Pin_9;GPIO_InitSture.GPIO_Mode=GPIO_Mode_AF_PP;//設置GPIOA.9的模式是復用推挽輸出GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化GPIO_InitSture.GPIO_Pin=GPIO_Pin_10;GPIO_InitSture.GPIO_Mode= GPIO_Mode_IN_FLOATING;//設置GPIOA.10的模式是浮空輸入GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化USART_InitStrue.USART_BaudRate=115200;//波特率115200USART_InitStrue.USART_WordLength=USART_WordLength_8b;//8個數據位USART_InitStrue.USART_StopBits=USART_StopBits_1;//一個停止位USART_InitStrue.USART_Parity=USART_Parity_No;//無奇偶校驗位USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發模式USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStrue);//串口初始化USART_Cmd(USART1,ENABLE);//串口使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟接收中斷,第一個參數是要使能哪個串口的中斷。//第二個參數是確定使能中斷的類型USART_IT_RXNE是接收緩沖區非空//當接受緩沖區非空的時候觸發中斷,TC是發送完成觸發中斷NVIC_InitSture.NVIC_IRQChannel=USART1_IRQn;//指出是哪一個通道(在stm32f10x.h中可查看通道)NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE;NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitSture.NVIC_IRQChannelSubPriority=1;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷設置分組NVIC_Init(&NVIC_InitSture);//中斷初始化
}void USART1_IRQHandler(void)//中斷函數
{u8 read;if(USART_GetITStatus(USART1,USART_IT_RXNE)){read=USART_ReceiveData(USART1);//讀取數據USART_SendData(USART1,read);}
}

main.c部分代碼:

#include "stm32f10x.h"
#include "USRT.h"int main(void)
{	My_Usart_Init();while(1);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用docker安裝Mongodb

下載mongo3.2的docker鏡像: docker pull mongo:3.2 使用docker命令啟動: docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已經成功啟動

移動端meta標簽

現在的手機或平板電腦等移動設備上的瀏覽器默認都有雙擊放大的設置&#xff0c;如何阻止雙擊放大&#xff1f;user-scalableno <!-- 禁止縮放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正點原子stm32--串口通信實驗講解里關于USART_RX_STA的問題與思考

這篇博文講的挺詳細的可以參考以下&#xff1a; USART_RX_STA詳解

什么是真正的程序員?

什么是真正的程序員 這篇文章的原文來自&#xff1a;A Little Printf Story作者仿照《小王子》中的情節&#xff0c;通過小printf遇見的不同類型的程序員&#xff0c;最后悟出什么才是真正的程序員&#xff01;第一次翻譯有很多不妥&#xff0c;歡迎留言指正。 文章略長&#x…

為什么會出現docker

docker鏡像&#xff0c;一次構建&#xff0c;到處運行

docker和虛擬機的區別

虛擬機缺點&#xff1a; docker和虛擬機的不同之處&#xff1a;

獨立看門狗實驗

為什么要看門狗 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff0c;而陷入死循環&#xff0c;程序的正常運行被打斷&#xff0c;由單片機控制的系統無法繼續工作&#xff0c;會造成整個系統…

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker資源

Docker資源 Docker官方英文資源&#xff1a; docker官網&#xff1a;http://www.docker.com Docker windows入門&#xff1a;https://docs.docker.com/windows/ Docker Linux 入門&#xff1a;https://docs.docker.com/linux/ Docker mac 入門&#xff1a;https://docs.do…

ios apple pay 證書配置

一 環境配置 需要開發者賬號 開發者中心https://developer.apple.com/membercenter/index.action 添加一個APP IDs二&#xff0e;配置Merchant IDs商業ID 下面進行appids和商業id的綁定 之后在回到appids中查看id中的apple pay&#xff0c;發現已經變為可使用狀態了 接下來是為…

STM32 通用定時器基本原理

STM32F10x系列總共最多有8個定時器&#xff1a; 三種STM32定時器區別&#xff1a; 通用定時器功能特點描述&#xff1a; ①、 STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定時器功能特點包括&#xff1a; 位于低速的APB1總線上(時鐘來源可以是APB1的時鐘) 16 位向上、向…

初識-Android之智能短信項目相關技術整理

標簽頁切換采用傳統的TabHost&#xff1a; 采用TabActivty實現TabHost。 效果圖-后補&#xff1a; 相關技術詳解推薦&#xff1a; http://blog.csdn.net/zhouli_05/article/details/7696054 這里我解決了一個TabActivity和子Activity共享TabActivity的OptionMenu的問題&#xf…

STM32 定時器中斷

通用定時器工作過程&#xff1a; 時鐘選擇&#xff1a; 計數器時鐘可以由下列時鐘源提供&#xff1a; 內部時鐘(CK_INT)外部時鐘模式1&#xff1a;外部輸入腳(TIx)外部時鐘模式2&#xff1a;外部觸發輸入(ETR)內部觸發輸入(ITRx)&#xff1a;使用一個定時器作為另一個定時器…

Debian8.3.0下安裝Odoo8.0步驟

Debian8.3.0下安裝Odoo8.0的方法 假設你已經安裝好了Debian 系統&#xff0c;使用root帳號執行如下命令 # apt-get update && apt-get upgrade # Install system updates # apt-get install sudo # Make sure sudo is installed 使用如下命令來創建一個Odoo用戶&am…

STM32 PWM輸出實驗

定時器用來產生PWM輸出&#xff1a; STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出&#xff0c;這樣&#xff0c;STM32 最多可以同時產生…

docker鏡像和容器區別

docker鏡像 docker容器&#xff0c;容器是用鏡像創建的運行實例

域名相關的一些基礎知識

DNS DNS&#xff0c;Domain Name System或者Domain Name Service(域名系統或者域名服務)。域名系統為Internet上的主機分配域名地址和IP地址。由于網絡中的計算機都必須有個IP地址&#xff0c;這樣相互之間才能通信&#xff0c;但讓我們記住一大串的IP地址來訪問網站顯然是不可…