USART串口总结2

2023-05-16

前言:开始学USART+DMA的时候看到帖子《STM32 UART DMA实现未知数据长度接收》,觉得方法妙极了。此下出自此帖子——(整体的思路是这样的,一开始设置好DMA接收,可以把缓冲区长度设置为帧最大长度,我们可以把RX连接到定时器的管脚输入端,并且一开始设置输入并且使能引脚下降沿中断,当帧的第一个字节发送时,因为起始位为低电平,空闲时UART为高电平,满足条件,进入中断,禁止中断,并且在中断中开启定时器,该定时器工作在复位模式,上升沿复位,并且设置好定时器输出比较值为超时时间,比如20ms,这样,在传输后面字节时,肯定会有高低电平出现,即便是传输的是0x000xFF,虽然UART数据区不变,但是都为1,或都为0,但是因为起始位为低电平,停止位是高电平,所以肯定会有上升沿,定时器会一直复位,输出定时器的计数器一直到达不了输出比较值,当一帧传输结束后,定时在最后一个字节复位后,由于没有数据继续到达,无法复位,则计数器就能计到输出比较值,这时发出中断,在定时器中断中可以计算出接收数据的长度,并且通知外部数据已经接收完毕。

今天我在工作中调通了另一种USART+DMA接收未知数据长度的接收,使用的是USRAT空闲总线中断接收,这种方法也在网站上比较多见,以前没试过,今天才知道如此的爽,另外我使用DMA发送USART数据替代了以前的查询法发送,发现更加爽了。其速度快了很多,尤其是在大量数据传输与发送的时候其优势更加明显。

我举个例子:1、后台数据->USART1-> USART2->其它设备,其它设备数据->USART2-> USART21->后台,这两个数据过程也可能同时进行。

2、由于硬件的限制,USART1USART2的传输波特率不一样,比如USART1使用GPRS通信,USART2使用短距离无线通信;或者USART1使用以太网通信,USART2使用485总线通信。

由于在寝室只有笔记本电脑,只有一个串口转USB,没办法实现两个串口之间的数据转发了,只好实现串口各自的数据转发。

现在我把我实现的过程简单描述一下:

1、 初始化设置:USART1_RX+DMA1_ Channel5,USART2_RX+DMA1_ Channel6USART1_TX+DMA1_ Channel4USART2_TX+DMA1_ Channel7(具体设置请看程序包)。

2、 当数据发送给USART1接收完毕时候会引起USART1的串口总线中断,计算DMA1_ Channel5内存数组剩余容量,得到接收的字符长度。将接收的字符复制给DMA1_ Channel4内存数组,启动DMA1_ Channel4通道传输数据,(传输完成需要关闭。)下一次数据接收可以在启动DMA1_ Channel4时候就开始,不需要等待DMA1_ Channel4数据传输完成。但是上一次DMA1_ Channel4完成之前,不可以将数据复制给DMA1_ Channel4内存数组,会冲掉以前数据。

3、 USART2类同USART1

呵呵,下面贴程序:

IO口定义:

void GPIO_Configuration(void)

{

   GPIO_InitTypeDef GPIO_InitStructure;

   /* 1步:打开GPIOUSART部件的时钟 */

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

   /* 2步:将USART TxGPIO配置为推挽复用模式 */

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* 3步:将USART RxGPIO配置为浮空输入模式

   由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的

   但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数

   */

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 1步:打开GPIOUSART2部件的时钟 */

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

/* 2步:将USART2 TxGPIO配置为推挽复用模式 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 3步:将USART2 RxGPIO配置为浮空输入模式

由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的

但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数

*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*  3步已经做了,因此这步可以不做

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

*/

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

串口初始化:

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

   /* 4步:配置USART参数

   - BaudRate = 115200 baud

   - Word Length = 8 Bits

   - One Stop Bit

   - No parity

   - Hardware flow control disabled (RTS and CTS signals)

   - Receive and transmit enabled

   */

   USART_InitStructure.USART_BaudRate = 19200;

   USART_InitStructure.USART_WordLength = USART_WordLength_8b;

   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(USART1, &USART_InitStructure);

   //空闲中断

   USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);

/* 5步:使能 USART, 配置完毕 */

   USART_Cmd(USART1, ENABLE);  

/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去

   如下语句解决第1个字节无法正确发送出去的问题 */

   USART_ClearFlag(USART1, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete flag */

USART_InitStructure.USART_BaudRate = 9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

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(USART2, &USART_InitStructure);

   USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);//开启空闲,帧错,噪声,校验错中断 

USART_Cmd(USART2, ENABLE);

/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去

   如下语句解决第1个字节无法正确发送出去的问题 */

   USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete flag */

}

DMA配置:

void DMA_Configuration(void)

{

  DMA_InitTypeDef DMA_InitStructure;

  /* DMA clock enable */

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1

  /* DMA1 Channel4 (triggered by USART1 Tx event) Config */

  DMA_DeInit(DMA1_Channel4);  

  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_DATA;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = 512;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel4, &DMA_InitStructure);

  DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);

  DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);

  /* Enable USART1 DMA TX request */

  USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

  DMA_Cmd(DMA1_Channel4, DISABLE);

  /* DMA1 Channel5 (triggered by USART2 Tx event) Config */

  DMA_DeInit(DMA1_Channel7);  

  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = 512;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel7, &DMA_InitStructure);

  DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);

  DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);

  /* Enable USART1 DMA TX request */

  USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);

  DMA_Cmd(DMA1_Channel7, DISABLE);

  /* DMA1 Channel5 (triggered by USART1 Rx event) Config */

  DMA_DeInit(DMA1_Channel5);  

  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RECEIVE_DATA;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 512;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel5, &DMA_InitStructure);

  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);

  DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);

  

  /* Enable USART1 DMA RX request */

  USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);

  DMA_Cmd(DMA1_Channel5, ENABLE);

  /* DMA1 Channel6 (triggered by USART1 Rx event) Config */

  DMA_DeInit(DMA1_Channel6);  

  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 512;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

  DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);

  DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);

  /* Enable USART2 DMA RX request */

  USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);

  DMA_Cmd(DMA1_Channel6, ENABLE);

}

中断优先级配置:

void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure one bit for preemption priority */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

  /* Enable the USART1 Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  /* Enable the USART2 Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  //Enable DMA Channel4 Interrupt 

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  //Enable DMA Channel7 Interrupt 

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  /*Enable DMA Channel5 Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  /*Enable DMA Channel6 Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

数组定义,含义如题名:

u8 USART1_SEND_DATA[512];     

u8 USART2_SEND_DATA[512]; 

u8 USART1_RECEIVE_DATA[512]; 

u8 USART2_RECEIVE_DATA[512]; 

u8 USART1_TX_Finish=1;// USART1发送完成标志量

u8 USART2_TX_Finish=1; // USART2发送完成标志量

USART1中断服务函数

void USART1_IRQHandler(void)

{

u16 DATA_LEN;

u16 i;

  if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//如果为空闲总线中断

    {

DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除

        //USART_RX_STA = USART1->DR;

   DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel5); 

if(DATA_LEN > 0)

        {

while(USART1_TX_Finish==0)//等待数据传输完成才下一次

            {

                ;

            }

//将数据送DMA存储地址

            for(i=0;i<DATA_LEN;i++)

            {

                USART1_SEND_DATA[i]=USART1_RECEIVE_DATA[i];

            }

            //USARTDMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

            DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作

            DMA1_Channel4->CNDTR=DATA_LEN; //DMA1,传输数据量

            USART1_TX_Finish=0;//DMA传输开始标志量

            DMA_Cmd(DMA1_Channel4, ENABLE);

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清标志

DMA1_Channel5->CNDTR = 512;//重装填

DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA

//SR后读DR清除Idle

i = USART1->SR;

i = USART1->DR;

}

if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错

{

USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);

}

   USART_ClearITPendingBit(USART1, USART_IT_TC);

   USART_ClearITPendingBit(USART1, USART_IT_IDLE);

}

USART2中断服务函数

void USART2_IRQHandler(void)

{

u16 DATA_LEN;

u16 i;

  if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) //如果为空闲总线中断

    {

DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据

//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除

        //USART_RX_STA = USART1->DR;

   DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6); 

if(DATA_LEN > 0)

        {

while(USART2_TX_Finish==0)//等待数据完成才下一次

            {

                ;

            }

//将数据送DMA存储地址

            for(i=0;i<DATA_LEN;i++)

            {

                USART2_SEND_DATA[i]=USART2_RECEIVE_DATA[i];

            }

            //USARTDMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

            DMA_Cmd(DMA1_Channel7, DISABLE); //改变datasize前先要禁止通道工作

            DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,传输数据量

            USART2_TX_Finish=0;//DMA传输开始标志量

            DMA_Cmd(DMA1_Channel7, ENABLE);

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志

DMA1_Channel6->CNDTR = 512;//重装填

DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA

//SR后读DR清除Idle

i = USART2->SR;

i = USART2->DR;

}

if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错

{

USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);

}

   USART_ClearITPendingBit(USART2, USART_IT_TC);

   USART_ClearITPendingBit(USART2, USART_IT_IDLE);

}

DMA1_Channel5中断服务函数

void DMA1_Channel5_IRQHandler(void)

{

  DMA_ClearITPendingBit(DMA1_IT_TC5);

  DMA_ClearITPendingBit(DMA1_IT_TE5);

  DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

  DMA1_Channel5->CNDTR = 580;//重装填

  DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA

}

DMA1_Channel6中断服务函数

void DMA1_Channel6_IRQHandler(void)

{

  DMA_ClearITPendingBit(DMA1_IT_TC6);

  DMA_ClearITPendingBit(DMA1_IT_TE6);

  DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据

  DMA1_Channel6->CNDTR = 580;//重装填

  DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA

}

DMA1_Channel4中断服务函数

//USART1使用DMA发数据中断服务程序

void DMA1_Channel4_IRQHandler(void)

{

  DMA_ClearITPendingBit(DMA1_IT_TC4);

  DMA_ClearITPendingBit(DMA1_IT_TE4);

  DMA_Cmd(DMA1_Channel4, DISABLE);//关闭DMA

  USART1_TX_Finish=1;//DMA传输完成

}

DMA1_Channel7中断服务函数

//USART2使用DMA发数据中断服务程序

void DMA1_Channel7_IRQHandler(void)

{

  DMA_ClearITPendingBit(DMA1_IT_TC7);

  DMA_ClearITPendingBit(DMA1_IT_TE7);

  DMA_Cmd(DMA1_Channel7, DISABLE);//关闭DMA

  USART2_TX_Finish=1;//DMA传输完成

}

呵呵,全部完,但是程序在开始启动时会出现

自己发几个不知道什么字符,之后一切正常。如有什么问题,请大神指教。个人认为问题不大,因为在工作的时候通过STM32访问后台或者后台访问STM32大量的间隔密的数据时没有出现问题。而如果没有使用DMA,单帧数据发收可以,多帧数据经过USART1USART2,就收不到从USART2反馈的第二帧数据了。不一定是速度上的问题,可能是我处理顺序的问题,但是不管是巧合,还是瞎撞的,总归解决办法的就是好办法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

USART串口总结2 的相关文章

  • 「STM32入门」USART串口通信

    通信 通信的目的 xff1a 将一个设备的数据传送到另一个设备 xff0c 扩展硬件系统 通信协议 xff1a 制定通信的规则 xff0c 通信双方按照协议规则进行数据收发 STM32常见的通信协议 本文将介绍USART 概念解释 TX R
  • STM32库USART_ITConfig的坑

    USART ITConfig只能使用一个中断标志 xff01 看看中断参数的定义 xff1a define USART IT PE uint16 t 0x0028 define USART IT TXE uint16 t 0x0727 de
  • STM32串口读取一帧数据USART_IT_IDLE

    stm32 串口读取数据中断 USART IT RXNE xff1a 读取到一个数据产生中断USART IT IDLE xff1a 读取到一帧数据产生中断 以前串口读取一帧数据的方法 xff1a 收到数据后重置定时器的值 xff0c 等到定
  • ..\OBJ\USART.axf: Error: L6218E: Undefined symbol I2C_CheckEvent (referred from oled_i2c.o).

    OBJ USART axf Error L6218E Undefined symbol I2C CheckEvent referred from oled i2c o OBJ USART axf Error L6218E Undefined
  • USART RX 不上拉的后果

    这两天写一个STM32的程序 xff0c 其中USART1是要接一个串口屏做显示的 xff0c 调试前期是还没用到显屏 xff0c 就拿USART1做log打印 然后就发现了一个很怪异的现象 USART1串口转usb接到电脑 xff0c 程
  • STM32的USART注意

    在USART的发送端有2个寄存器 xff0c 一个是程序可以看到的USART DR寄存器 另一个是程序看不到的移位寄存器 对应USART数据发送有两个标志 xff0c 一个是TXE 61 发送数据寄存器空 xff0c 另一个是TC 61 发
  • 弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)

    下面通过485半双工的通信过程 xff0c 记录USART串口的几个使能位 标志位 说明 xff1a USART IT TC 和 USART IT RXNE是一个常量 xff0c 并不代表 xff08 TC RXNE 这两位 define
  • STM32 USART 一些问题

    SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13
  • USART串口总结2

    前言 xff1a 开始学USART 43 DMA 的时候看到帖子 STM32 UART DMA 实现未知数据长度接收 xff0c 觉得方法妙极了 此下出自此帖子 xff08 整体的思路是这样的 xff0c 一开始设置好DMA 接收 xff0
  • 通信方式梳理:GPIO,I2C,SPI,UART,USART,USB的区别

    GPIO xff0c I2C xff0c SPI xff0c UART xff0c USART xff0c USB的区别 1 简单区别 xff1a 1 xff09 GPIO xff08 General Purpose Input Outpu
  • 【STM32学习】——串口通信协议&STM32-USART外设&数据帧/输入数据策略/波特率发生器&串口发送/接受实操

    文章目录 前言一 串口通信1 通信接口2 串口通信 xff08 1 xff09 串口简介 xff08 2 xff09 串口硬件电路 xff08 3 xff09 串口软件部分 二 STM32的USART外设1 USART简介2 图示详解 三
  • 【STM32】串口通讯USART串口中断配置

    目录 STM32 USART 简介 程序编写 硬件接线 实际波形 STM32 USART 简介 STM32的USART通用同步异步收发器是一个串行通信设备 xff0c 可以灵活的与外部设备进行全双工数据交换 有别于USART xff0c 还
  • STM32中USART的使用方法

    USART作为一种标准接口在应用中十分常见 本文着重分析其作为 UART的配置和应用方法 1 STM32固件库使用外围设备的主要思路 在 STM32中 xff0c 外围设备的配置思路比较固定 首先是使能相关的时钟 xff0c 一方面是设备本
  • STM32——USART串口通信与串口重定向

    简介 UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称 作 UART 它将要传输的资料在串行通信与并行通信之间加以转换 作为把并行输入信 号
  • STM32的USART中RTS、CTS的作用和意义

    USART中RX和TX这两个引脚的功能 xff0c 这两个引脚是USART串行通信最常见和必不可少的两个引脚 但我们在手册中会发现关于USART的其他引脚 xff1a USART CK USART RTS USART CTS xff0c 如
  • STM32使用FIFO实现USART串口发送中断

    fifo就不要造轮子了 xff0c 用现成的就行了 linux内核中有目前人类写出的基于c语言的最强FIFO xff0c 请自行搜索学习 巧夺天工的kfifo xff0c kfifo精妙无比 xff0c 实在是高 xff0c 其中用到的环回
  • STM32之串口通信USART模块学习(1)

    一 通信接口 通信的目的 xff1a 将一个设备的数据传送到另一个设备 xff0c 扩展硬件系统通信协议 xff1a 制定通信的规则 xff0c 通信双方按照协议规则进行数据收发 单端信号通信的双方必须要共地 xff0c 因为都是对GND的
  • PY32F003F18之RS485通讯

    PY32F003F18将USART2连接到RS485芯片 和其它RS485设备实现串口接收后再转发的功能 一 测试电路 二 测试程序 include USART2 h include stdio h getchar putchar scan
  • STM32的USART发送中断标志位USART_IT_TXE和USART_IT_TC

    与STM32的发送中断相关的标志位有USART IT TXE和USART IT TC 根据ST芯片手册的信息可知 USART在发送移位寄存器 Transmit Shift Register 前面 还有一个TDR Transmit data
  • 串口的单线半双工模式(stm32f10x系列)

    关注 星标公众号 及时获取更多技术分享 作者 冰茶奥利奥 微信公众号 嵌入式电子创客街 这两天折腾CTS RTS硬件流控 看到说232协议的CTS RTS只是用来做半双工换向使用的 正好手头上有块stm32的板子 看了看stm32的Usar

随机推荐