stm32 f103c8t6仿真 串口收發測試

C8T6串口概述

STM32F103C8T6微控制器包含3個串口模塊:

  • USART1 (高級串口)

  • USART2

  • USART3 (部分型號可能標記為UART3)

  • 引腳分布圖

USART1 (串口1)

基本特性

  • 類型:全功能USART(通用同步異步收發器)

  • 通信模式

    • 全雙工異步通信

    • 單線半雙工通信

    • 同步通信(需要外部時鐘)

    • 支持LIN總線協議

    • 支持IrDA SIR ENDEC規范

    • 支持智能卡協議(ISO7816)

引腳分配

  • TX:PA9 (主用), PB6 (重映射)

  • RX:PA10 (主用), PB7 (重映射)

  • CK:PA8 (同步模式時鐘, 主用), PB6 (重映射)

  • CTS:PA11 (主用), PB13 (重映射)

  • RTS:PA12 (主用), PB14 (重映射)

性能參數

  • 最高支持4.5Mbps傳輸速率(在72MHz系統時鐘下)

  • 可編程數據字長度(8或9位)

  • 可配置的停止位(1或2位)

  • 可選的奇偶校驗位(偶校驗/奇校驗)

USART2 (串口2)

基本特性

  • 類型:基本USART

  • 通信模式

    • 全雙工異步通信

    • 單線半雙工通信

    • 不支持同步模式和硬件流控制

引腳分配

  • TX:PA2 (主用), PD5 (重映射)

  • RX:PA3 (主用), PD6 (重映射)

性能參數

  • 最高支持2.25Mbps傳輸速率

  • 可編程數據字長度(8或9位)

  • 可配置的停止位(1位)

  • 可選的奇偶校驗位(偶校驗/奇校驗)

USART3 (串口3)

基本特性

  • 類型:基本UART(在STM32F103C8T6上功能較USART1簡化)

  • 通信模式

    • 全雙工異步通信

    • 單線半雙工通信

    • 不支持同步模式

引腳分配

  • TX:PB10 (主用), PC10 (部分重映射), PD8 (完全重映射)

  • RX:PB11 (主用), PC11 (部分重映射), PD9 (完全重映射)

性能參數

  • 最高支持2.25Mbps傳輸速率

  • 可編程數據字長度(8位)

  • 可配置的停止位(1位)

  • 可選的奇偶校驗位(偶校驗/奇校驗)

主要區別對比

特性USART1USART2USART3
類型全功能USART基本USART基本UART
同步模式支持不支持不支持
硬件流控制支持(CTS/RTS)不支持不支持
最高速率4.5Mbps2.25Mbps2.25Mbps
DMA支持發送和接收發送和接收發送和接收
中斷源豐富基本基本
時鐘源PCLK2(APB2)PCLK1(APB1)PCLK1(APB1)

時鐘配置

  • USART1掛載在APB2總線上(最高72MHz)

  • USART2和USART3掛載在APB1總線上(最高36MHz)

應用建議

  1. USART1:推薦用于高速通信或需要硬件流控制的場景

  2. USART2/USART3:適合普通速率通信,節省硬件資源

  3. 多串口應用時,可根據外設連接方便性選擇不同的串口

STM32 代碼實現

注意:本次采用串口1? tx :pa9 rx:pa10實現。

proteus 仿真電路圖

虛擬串口配置:虛擬串口配置教程

串口3實現代碼

? ? ? ? usart.c


#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"static int Send_buf[10] = {0} ; u8 USART3_RX_STA = 0;       //接收狀態標記
u8 USART3_RX_CMD;void USART3_Init(u32 bound)
{//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);                           //使能USART3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,  ENABLE);     //使能GPIOB時鐘,端口復用時鐘//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                        //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //萬勿省略此條,一經刪除則發送不了數據GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	                 //復用推挽輸出GPIO_Init(GPIOB, &GPIO_InitStructure);                           //初始化GPIOB.10//USART3_RX	  GPIOB.11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                        //PB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);                           //初始化GPIOB.11 //USART 初始化設置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(USART3, &USART_InitStructure);                                          //初始化串口3	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                   //開啟串口接受中斷//Usart3 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;          //搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		            //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			              //IRQ通道使能NVIC_Init(&NVIC_InitStructure);	                                  //根據指定的參數初始化VIC寄存器USART_Cmd(USART3, ENABLE);}void USART3_SendByte(uint8_t  Data)    //串口發送一個字節;字節 (byte)    1byte=8bit
{while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);    //USART_FLAG_TXE發送寄存器空USART_SendData(USART3, Data);      //從串口2發送傳入的數據while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);	   //USART_FLAG_TC發送完成標志
}void USART3_IRQHandler(void)                           	//串口2中斷服務程序
{u8 Res=0;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中斷{Res=USART_ReceiveData(USART3);	                     //讀取接收到的數據USART3_RX_CMD = Res;                                  //把接收到的數據傳遞給USART_RX_CMDUSART3_RX_STA=1;USART3_SendByte(Res);		//去進入主函數WHILE語句					}	
}void USART3_SendCmd(int len)
{	int i = 0 ;USART3_SendByte(0x7E);       //起始for(i=0; i<len; i++)//數據{	  USART3_SendByte(Send_buf[i]);   //len 為8 ;依次將Send_buf[0]、Send_buf[1] !!!Send_buf[8]  發送出來	}USART3_SendByte(0xEF);    //結束}void Uart3_SendCMD(int CMD ,int dat1 , int dat2 ,int dat3)
{Send_buf[0] = 0xff;              //保留字節 Send_buf[1] = 0x06;              //長度Send_buf[2] = CMD;               //控制指令Send_buf[3] = (int)(dat1);       //Send_buf[4] = (int)(dat2);       //datah2Send_buf[5] = (int)(dat3);       //datal3USART3_SendCmd(6);               //發送此幀數據
}void USART3_SendString(char *str)
{while (*str){while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);USART_SendData(USART3, *str++);}
}

usart.c

#ifndef __USART3_H
#define	__USART3_H#include "stm32f10x.h"
#include <stdio.h>
#include "sys.h" #define EN_USART3_RX 			1		//使能(1)/禁止(0)串口1接收extern u8 USART3_RX_STA;         		//接收狀態標記	
extern u8 USART3_RX_CMD;         	//void Init_hardware_usart2_(u32 bound);
void USART3_Init(u32 bound);void USART3_IRQHandler(void);void USART3_SendByte(uint8_t  Data); void Uart3_SendCMD(int CMD ,int dat1 , int dat2 ,int dat3);
void USART3_SendString(char *str);#endif

?

主函數

#include "stm32f10x.h"                  
#include "delay.h"
#include "oled.h"#include "usart3.h"//蜂鳴器初始化---------------------------------------------------------------------------------------
#define BEEP_GPIO_PIN_PROT GPIOB
#define BEEP_GPIO_PIN GPIO_Pin_5
void Beep_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin =BEEP_GPIO_PIN ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BEEP_GPIO_PIN_PROT, &GPIO_InitStructure);//GPIO_ResetBits(BEEP_GPIO_PIN_PROT,BEEP_GPIO_PIN);//默認給0,關閉GPIO_ResetBits(BEEP_GPIO_PIN_PROT,BEEP_GPIO_PIN);
}
//蜂鳴器驅動
void Beep_Run(unsigned char x)
{if(x==1){GPIO_SetBits(BEEP_GPIO_PIN_PROT,BEEP_GPIO_PIN);}else{GPIO_ResetBits(BEEP_GPIO_PIN_PROT,BEEP_GPIO_PIN);}}int main()
{SystemInit();//配置系統時鐘為72M	delay_init(72);//延時初始化OLED_Init();//OLED 屏幕USART3_Init(9600);USART3_SendString("hello");while (1){}//while line}

測試效果

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

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

相關文章

語言特性適用的場景:衛星、火箭控制系統用什么開發語言?

核心飛行控制系統開發語言 衛星、火箭及相關航天系統的軟件開發對可靠性、實時性、安全性有極高要求&#xff0c;因此語言選擇需嚴格匹配這些需求。以下是航天領域常用的編程語言及其應用場景分析&#xff1a; 一、核心飛行控制與嵌入式系統&#xff1a;C、C、Ada 航天器的核…

AI for Science:智能科技如何重塑科學研究

AI與科學研究的邂逅 人工智能&#xff08;Artificial Intelligence&#xff0c;簡稱AI&#xff09;作為一門致力于模擬人類智能的交叉學科&#xff0c;近年來已經從實驗室走向現實世界的各個角落&#xff0c;而科學研究領域正是其最具變革潛力的舞臺之一。AI的核心在于通過算法…

項目三 - 任務7:開發名片管理系統

在本次項目三的任務7中&#xff0c;我們成功開發了一個功能全面的名片管理系統。該系統采用Java語言&#xff0c;基于MVC&#xff08;模型-視圖-控制器&#xff09;架構模式&#xff0c;實現了用戶登錄、名片的增刪改查等核心功能。通過設計Card類來封裝名片信息&#xff0c;Ca…

MySQL 8.0 OCP 英文題庫解析(十八)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題161~170 試題1…

leetcode_503 下一個更大元素

1. 題意 在一個循環數組中&#xff0c;找到下一個比它大的數。 2. 題解 也不知道怎么就單調棧了&#xff0c;可能是刷出來的吧。。。 還是來解釋一下吧&#xff01;&#xff01;&#xff01; 如果有新元素入棧 c c c&#xff0c; 那么在棧內的元素只要小于新元素的 s s s…

在postgresql中,group by時取第一個值

在postgresql中,group by時,uuid類型的字段可以用哪個聚集函數: SELECT create_user , (array_agg(myid))[1] AS first_uuid FROM "t_resource_data" GROUP BY create_user 人大金倉、PostgreSQL使用GROUP BY聚合后&#xff0c;取第一個值或最后一個值的辦_pgsql gro…

【FineDance】ModuleNotFoundError: No module named ‘pytorch3d‘

pytorch3d Traceback (most recent call last): File “/home/zhangbin/perfwork/01_ai/13_FineDance/data/code/pre_motion.py”, line 12, in from dataset.quaternion import ax_to_6v, ax_from_6v File “/home/zhangbin/perfwork/01_ai/13_FineDance/dataset/quaternion.…

MySQL 調優筆記

1.如何定位慢查詢? 定位慢查詢主要依靠 MySQL 的慢查詢日志配合工具如 pt-query-digest &#xff0c;mysqldumpslow 進行分析&#xff0c;或者通過 performance_schema 進行實時監控&#xff0c;進一步可以使用 EXPLAIN 分析執行計劃。 -> 開啟慢查詢日志 -- 查看慢查詢…

嵌入式 STM32 開發問題:燒錄 STM32CubeMX 創建的 Keil 程序沒有反應

燒錄 STM32CubeMX 創建的 Keil 程序沒有反應問題原因 大概率是因為沒有勾選 Reset and Run&#xff0c;程序成功燒錄到&#xff0c;但芯片不會自動復位并執行&#xff0c;而是保持停止狀態 處理策略 在 Keil 中勾選 Reset and Run 點擊 【Options for Target】 點擊 【Debu…

Flower框架中noise_multiplier與clipped_count_stddev的關系

noise_multiplier 與 clipped_count_stddev 的數學關系 在差分隱私聯邦學習中&#xff0c;noise_multiplier 和 clipped_count_stddev 是兩個核心參數&#xff0c;它們共同決定了隱私保護強度和模型精度的權衡。理解它們的關系需要從差分隱私的數學原理入手&#xff1a; 1. 高…

Laravel 從版本 5 到 12 每個版本都引入了一些新的特性、改進和棄用的功能

Laravel 從版本 5 到 12 經歷了多次更新,每個版本都引入了一些新的特性、改進和棄用的功能。下面是這些主要版本之間的關鍵區別: Laravel 5 Lumen: 引入了微框架 Lumen。Elixir: Elixir 是一個用于編譯和合并前端資源的工具,后來被 Laravel Mix 取代。Middleware Groups: 引…

Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程!

全文目錄&#xff1a; 開篇語Lambda 表達式的語法與使用&#xff1a;更簡潔、更靈活的函數式編程一、Lambda 表達式的語法1.1 Lambda 表達式的基本語法形式 二、Lambda 表達式的使用2.1 Lambda 表達式與匿名內部類的對比代碼示例&#xff1a;使用匿名內部類和 Lambda 表達式實現…

從0到1開發一個自己的工具 MCP 并發布到 test PyPi(Python個人版)

目錄 1. 我理解的 MCP2. 寫一個自己的MCP然后發布到 PyPi 上&#xff0c;包括加法工具和獲取當前 ip 工具2.1 先碎碎念一下 uv2.2 初始化項目&#xff08;全程在 cmd 下運行命令&#xff09;2.3 添加 mcp 依賴2.4 添加 server.py&#xff0c;先把加法功能添加上2.5 運行并測試加…

RabbitMQ緩存詳解:由來、發展、核心場景與實戰應用

一、RabbitMQ的由來與發展歷程 1.1 RabbitMQ的誕生背景 RabbitMQ誕生于金融行業的需求,最初由Rabbit Technologies Ltd開發,后被SpringSource收購,最終成為Pivotal的一部分。它的設計初衷是為了解決分布式系統中消息可靠傳輸的問題。在早期金融交易系統中,系統間的通信需…

機器學習與深度學習18-線性代數01

目錄 前文回顧1.特征向量和特征值2.矩陣與模型3.內積和外積4.向量的范數5.正交矩陣 前文回顧 上一篇文章地址&#xff1a;鏈接 1.特征向量和特征值 在機器學習中&#xff0c;特征向量和特征值是用于描述數據集中的特征或變量之間關系的重要概念。它們在降維技術&#xff08;…

如何讓 VS Code 僅通過滾輪放大字體,而不縮放整個界面?

在 VS Code 中&#xff0c;默認情況下使用 Ctrl滾輪&#xff08;Windows/Linux&#xff09;或 Cmd滾輪&#xff08;Mac&#xff09;會同時縮放整個界面&#xff08;包括 UI 元素和編輯器字體&#xff09;。如果你希望僅放大編輯器字體而不影響界面縮放&#xff0c;可以通過以下…

Vue3中v-bind指令用法詳解

在 Vue 3 中&#xff0c;v-bind 是一個核心指令&#xff0c;用于動態綁定 HTML 屬性或組件的 props 到 Vue 實例的數據。以下是詳細講解&#xff1a; 一、基礎用法 1. 綁定單個屬性 vue 復制 下載 <template><!-- 綁定 img 的 src 屬性 --><img v-bind:src…

算法題(169):最大子段和(分治思想)

審題&#xff1a; 本題需要我們找到區間的最大子段和并輸出結果 思路&#xff1a; 方法一&#xff1a;分治思想 我們可以把給定區間平均分成兩部分&#xff0c;然后獲取左段區間的最大子段和&#xff0c;右段區間的最大子段和&#xff0c;以及跨區間的最大子段和。最后比較出他…

Linux 線程深度解析:從內存管理到線程控制的核心機制

文章目錄 引言一、Linux 線程概念1.1 什么是線程1.2 分頁式存儲管理1.2.1 虛擬地址和頁表的由來1.2.2 物理內存管理struct page 的主要用途 1.2.3 頁表1.2.4 頁目錄結構1.2.5 兩級頁表的地址轉換1.2.6 缺頁異常 1.3 線程的優點1.4 線程缺點1.5 線程異常1.6 線程用途 二、Linux進…

玩轉計算機視覺——按照配置部署paddleOCR(英偉達環境與昇騰300IDUO環境)

英偉達環境安裝 創建虛擬環境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下載PaddleOCR的GPU…