色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

STM32模擬串口(UART)使用

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

1、添加頭文件

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

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

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

2、宏定義

使用到的io口為

#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

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

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

在本次的傳輸過(guò)程中我選用的是使用波特率速率為9600,也就是1s中發(fā)送9600個(gè)字節(jié),因此對(duì)每個(gè)字節(jié)數(shù)據(jù)進(jìn)行計(jì)算1000000us/9600可以得出,發(fā)一個(gè)字節(jié)的數(shù)據(jù)需要進(jìn)行大概需要 104.16us并且對(duì)于相應(yīng)的電平持續(xù)時(shí)間要求誤差不能超過(guò)±5%因此對(duì)我們進(jìn)行時(shí)間的控制要求就顯得比較重要了。

3、枚舉出各個(gè)位

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進(jìn)行模擬

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ā)送的信號(hào)是將TXD信號(hào)進(jìn)行拉低處理,因此在拉低TXD相應(yīng)的IO口之后進(jìn)行延時(shí)處理,再進(jìn)行循環(huán)對(duì)我們需要發(fā)送的各個(gè)位的數(shù)據(jù)繼續(xù)進(jìn)行發(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ù)長(zhǎng)度,進(jìn)行循環(huán)調(diào)用IO_TXD進(jìn)行一個(gè)字節(jié)一個(gè)字節(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端口時(shí)鐘

//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默認(rèn)電平拉高

//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);//對(duì)D7的下降沿進(jìn)行中斷采樣,當(dāng)接收到下降沿時(shí)代表接收到數(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、定時(shí)器初始化

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

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

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

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

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

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

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

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

整體代碼

vuart2.c

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


#defineOI2_TXDPDout(6)
#defineOI2_RXDPDin(7)

#defineBuadRate2_9600104
#defineRecive2_Byte19//接收緩沖器的個(gè)數(shù)
u8len2=0;//接收計(jì)數(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6061

    文章

    44854

    瀏覽量

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

    關(guān)注

    18

    文章

    6158

    瀏覽量

    137290
  • STM32
    +關(guān)注

    關(guān)注

    2288

    文章

    10996

    瀏覽量

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

    關(guān)注

    14

    文章

    1581

    瀏覽量

    78488
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1254

    瀏覽量

    103087

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

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

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    IO模擬串口UART

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

    niosii的UART串口通信

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

    uart是什么意思?認(rèn)識(shí)uart串口

    設(shè)備沒(méi)有顯示屏,無(wú)法獲得嵌入式設(shè)備實(shí)時(shí)數(shù)據(jù)信息,通過(guò)UART串口和超級(jí)終端相連,打印嵌入式設(shè)備輸出信息。并且在對(duì)嵌入式系統(tǒng)進(jìn)行跟蹤和調(diào)試時(shí),UART串口了是必要的通信手段。比如:網(wǎng)絡(luò)路
    發(fā)表于 12-06 14:51 ?11.1w次閱讀
    <b class='flag-5'>uart</b>是什么意思?認(rèn)識(shí)<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.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庫(kù)史上最詳細(xì)教程(一):UART串口收發(fā)

    博主能力有限,有錯(cuò)誤望大佬指出  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庫(kù)史上最詳細(xì)教程(一):<b class='flag-5'>UART</b><b class='flag-5'>串口</b>收發(fā)

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

    文章目錄通訊的基本概念串口通訊協(xié)議簡(jiǎn)介物理層RS-232標(biāo)準(zhǔn)USB轉(zhuǎn)串口原生的串口串口TTL和232的區(qū)別協(xié)議層STM32—USART /
    發(fā)表于 11-26 11:51 ?16次下載
    【<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 ?56次下載
    <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軟件模擬串口的實(shí)現(xiàn)-基于CrubeMX

    STM32軟件模擬串口的實(shí)現(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>的實(shí)現(xiàn)-基于CrubeMX

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

    F429開(kāi)發(fā)板來(lái)舉例講解(其他STM32系列芯片大多數(shù)都可以按照這些步驟來(lái)操作的),如有不足請(qǐng)多多指教。2、UART簡(jiǎn)介  嵌入式開(kāi)發(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模擬串口,實(shí)現(xiàn)全雙工通訊功能。硬件資源:1.2個(gè)IO口2.1個(gè)外部中斷3.1個(gè)定時(shí)器
    發(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個(gè)串口功能,其中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庫(kù) UART 串口讀寫(xiě)功能筆記

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

    單片機(jī)IO口模擬UART串口通信

    為了讓大家充分理解 UART 串口通信的原理,我們先把 P3.0 和 P3.1 當(dāng)做 IO 口來(lái)進(jìn)行模擬實(shí)際串口通信的過(guò)程,原理搞懂后,我們?cè)偈褂眉拇嫫髋渲脤?shí)現(xiàn)
    發(fā)表于 02-09 10:25 ?25次下載
    單片機(jī)IO口<b class='flag-5'>模擬</b><b class='flag-5'>UART</b><b class='flag-5'>串口</b>通信

    AN4457_基于STM32F4xx系列單片機(jī)軟件模擬UART的設(shè)計(jì)實(shí)現(xiàn)

    AN4457_基于STM32F4xx系列單片機(jī)軟件模擬UART的設(shè)計(jì)實(shí)現(xiàn)
    發(fā)表于 11-21 08:11 ?0次下載
    AN4457_基于<b class='flag-5'>STM32</b>F4xx系列單片機(jī)軟件<b class='flag-5'>模擬</b><b class='flag-5'>UART</b>的設(shè)計(jì)實(shí)現(xiàn)
    主站蜘蛛池模板: 成人精品视频网站 | 欧美片第1页 综合 | 亚洲精品无码成人AAA片 | 亚洲区欧美日韩综合 | 囯产精品一品二区三区 | 亚洲中文字幕在线第六区 | 羲义嫁密着中出交尾gvg794 | 色欲AV精品人妻一区二区麻豆 | 最近2019中文字幕免费 | 暖暖直播免费观看韩国 | 亚洲香蕉网久久综合影院 | 草莓湿漉漉是好事还是恶性 | 一二三四免费中文在线1 | 琪琪电影午夜理论片YY6080 | 亚洲欧洲日本天天堂在线观看 | 999在线观看精品免费 | 久久精品热播在线看 | 曰韩一本道高清无码av | 日日摸天天添天天添无码蜜臀 | 久久99这里只有精品 | 亚洲AV无码专区国产乱码网站 | 久久国产欧美 | 影音先锋亚洲AV少妇熟女 | 国产人妻精品久久久久久很牛 | 成人毛片大全 | 王小军怎么了最新消息 | 视频一区亚洲视频无码 | 好想被狂躁A片免费久99 | 午夜福利电影 | 男人桶女人j的视频在线观看 | 四虎亚洲中文字幕永久在线 | 9420高清免费观看在线大全 | 久久综合伊人 | 用快播看黄的网站 | 99热在线观看 | 午夜精品久久久久久99热蜜桃 | 蜜桃传媒在线观看入口 | 性虎成人网 | 国产伦精品一区二区三区免费观看 | 亚洲色欲色欲无码AV | 色偷偷男人天堂 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品