RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

STM32模擬串口(UART)使用

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

1、添加頭文件

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

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

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

2、宏定義

使用到的io口為

#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

#defineBuadRate2_9600104
#defineRecive2_Byte19//接收緩沖器的個數(shù)
u8len2=0;//接收計數(shù)
u8USART2_buf[Recive2_Byte];//接收緩沖區(qū)

將IO口相應(yīng)的位帶操作函數(shù)進行宏定義從而使得在對不同的電平的進行轉(zhuǎn)換的時候更為方便,并且減少了調(diào)用其他函數(shù)的過程所消耗的時間,程序執(zhí)行效率更高。

在本次的傳輸過程中我選用的是使用波特率速率為9600,也就是1s中發(fā)送9600個字節(jié),因此對每個字節(jié)數(shù)據(jù)進行計算1000000us/9600可以得出,發(fā)一個字節(jié)的數(shù)據(jù)需要進行大概需要 104.16us并且對于相應(yīng)的電平持續(xù)時間要求誤差不能超過±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);
}

由于發(fā)送的信號是將TXD信號進行拉低處理,因此在拉低TXD相應(yīng)的IO口之后進行延時處理,再進行循環(huán)對我們需要發(fā)送的各個位的數(shù)據(jù)繼續(xù)進行發(fā)送循環(huán)發(fā)送完成之后將電平拉高代表停止位。

5、構(gòu)建發(fā)送函數(shù)

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

其中的*buf為需要發(fā)送的數(shù)據(jù),len2為數(shù)據(jù)長度,進行循環(huán)調(diào)用IO_TXD進行一個字節(jié)一個字節(jié)的數(shù)據(jù)發(fā)送。

6、IO口初始化

voidIO2Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//初始化gpio
NVIC_InitTypeDefNVIC_InitStructure;//中斷初始化函數(shù)
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的下降沿進行中斷采樣,當(dāng)接收到下降沿時代表接收到數(shù)據(jù)觸發(fā)中斷處理函數(shù)
EXTI_InitStruct.EXTI_Line=EXTI_Line7;//用到了中斷7
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿觸發(fā)中斷
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);//初始化中斷


NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//中斷發(fā)生于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;//設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設(shè)置時鐘分割:TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//使能指定的TIM5中斷,允許更新中斷

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

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

8、外部中斷處理函數(shù)

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

9、定時器中斷處理函數(shù)

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

整體代碼

vuart2.c

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


#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

#defineBuadRate2_9600104
#defineRecive2_Byte19//接收緩沖器的個數(shù)
u8len2=0;//接收計數(shù)
u8USART2_buf[Recive2_Byte];//接收緩沖區(qū)

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

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

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634614
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6024

    瀏覽量

    135949
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

    355721
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1551

    瀏覽量

    76421
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1235

    瀏覽量

    101352

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    IO模擬串口UART

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

    niosii的UART串口通信

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

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

    設(shè)備沒有顯示屏,無法獲得嵌入式設(shè)備實時數(shù)據(jù)信息,通過UART串口和超級終端相連,打印嵌入式設(shè)備輸出信息。并且在對嵌入式系統(tǒng)進行跟蹤和調(diào)試時,UART串口了是必要的通信手段。比如:網(wǎng)絡(luò)路
    發(fā)表于 12-06 14:51 ?11w次閱讀
    <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
    的頭像 發(fā)表于 05-04 15:26 ?2.2w次閱讀
    <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串口收發(fā)

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

    STM32學(xué)習(xí)筆記】串口通訊 — USART / UART

    文章目錄通訊的基本概念串口通訊協(xié)議簡介物理層RS-232標準USB轉(zhuǎn)串口原生的串口串口TTL和232的區(qū)別協(xié)議層STM32—USART /
    發(fā)表于 11-26 11:51 ?15次下載
    【<b class='flag-5'>STM32</b>學(xué)習(xí)筆記】<b class='flag-5'>串口</b>通訊 — USART / <b class='flag-5'>UART</b>

    STM32F407的串口UART 基礎(chǔ)配置STM32CubeMX

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

    STM32軟件模擬串口的實現(xiàn)-基于CrubeMX

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

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

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

    stm32使用IO模擬串口

    STM32使用IO口模擬串口期望效果:使用普通IO模擬串口,實現(xiàn)全雙工通訊功能。硬件資源:1.2個IO口2.1個外部中斷3.1個定時器
    發(fā)表于 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為通用異步
    發(fā)表于 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 串口讀寫功能串口發(fā)送功能:uint8_t TxData[10]= “01234abcde”;HAL_UART
    發(fā)表于 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 當(dāng)做 IO 口來進行模擬實際串口通信的過程,原理搞懂后,我們再使用寄存器配置實現(xiàn)
    發(fā)表于 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的設(shè)計實現(xiàn)

    AN4457_基于STM32F4xx系列單片機軟件模擬UART的設(shè)計實現(xiàn)
    發(fā)表于 11-21 08:11 ?0次下載
    AN4457_基于<b class='flag-5'>STM32</b>F4xx系列單片機軟件<b class='flag-5'>模擬</b><b class='flag-5'>UART</b>的設(shè)計實現(xiàn)
    RM新时代网站-首页