STM32自學?串口發送+接收

一、相關函數說明:

?USART_ClockInit()和USART_ClockStructInit(); 用來配置同步時鐘輸出

?USART_DMACmd(); 開啟USART到DMA的觸發通道

?USART_SendData(); 發送數據

?USART_ReceiveData(); 接收數據

二、程序代碼

serial.c文件

?#include "stm32f10x.h"

#include "stm32f10x_usart.h"

#include "serial.h"

#include "stdio.h"

#include <stdarg.h>

uint8_t serial_RxData;

uint8_t serival_RxFlag;

/*初始化函數*/

void serial_Init(void)

{

/*

?初始化步驟:

?1.開啟GPIO和USART時鐘

?2.初始化GPIO,把TX配置為復用輸出,RX配置為輸入

?3.初始化并配置USART?

?4.如果只需要發送的功能,就直接開啟USART

?5.如果需要接受數據,還需要配置中斷(即在開啟USART之前添加ITConfig和NVIC的代碼)

?*/

?//開啟時鐘

?RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

?//初始化配置GPIO

?GPIO_InitTypeDef GPIO_InitStruct;

?GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

?GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

?GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

?GPIO_Init(GPIOA,&GPIO_InitStruct);

?GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

?GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;

?GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

?GPIO_Init(GPIOA,&GPIO_InitStruct);

?//初始化配置USART

?USART_InitTypeDef USART_InitStruct;

?USART_InitStruct.USART_BaudRate=9600; //波特率

?USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制

?USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //發送與接受模式

?USART_InitStruct.USART_Parity=USART_Parity_No; //校驗位

?USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位

?USART_InitStruct.USART_WordLength=USART_WordLength_8b; //字長

?USART_Init(USART1,&USART_InitStruct);

?//開啟中斷

?USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

?//配置NVIC

?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

?NVIC_InitTypeDef NVIC_InitStruct;

?NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; //中斷通道

?NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;??

?NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;

?NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

?NVIC_Init(&NVIC_InitStruct);

?//開啟USART

?USART_Cmd(USART1,ENABLE);

}

/*發送數據函數(發送一個字節)*/

void serial_SendByte(uint8_t Byte)

{

?USART_SendData(USART1,Byte);

?while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

}

/*發送數據函數(發送一個數組)*/

void serial_SendArray(uint8_t *Array,uint16_t Length)

{

?uint16_t i;

?for(i=0;i<Length;i++)

?{

? serial_SendByte(Array[i]);

?}

}

/*發送數據函數(發送一個字符串)*/

void serial_SendString(char *String)

{

?uint8_t i;

?for(i=0;String[i]!='\0';i++)

?{

? serial_SendByte(String[i]);

?}

}

/*發送數據函數(發送一個數字)*/

uint32_t serial_Pow(uint32_t X,uint32_t Y)

{

?uint32_t Result=1;

?while(Y--)

?{

? Result*=X;

?}

?return Result;

}

void serial_SendNumber(uint32_t Number, uint8_t Length)

{

?uint8_t i;

?for(i=0;i<Length;i++)

?{

? serial_SendByte(Number/serial_Pow(10,Length-i-1)%10+'0');

?}

}

/*重寫Fputc函數*/

int fputc(int ch,FILE *f)

{

?serial_SendByte(ch);

?return ch;

}

/*封裝*/

void serial_Printf(char *format,...)

{

?char String[100];

?va_list arg;

?va_start(arg,format);

?vsprintf(String,format,arg);

?va_end(arg);

?serial_SendString(String);

}

/*讀后清除標志位函數*/

uint8_t serial_GetRxFlag(void)

{

?if(serival_RxFlag==1)

?{

? serival_RxFlag=0;

? return 1;

?}

?return 0;

}?

/*讀后清除數據函數*/

uint8_t serial_GetRxData(void)

{

?return serial_RxData;

}

?

void USART1_IRQHandler(void)

{

?if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)

?{

? serial_RxData=USART_ReceiveData(USART1);

? serival_RxFlag=1;

? USART_ClearITPendingBit(USART1,USART_IT_RXNE);

?}

}

serial.h文件

#ifndef _SERIAL_H

#define _SERIAL_H

#include "stdint.h"

#include <stdio.h>

void serial_Init(void);

void serial_SendByte(uint8_t Byte);

void serial_SendArray(uint8_t *Array,uint16_t Length);

void serial_SendString(char *String);

void serial_SendNumber(uint32_t Number, uint8_t Length);

void serial_Printf(char *format,...);

uint8_t serial_GetRxFlag(void);

uint8_t serial_GetRxData(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "delay.h"

#include "OLED.h"

#include "serial.h"

uint8_t RxData;

int main (void)

{?

?//初始化

?OLED_Init();

?serial_Init();

?OLED_ShowString(1,1,"RxData:");

?while(1)

?{

? if(serial_GetRxFlag()==1)

? {

? ?RxData=serial_GetRxData();

? ?serial_SendByte(RxData);

? ?OLED_ShowHexNum(1,8,RxData,2);

? }

?}

}

?

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

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

相關文章

文件底層的深入理解之文件輸入輸出重定向

目錄 一、文件fd的分配規則 二、對輸出重定向現象的理解 三、輸出輸入重定向的簡單實現 1、輸出重定向 2、輸入重定向 一、文件fd的分配規則 最小的沒有被使用的數組下標&#xff0c;會被分配給最新打開的文件。 二、對輸出重定向現象的理解 正如上面這段代碼所示&#xff0…

C語言實現日本某地發生了一件謀殺案

題目 猜兇手 題目內容&#xff1a; 日本某地發生了一件謀殺案&#xff0c;警察通過排查確定殺人兇手必為4個嫌疑犯的一個。 以下為4個嫌疑犯的供詞: A說&#xff1a;不是我。 B說&#xff1a;是C。 C說&#xff1a;是D。 D說&#xff1a;C在胡說 已知3個人說了真話&…

從零開始學習Netty - 學習筆記 -Netty入門【半包,黏包】

Netty進階 1.黏包半包 1.1.黏包 服務端代碼 public class HelloWorldServer {private static final Logger logger LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventL…

Ubuntu上Jenkins自動化部署Gitee上VUE項目

文章目錄 1.安裝NodeJS插件2.配置全局工具配置-NodeJS環境變量3.新建自由風格的軟件項目任務4.配置General配置丟棄舊的構建配置參數化構建過程 5.配置源碼管理6.構建觸發器7.設置構建環境8.配置構建步驟9.配置構建后操作10測試構建 前文鏈接&#xff1a; Ubuntu上Jenkins自動…

java常用應用程序編程接口(API)——Instant,DateTimeFormatter,Period,Duration概述

前言&#xff1a; 整理下學習心得。打好基礎&#xff0c;daydayup&#xff01; Instant Instant是時間線上的某個時刻/時間戳&#xff0c;通過獲取Instant的對象可以拿到此刻的時間&#xff0c;該時間由兩部分組成&#xff1a;1&#xff0c;從1970年1月1日00:00:00開始走到此刻…

前端開發 VSCode 插件推薦

1、Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code VS Code 的中文&#xff08;簡體&#xff09;語言包&#xff0c;此中文&#xff08;簡體&#xff09;語言包為 VS Code 提供本地化界面。 下載地址&#xff1a;Chinese (Simplified) (簡體中文) La…

D*算法超詳解 (D星算法 / Dynamic A*算法/ Dstar算法)(死循環解決--跟其他資料不一樣奧)

所需先驗知識&#xff08;沒有先驗知識可能會有大礙&#xff0c;了解的話會對D*的理解有幫助&#xff09;&#xff1a;A*算法/ Dijkstra算法 何為D*算法 Dijkstra算法是無啟發的尋找圖中兩節點的最短連接路徑的算法&#xff0c;A*算法則是在Dijkstra算法的基礎上加入了啟發函數…

[JavaWeb玩耍日記]HTML+CSS+JS快速使用

目錄 一.標簽 二.指定css 三.css選擇器 四.超鏈接 五.視頻與排版 六.布局測試 七.布局居中 八.表格 九.表單 十.表單項 十一.JS引入與輸出 十二.JS變量&#xff0c;循環&#xff0c;函數 十三.Array與字符串方法 十四.自定義對象與JSON 十五.BOM對象 十六.獲取…

Network LSA 結構簡述

Network LSA主要用于描述一個區域內的網絡拓撲結構&#xff0c;包括網絡中的路由器和連接到這些路由器的網絡。它記錄了每個路由器的鄰居關系、連接狀態以及連接的度量值&#xff08;如帶寬、延遲等&#xff09;&#xff0c;以便計算最短路徑和構建路由表。display ospf lsdb n…

網關kong記錄接口處理請求和響應插件 tcp-log-with-body的安裝

tcp-log-with-body 介紹 Kong的tcp-log-with-body插件是一個高效的工具&#xff0c;它能夠轉發Kong處理的請求和響應。這個插件非常適用于需要詳細記錄API請求和響應信息的情景&#xff0c;尤其是在調試和排查問題時。 軟件環境說明 kong version 2.1.4 - 2.8.3 [可用親測]C…

二、數據結構——單鏈表,雙鏈表,棧,隊列,單調棧,單調隊列,KMP,Trie,并查集,堆,哈希表等內容。

對于鏈表來說&#xff0c;由于new操作時間太長&#xff0c;因此&#xff0c;算法題中一般使用靜態鏈表。 1.單鏈表 采用數組實現單鏈表&#xff0c;可以直接開兩個數據&#xff0c;一個數組存放數值&#xff0c;另外一個數據存放下一個元素&#xff08;指針&#xff09;。 示…

JavaScript“基本語法”筆記(自學第一天)!

一、JavaScript的用途和應用領域 JavaScript的應用領域非常廣泛&#xff0c;主要包括以下幾個方面&#xff1a; 網頁交互性: JavaScript最初是為了增強網頁的交互性而開發的&#xff0c;它可以控制網頁的行為、樣式和內容&#xff0c;使用戶能夠與網頁進行實時交互&#xff0c…

一個教材上的CMS網站源碼在Linux服務器上登錄時驗證碼正常,但在windows下不能正常顯示

一個教材上的CMS網站源碼在Linux服務器上登錄時驗證碼正常&#xff0c;但在windows下不能正常顯示。 在linux服務器上能正常顯示。顯示界面如下所示&#xff1a;

蜻蜓FM語音下載(mediadown)

一、介紹 蜻蜓FM語音下載&#xff08;mediadown&#xff09;&#xff0c;能夠幫助你下載蜻蜓FM音頻節目。如果你是蜻蜓FM會員&#xff0c;它還能幫你下載會員節目。 二、下載地址 本站下載&#xff1a;蜻蜓FM語音下載&#xff08;mediadown&#xff09; 百度網盤下載&#…

Web 應用防火墻(WAF):功能、應用場景和未來發展方向

Web 應用防火墻&#xff08;WAF&#xff09;是一種用于保護 Web 應用程序免受各種網絡攻擊的安全工具。WAF 可以檢測并阻止對 Web 應用程序的惡意攻擊&#xff0c;如SQL 注入、跨站腳本&#xff08;XSS&#xff09;和跨站請求偽造&#xff08;CSRF&#xff09;等。它通過檢查 H…

【Redis 主從復制】

文章目錄 1 :peach:環境配置:peach:1.1 :apple:三種配置方式:apple:1.2 :apple:驗證:apple:1.3 :apple:斷開復制和切主:apple:1.4 :apple:安全性:apple:1.5 :apple:只讀:apple:1.6 :apple:傳輸延遲:apple: 2 :peach:拓撲結構:peach:2.1 :apple:?主?從結構:apple:2.2 :apple:?…

【MetaGPT】配置教程

MetaGPT配置教程&#xff08;使用智譜AI的GLM-4&#xff09; 文章目錄 MetaGPT配置教程&#xff08;使用智譜AI的GLM-4&#xff09;零、為什么要學MetaGPT一、配置環境二、克隆代碼倉庫三、設置智譜AI配置四、 示例demo&#xff08;狼羊對決&#xff09;五、參考鏈接 零、為什么…

大數據技術(一)

大數據技術概述 大數據技術層面及其功能 數據采集與預處理 利用ETL(extract-transform-load)工具將分布的、異構數據源中的數據&#xff0c;如關系數據、平面數據文件等&#xff0c;抽取到臨時中間層后進行清洗、轉換、集成&#xff0c;最后加載到數據倉庫或數據集市中&…

C語言什么是循環嵌套?

一、問題 分?結構是可以進?嵌套的&#xff0c;循環結構同樣也?持嵌套&#xff0c;那什么是循環嵌套呢&#xff1f; 二、解答 ?個循環體內?包含另?個完整的循環結構&#xff0c;就稱之為循環嵌套。內嵌的循環中還可以嵌套循環&#xff0c;這就是多層循環&#xff0c;也叫…

類與對象詳解 C++ (1)

1.struct和class 與C語言不同的是&#xff0c;C中struct和class可以定義成員變量和成員函數。更偏好用class。 2.類的定義 格式如下&#xff1a; class 為 定義類的 關鍵字&#xff0c; ClassName 為類的名字&#xff0c; {} 中為類的主體&#xff0c;注意 類定義結束時后面…