在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32模擬串口(UART)使用

硬件攻城獅 ? 來源:CSDN-噗尼果 ? 2023-03-22 15:56 ? 次閱讀

1、添加頭文件

首先我們先添加相應的頭文件。既然我們要進行對串口的模擬,因此我們要先了解uart相關的通信協議。由于UART的通信方式是由1個起始位,8個數據位,包含一個奇偶校驗位,和結束位構成因此我們將使用單片機中的兩個普通的IO口電平的高低進行對相應時序的模擬。

d63a3398-c884-11ed-bfe3-dac502259ad0.png

#include"stm32f10x.h"
#include"vuart2.h"

2、宏定義

使用到的io口為

#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

#defineBuadRate2_9600104
#defineRecive2_Byte19//接收緩沖器的個數
u8len2=0;//接收計數
u8USART2_buf[Recive2_Byte];//接收緩沖區

將IO口相應的位帶操作函數進行宏定義從而使得在對不同的電平的進行轉換的時候更為方便,并且減少了調用其他函數的過程所消耗的時間,程序執行效率更高。

在本次的傳輸過程中我選用的是使用波特率速率為9600,也就是1s中發送9600個字節,因此對每個字節數據進行計算1000000us/9600可以得出,發一個字節的數據需要進行大概需要 104.16us并且對于相應的電平持續時間要求誤差不能超過±5%因此對我們進行時間的控制要求就顯得比較重要了。

3、枚舉出各個位

enum{
COM_START_BIT,
COM_D0_BIT,
COM_D1_BIT,
COM_D2_BIT,
COM_D3_BIT,
COM_D4_BIT,
COM_D5_BIT,
COM_D6_BIT,
COM_D7_BIT,
COM_STOP_BIT,
};

u8recvStat2=COM_STOP_BIT;
u8recvData2=0;

4、IO——TXD進行模擬

voidIO2_TXD(u8Data)
{
u8i=0;
OI2_TXD=0;
delay_us(BuadRate2_9600);
for(i=0;i>1;
}
OI2_TXD=1;
delay_us(BuadRate2_9600);
}

由于發送的信號是將TXD信號進行拉低處理,因此在拉低TXD相應的IO口之后進行延時處理,再進行循環對我們需要發送的各個位的數據繼續進行發送循環發送完成之后將電平拉高代表停止位。

5、構建發送函數

voidUSART2_Send(u8*buf,u8len2)
{
u8t;
for(t=0;t

其中的*buf為需要發送的數據,len2為數據長度,進行循環調用IO_TXD進行一個字節一個字節的數據發送。

6、IO口初始化

voidIO2Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//初始化gpio
NVIC_InitTypeDefNVIC_InitStructure;//中斷初始化函數
EXTI_InitTypeDefEXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);//使能PD,PC端口時鐘

//SoftWareSerialTXD
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//選擇io口6
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度為50MHz
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_6);//TXD默認電平拉高

//SoftWareSerialRXD
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource7);//對D7的下降沿進行中斷采樣,當接收到下降沿時代表接收到數據觸發中斷處理函數
EXTI_InitStruct.EXTI_Line=EXTI_Line7;//用到了中斷7
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿觸發中斷
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);//初始化中斷


NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//中斷發生于9-5的中斷之中
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

7、定時器初始化

voidTIM5_Int_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//時鐘使能

//定時器TIM5初始化
TIM_TimeBaseStructure.TIM_Period=arr;//設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//設置用來作為TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割:TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計數模式
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//根據指定的參數初始化TIMx的時間基數單位
TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//使能指定的TIM5中斷,允許更新中斷

//中斷優先級NVIC設置
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//TIM5中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占優先級1級
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//從優先級1級
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//初始化NVIC寄存器
}

對TIM5進行初始化操作使得定時器可以檢測到各個位的電平持續性時間從而對接收到的數據進行分析。計時結束后進入中斷TIM5處理。

8、外部中斷處理函數

voidEXTI9_5_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line7)!=RESET)//對中斷標志位進行采集
{
if(OI2_RXD==0)
{
if(recvStat2==COM_STOP_BIT)
{
recvStat2=COM_START_BIT;//將當前的狀態設置為開始位
TIM_Cmd(TIM5,ENABLE);//開啟定時器計數
}
}
EXTI_ClearITPendingBit(EXTI_Line7);//清除中斷標志
}
}

9、定時器中斷處理函數

voidTIM5_IRQHandler(void)
{
if(TIM_GetFlagStatus(TIM5,TIM_FLAG_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update);//清除中斷標志位
recvStat2++;//將位置移動到第一位的數據
if(recvStat2==COM_STOP_BIT)//當運行到停止位時進入
{
TIM_Cmd(TIM5,DISABLE);//停止tim5
USART2_buf[len2++]=recvData2;//將采集到的各個數據傳遞給USART2_buf
if(len2>Recive2_Byte-1)//將數據通過回顯到串口調試助手中
{
len2=0;
USART2_Send(USART2_buf,Recive2_Byte);
}
return;
}
if(OI2_RXD)//采集RXD各個電平
{
recvData2|=(1<

整體代碼

vuart2.c

#include"stm32f10x.h"
#include"vuart2.h"
/**
*軟件串口的實現(IO模擬串口)
*波特率:9600 1-8-N
*TXD:PD6
*RXD:PD7
*使用外部中斷對RXD的下降沿進行觸發,使用定時器5按照9600波特率進行定時數據接收。
*Demo功能:接收11個數據,然后把接收到的數據發送出去
*/


#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

#defineBuadRate2_9600104
#defineRecive2_Byte19//接收緩沖器的個數
u8len2=0;//接收計數
u8USART2_buf[Recive2_Byte];//接收緩沖區

enum{
COM_START_BIT,
COM_D0_BIT,
COM_D1_BIT,
COM_D2_BIT,
COM_D3_BIT,
COM_D4_BIT,
COM_D5_BIT,
COM_D6_BIT,
COM_D7_BIT,
COM_STOP_BIT,
};

u8recvStat2=COM_STOP_BIT;
u8recvData2=0;

voidIO2_TXD(u8Data)
{
u8i=0;
OI2_TXD=0;
delay_us(BuadRate2_9600);
for(i=0;i>1;
}
OI2_TXD=1;
delay_us(BuadRate2_9600);
}

voidUSART2_Send(u8*buf,u8len2)
{
u8t;
for(t=0;tRecive2_Byte-1)
{
len2=0;
USART2_Send(USART2_buf,Recive2_Byte);
}
return;
}
if(OI2_RXD)
{
recvData2|=(1<

vuart2.h

#ifndef__VUART2__H
#define__VUART2__H
#include"stm32f10x.h"

voidIO2_TXD(u8Data);
voidUSART2_Send(u8*buf,u8len);
voidIO2Config(void);
voidTIM5_Int_Init(u16arr,u16psc);
#endif

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6063

    文章

    44925

    瀏覽量

    647079
  • 通信
    +關注

    關注

    18

    文章

    6177

    瀏覽量

    137381
  • STM32
    +關注

    關注

    2290

    文章

    11017

    瀏覽量

    362450
  • 串口
    +關注

    關注

    14

    文章

    1586

    瀏覽量

    78685
  • uart
    +關注

    關注

    22

    文章

    1268

    瀏覽量

    103292

原文標題:STM32 模擬串口(UART)使用!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32外部中斷模擬UART串口,不看肯定后悔

    STM32外部中斷模擬UART串口,不看肯定后悔
    發表于 11-17 07:47

    IO模擬串口UART

    IO模擬串口UART 本文介紹GPIO模擬UART的算法和實現
    發表于 04-03 14:11 ?86次下載

    niosii的UART串口通信

    niosii的UART串口通信niosii的UART串口通信。
    發表于 04-06 17:03 ?1次下載

    uart是什么意思?認識uart串口

    設備沒有顯示屏,無法獲得嵌入式設備實時數據信息,通過UART串口和超級終端相連,打印嵌入式設備輸出信息。并且在對嵌入式系統進行跟蹤和調試時,UART串口了是必要的通信手段。比如:網絡路
    發表于 12-06 14:51 ?11.1w次閱讀
    <b class='flag-5'>uart</b>是什么意思?認識<b class='flag-5'>uart</b><b class='flag-5'>串口</b>

    串口通信的原理,IO口模擬UART串口通信

    UART串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等速率。IO口模擬UART
    的頭像 發表于 05-04 15:26 ?2.3w次閱讀
    <b class='flag-5'>串口</b>通信的原理,IO口<b class='flag-5'>模擬</b><b class='flag-5'>UART</b><b class='flag-5'>串口</b>通信

    【CubeIDE】STM32 HAL庫史上最詳細教程(一):UART串口收發

    博主能力有限,有錯誤望大佬指出  0x00 文章內容:UART阻塞方式收發UART中斷方式收發UART中斷回調函數UART DMA方式收發printf()函數
    發表于 11-23 17:51 ?12次下載
    【CubeIDE】<b class='flag-5'>STM32</b> HAL庫史上最詳細教程(一):<b class='flag-5'>UART</b><b class='flag-5'>串口</b>收發

    STM32學習筆記】串口通訊 — USART / UART

    文章目錄通訊的基本概念串口通訊協議簡介物理層RS-232標準USB轉串口原生的串口串口TTL和232的區別協議層STM32—USART /
    發表于 11-26 11:51 ?16次下載
    【<b class='flag-5'>STM32</b>學習筆記】<b class='flag-5'>串口</b>通訊 — USART / <b class='flag-5'>UART</b>

    STM32F407的串口UART 基礎配置STM32CubeMX

    STM32F407的串口UART 基礎配置STM32CubeMX
    發表于 11-29 16:06 ?56次下載
    <b class='flag-5'>STM32</b>F407的<b class='flag-5'>串口</b><b class='flag-5'>UART</b> 基礎配置<b class='flag-5'>STM32</b>CubeMX

    STM32軟件模擬串口的實現-基于CrubeMX

    STM32軟件模擬串口的實現-基于CrubeMX
    發表于 11-30 10:36 ?10次下載
    <b class='flag-5'>STM32</b>軟件<b class='flag-5'>模擬</b><b class='flag-5'>串口</b>的實現-基于CrubeMX

    基于STM32UART串口通信協議(一)詳解

    F429開發板來舉例講解(其他STM32系列芯片大多數都可以按照這些步驟來操作的),如有不足請多多指教。2、UART簡介  嵌入式開發中,UART串口通信協議是我們常用的通信協議(
    發表于 11-30 14:36 ?22次下載
    基于<b class='flag-5'>STM32</b>之<b class='flag-5'>UART</b><b class='flag-5'>串口</b>通信協議(一)詳解

    stm32使用IO模擬串口

    STM32使用IO口模擬串口期望效果:使用普通IO模擬串口,實現全雙工通訊功能。硬件資源:1.2個IO口2.1個外部中斷3.1個定時器
    發表于 12-04 20:21 ?20次下載
    <b class='flag-5'>stm32</b>使用IO<b class='flag-5'>模擬</b><b class='flag-5'>串口</b>

    STM32F103VE USART & UART串口通信

    STM32F103VE共有5個串口功能,其中USART1,USART2,USART3為通用同步異步串口通信,UART4,UART5為通用異步
    發表于 12-24 19:06 ?24次下載
    <b class='flag-5'>STM32</b>F103VE USART & <b class='flag-5'>UART</b><b class='flag-5'>串口</b>通信

    STM32 HAL庫 UART 串口讀寫功能筆記

    STM32L0 HAL庫 UART 串口讀寫功能串口發送功能:uint8_t TxData[10]= “01234abcde”;HAL_UART
    發表于 12-27 19:11 ?13次下載
    <b class='flag-5'>STM32</b> HAL庫 <b class='flag-5'>UART</b> <b class='flag-5'>串口</b>讀寫功能筆記

    單片機IO口模擬UART串口通信

    為了讓大家充分理解 UART 串口通信的原理,我們先把 P3.0 和 P3.1 當做 IO 口來進行模擬實際串口通信的過程,原理搞懂后,我們再使用寄存器配置實現
    發表于 02-09 10:25 ?25次下載
    單片機IO口<b class='flag-5'>模擬</b><b class='flag-5'>UART</b><b class='flag-5'>串口</b>通信

    AN4457_基于STM32F4xx系列單片機軟件模擬UART的設計實現

    AN4457_基于STM32F4xx系列單片機軟件模擬UART的設計實現
    發表于 11-21 08:11 ?0次下載
    AN4457_基于<b class='flag-5'>STM32</b>F4xx系列單片機軟件<b class='flag-5'>模擬</b><b class='flag-5'>UART</b>的設計實現
    主站蜘蛛池模板: 毛片三级在线观看 | ts人妖在线 | 国产亚洲人成网站天堂岛 | 韩国电影天堂网 | 韩国床戏合集三小时hd中字 | 免费一级片在线观看 | 激情综合色综合久久综合 | 亚洲天堂社区 | 六九视频在线观看 | 日本一本视频 | 777人体粉嫩u美图 | 欧美黑人换爱交换乱理伦片 | 亚洲精品美女在线观看 | 69pao强力打造免费高清 | 国产日韩三级 | 欧美aaaaa性bbbbb小妇 | 中文字幕在线观看一区二区 | 免费国产高清精品一区在线 | 天天在线天天综合网色 | 午夜影院黄 | 全黄毛片 | 你懂的在线视频网站 | 欧美黄色免费网址 | 四月激情网 | 理论片毛片 | 深爱激情站| 天天干夜夜爽天天操夜夜爽视频 | 天天爱天天干天天 | 天天干夜夜艹 | 亚洲人成一区 | 色吊丝中文字幕 | 午夜官网| 男女透逼视频 | 国产va在线播放 | 欧美色爱综合网 | 色网站免费 | 天天干天天日天天射天天操毛片 | 欧美zooz人禽交免费 | 在线免费午夜视频 | 免费看欧美一级特黄a大片 免费看欧美一级特黄a大片一 | 欧美射射射 |