娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年04月12日(星期六)

2019年04月12日 | STM32F103串口1和串口2不同波特率之間交換數(shù)據(jù)問題

發(fā)布者:腦力風潮 來源: eefocus關鍵字:STM32F103  串口  波特率  交換數(shù)據(jù) 手機看文章 掃描二維碼
隨時隨地手機看文章

前幾天寫一個東西,要用到STM32F103串口1和串口2以不同的波特率交換數(shù)據(jù),也就是說串口1波特率為9600,串口2波特率為115200,串口1可以把接收到的數(shù)據(jù)通過串口2發(fā)送出去,串口2也可以把接收到的數(shù)據(jù)通過串口1發(fā)送出去。低波特率向高波特率發(fā)送數(shù)據(jù)沒問題,高波特率向低波特率發(fā)送數(shù)據(jù)會丟數(shù)據(jù),原因是低波特率的串口還沒發(fā)送完數(shù)據(jù)高波特率的串口就又發(fā)數(shù)據(jù)過來了,處理不過來。在同事的在幫助下,寫出一個先進先出環(huán)形隊列(FIFO)程序。接收數(shù)據(jù)用中斷,發(fā)送數(shù)據(jù)用在主函數(shù)中查詢發(fā)送完成標志位。希望對大家有點幫助,可能程序不完美,但程序可以用。定義一個fifo.h部件和一個fifo.c文件。其他的都在主函數(shù)中調(diào)用。


#ifndef _FIFO_H_

#define _FIFO_H_


#include "stm32f10x.h"


#define FIFO_SIZE 256


typedef struct

{

    uint8_t Buf[FIFO_SIZE];    //定義緩沖區(qū),大小用FIFO_SIZE定義

    volatile uint32_t Read;    //定義讀取指針

    volatile uint32_t Write;   //定義寫入指針

}FIFOTypeDef;


extern FIFOTypeDef USART1_fifo;

extern FIFOTypeDef USART2_fifo;


void PutChar(uint8_t c);

uint8_t GetChar(uint8_t *c);

void PutChar1(uint8_t c);

uint8_t GetChar1(uint8_t *c);


#endif

#include "fifo.h"


FIFOTypeDef USART1_fifo;   //定義串口1的隊列fifo

FIFOTypeDef USART2_fifo;   //定義串口2的隊列fifo


/*******************************************************************************

* Function Name : PutChar

* Description   : put a fifo value into fifo buffer

* Input         : c

* Output        : None

* Return        : None

*******************************************************************************/

void PutChar(uint8_t c)

{

  USART1_fifo.Buf[USART1_fifo.Write] = c;  //寫入數(shù)據(jù)到緩沖區(qū)

  

  if(++USART1_fifo.Write >= FIFO_SIZE)    //寫入指針超出緩沖區(qū)最大值,返回最初位置

  {

    USART1_fifo.Write = 0;

  }

}


/*******************************************************************************

* Function Name  : GetChar

* Description    : read fifo value from fifo buffer with timeout feature

* Input          : c

* Output         : None

* Return         : 0 

*******************************************************************************/

uint8_t GetChar(uint8_t *c)

{


  if(USART1_fifo.Read == USART1_fifo.Write)   //如果沒有存入數(shù)據(jù),則返回0

  {

    return 0;

  }

  else

  {

    *c = USART1_fifo.Buf[USART1_fifo.Read]; //讀取數(shù)據(jù),傳入到指針c

    

    if (++USART1_fifo.Read >= FIFO_SIZE) //讀取指針超出緩沖區(qū)最大值,返回最初位置

    {

      USART1_fifo.Read = 0;

    }


    return 1; //成功讀取數(shù)據(jù)返回1

  }

}


/*******************************************************************************

* Function Name : PutChar

* Description   : put a fifo value into fifo buffer

* Input         : c

* Output        : None

* Return        : None

*******************************************************************************/

void PutChar1(uint8_t c)

{

  USART2_fifo.Buf[USART2_fifo.Write] = c;

  

  if(++USART2_fifo.Write >= FIFO_SIZE)

  {

    USART2_fifo.Write = 0;

  }

}


/*******************************************************************************

* Function Name  : GetChar

* Description    : read fifo value from fifo buffer with timeout feature

* Input          : c

* Output         : None

* Return         : 0 

*******************************************************************************/

uint8_t GetChar1(uint8_t *c)

{


if(USART2_fifo.Read == USART2_fifo.Write)

{

return 0;

}

else

  {

    *c = USART2_fifo.Buf[USART2_fifo.Read];

    

    if (++USART2_fifo.Read >= FIFO_SIZE)

    {

      USART2_fifo.Read = 0;

    }


    return 1;

  }

}




#include "stm32f10x.h"

#include "fifo.h"


/*******************************************************************************

* Function Name : UIF_Init 

* Description   : 初始化串口

* Input         : USARTx = USART1,2,3 

*               : BPS = 1200, 4800,,,

*               : STB = 1,5,2,15

* Return        : None 

*******************************************************************************/

void UIF_Init(USART_TypeDef* USARTx, uint32_t BPS, uint32_t STB)

{

  uint32_t Dly;

  USART_InitTypeDef USART_InitStruct; //定義串口結構體


NVIC_InitTypeDef NVIC_InitStructure; //定義中斷結構體


  

USART_ClearFlag(USARTx, USART_FLAG_TC);

USART_DeInit(USARTx);              //復位串口x


USART_InitStruct.USART_BaudRate = BPS;

USART_InitStruct.USART_WordLength = USART_WordLength_8b;  //8位字節(jié)長度數(shù)據(jù)

if(STB == 1)

USART_InitStruct.USART_StopBits = USART_StopBits_1;

else if(STB == 5)

USART_InitStruct.USART_StopBits = USART_StopBits_0_5;

else if(STB == 15)

USART_InitStruct.USART_StopBits = USART_StopBits_1_5;

else

USART_InitStruct.USART_StopBits = USART_StopBits_2;

USART_InitStruct.USART_Parity = USART_Parity_No;         //無奇偶檢驗位

USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制

USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收 發(fā)送模式

USART_Init(USARTx, &USART_InitStruct);   //初始化串口x



NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優(yōu)先級2級

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優(yōu)先級2級

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道

NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設NVIC寄存器


NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優(yōu)先級2級

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //從優(yōu)先級2級

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道

NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設NVIC寄存器

 

if(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==SET)

    USART_ClearFlag(USARTx, USART_FLAG_TC);

USART_Cmd(USARTx, ENABLE);          //使能串口x

for(Dly = 0; Dly < 0xFFFF; Dly++);

USART_ClearFlag(USARTx, USART_FLAG_TC); 


USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE);   //開啟接收中斷

 

}


/*******************************************************************************

* Function Name : GPIO_Config 

* Description   : 初始化IO

* Input         : None 

* Return        : None 

*******************************************************************************/

void GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStruct;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA

                       | RCC_APB2Periph_GPIOB

                       | RCC_APB2Periph_AFIO

                       | RCC_APB2Periph_USART1, ENABLE);

  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 


  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //USART1_TX Output 

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA, &GPIO_InitStruct);


  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //USART1_RX Input  

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStruct);

  

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //USART2_TX Output   

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA, &GPIO_InitStruct);


  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //USART2_RX Input    

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStruct);

   

}

/*******************************************************************************

* Function Name : NVIC_Configuration 

* Description   : 設置NVIC中斷分組

* Input         : None 

* Return        : None 

*******************************************************************************/

void NVIC_Configuration(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級

}

/*******************************************************************************

* Function Name : USART_SendByte 

* Description   : 發(fā)送一個字節(jié)

* Input         : USARTx = USART1,2,3 

    Data = 要發(fā)送的數(shù)據(jù)

* Return        : None 

*******************************************************************************/

void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)

{

USARTx->DR = (Data & (uint16_t)0x01FF);;

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) != SET);

}

/*******************************************************************************

* Function Name : main 

* Description   : 主函數(shù)

* Input         : None

* Return        : None 

*******************************************************************************/

int main(void)

{

uint8_t byte;

GPIO_Config();

NVIC_Configuration();

UIF_Init(USART1,115200,1); //串口1波特率115200,1位停止位

UIF_Init(USART2,9600,1); //串口2波特主9600,1位停止位 //使能串口

while(1)

{

 

if(USART1_fifo.Write != USART1_fifo.Read) //如果讀取指針不等于寫入指針,說明緩沖區(qū)有數(shù)據(jù)

{

if(GetChar(&byte)) //如果讀取數(shù)據(jù)成功,返回1

{

USART_SendByte(USART2,byte); //把串口1的緩沖區(qū)數(shù)據(jù)通過串口2發(fā)送出去

}

}

if(USART2_fifo.Read!=USART2_fifo.Write)  //如果讀取指針不等于寫入指針,說明緩沖區(qū)有數(shù)據(jù)

{

if(GetChar1(&byte))   //如果讀取數(shù)據(jù)成功,返回1

{

    USART_SendByte(USART1,byte); //把串口2的緩沖區(qū)數(shù)據(jù)通過串口1發(fā)送出去

    }

}

}


/*******************************************************************************

* Function Name : USART1_IRQHandler 

* Description   : 串口1中斷服務程序

* Input         : None

* Return        : None 

*******************************************************************************/

void USART1_IRQHandler(void)

{

u8 res; 

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //如果接收到數(shù)據(jù)

{

USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清空接收標志

res = USART_ReceiveData(USART1);

PutChar(res);   //壓入數(shù)據(jù)到串口1緩沖區(qū)

}


//溢出,如果發(fā)生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題

if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)

{

USART_ClearFlag(USART1,USART_FLAG_ORE); //讀SR其實就是清除標志

USART_ReceiveData(USART1);    //讀DR

}

}

/*******************************************************************************

* Function Name : USART2_IRQHandler 

* Description   : 串口2中斷服務程序

* Input         : None

* Return        : None 

*******************************************************************************/

void USART2_IRQHandler(void)        

{

u8 Res;


if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中斷

{

USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清空接收標志

Res =USART_ReceiveData(USART2);//(USART2->DR); //讀取接收到的數(shù)據(jù)

PutChar1(Res);      //壓入數(shù)據(jù)到串口2緩沖區(qū)

    }


//溢出,如果發(fā)生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題

if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)

{

USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR其實就是清除標志

USART_ReceiveData(USART2);    //讀DR

}

關鍵字:STM32F103  串口  波特率  交換數(shù)據(jù) 引用地址:STM32F103串口1和串口2不同波特率之間交換數(shù)據(jù)問題

上一篇:STM32 串口詳細講解
下一篇:STM32F103 SPI3總結

推薦閱讀

  誰是世界上最有價值的AI創(chuàng)業(yè)公司?你可能會說是DeepMind,畢竟它開發(fā)的AI技術打敗了世界圍棋高手。不是的,就眼下來說,世界上最有價值的AI公司來自中國,它叫作SenseTime(商湯科技)。下面就隨網(wǎng)絡通信小編一起來了解一下相關內(nèi)容吧。  本周一,SenseTime完成新一輪融資,獲投6億美元。照計算,SenseTime的估值已經(jīng)超過30億美元。也就是說它成為世界...
1. 關于HSE的時鐘配置為主時鐘static void CLK_Config(void){ CLK_DeInit(); // 初始化 CLK_HSECmd(ENABLE); //使能HSE CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); //切換HSE 并關閉其他時鐘 為自動模式 /*Ena...
工業(yè)機器人的發(fā)展公元前3世紀已經(jīng)開始,時至今日,機器人深入到不同的行業(yè)、不同的領域,也開始有機器人或者是并聯(lián)機器人等細分,而近幾年協(xié)作機器人也開始逐漸發(fā)展。 觀察機器人發(fā)展的幾個階段,可以看到機器人的需求在不斷變化。 在機器人發(fā)展的開始階段,工業(yè)機器人可能是自動化改造所需要的一個產(chǎn)品,所以它的結構上甚至沒有做到全球產(chǎn)品化統(tǒng)一的標...
作者:安富利資深解決方案業(yè)務經(jīng)理劉帛松摘要自2015年至今,經(jīng)過為期5年的快速發(fā)展,LPWAN如今正面臨轉(zhuǎn)折,其原有的驅(qū)動優(yōu)勢已然不再。接下來必須將注意力集中在LPWAN應用上,才能在下個階段的發(fā)展中奪得先機。但是,要突破LPWAN發(fā)展瓶頸,既需要創(chuàng)新的應用開發(fā)平臺,也需要端到端的解決方案和服務,才能讓各家企業(yè)盡快從LPWAN的技術與應用中獲利。而全球...

史海拾趣

問答坊 | AI 解惑

窗口名稱的問題

通過FINDWINDOWS找到運行的B程序,B為B.EXE,運行B之后,我用SPY查看窗口的時候,卻是標題為"??"號和類為"static"的 窗口,為什么呢,我需要在B程序里面設置窗口名嗎,如果設置應該怎樣設置呢. 我的B程序里面有CBDlg.cpp而且有對應的類為什么不 ...…

查看全部問答∨

100分鼓勵:WINCE串口發(fā)送數(shù)據(jù)總是亂碼?(在線等待)

我用EVC寫了個串口程序,與PC進行串口數(shù)據(jù)收發(fā),為什么總是兩邊收到的都是亂碼? 注:程序里我用char進行數(shù)據(jù)發(fā)送,改為tchar也一樣。 請高手幫忙啊,在線等待。。。…

查看全部問答∨

外網(wǎng)PING不通

最近幾天很郁悶,IP網(wǎng)站顯示的我機器的IP是222.176.226.*,可我自己PING不通自己外網(wǎng)的IP。我只能PING服務商的內(nèi)網(wǎng)IP(10.0.51.2)和我自己局域網(wǎng)的IP(192.168.0.*)。但前幾天的外網(wǎng)IP,有時還是可以PING的,這幾天的IP怎么試都不行。 怎么回事 ...…

查看全部問答∨

AVR如何做如下延時功能?

對于AVR單片機,一個管腳輸入隨機脈沖A,另一個管腳輸入隨機脈沖B,要求每個A在脈沖B達到5000個時候輸出,也就是把脈沖信號A延時5000個信號B。請教A和B各應該使用那個管腳,輸出又應該使用那個管腳?謝謝!…

查看全部問答∨

差分信號如何處理得到有用的正信號電路如何設計

各位高手差分信號如何處理得到有用的正信號電路如何設計…

查看全部問答∨

對LC測量小工具的疑問????

 前些日子出差辦事,為了生活四處奔波哈,回來我看了LC小工具,我也搭了個,頻率順利測出,也用了整理的程序,但我的電容值顯示不了,對電容的計算,我的問題是要那個F2,做什么呢?我只測電容只要F1和F3不就行了    &nbs ...…

查看全部問答∨

STM32103VCT6 USART3 重映射 PD8 PD9 不成功

STM32103VCT6  USART3 重映射 PD8 PD9 不成功         GPIO_InitTypeDef GPIO_InitStructure;         USART_InitTypeDef USART_InitStructure;      &n ...…

查看全部問答∨

中國MCU市場廠商排名2012

2012 年供應商排名  1、Renesas Electronics  2、Freescale Semiconductor  3、Microchip Technology  4、STMicroelectronics  5、Atmel  6、Infineon Technologies  7、NXP  8、Texas Instruments  9、Toshiba  10、Samsung…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 阳城县| 金湖县| 卢氏县| 长汀县| 桂林市| 青海省| 珲春市| 重庆市| 正镶白旗| 思茅市| 抚松县| 饶平县| 连江县| 文昌市| 聂拉木县| 松原市| 常熟市| 新密市| 大埔县| 赤水市| 嘉峪关市| 静宁县| 凤山市| 河北区| 吕梁市| 米林县| 德令哈市| 禹州市| 永城市| 宜城市| 湛江市| 西林县| 吉首市| 随州市| 怀来县| 涞源县| 宝鸡市| 安顺市| 南丰县| 辽源市| 宁阳县|