C 仅在接收数据STM32F4 M4时读取USART RX寄存器

C 仅在接收数据STM32F4 M4时读取USART RX寄存器,c,usart,C,Usart,当我从另一个发现卡通过USART传输数据时,我有一个关于读取STM32F4发现卡上的RX寄存器的问题。当数据从card2传输时,我只想读取card1上的RX寄存器一次,然后我想清除它,以便读取card2传输的下一个数据 什么C代码可以帮我做到这一点?我可以使用什么标志?读取RX寄存器后,如何清除它?您必须使用另一个寄存器来确定RX是否有有效数据 假设您使用ST的外设库(您应该!),使用USART\u-GetFlagStatus()函数调用USART\u-FLAG\u-RXNE(表示“RX寄存器不

当我从另一个发现卡通过USART传输数据时,我有一个关于读取STM32F4发现卡上的RX寄存器的问题。当数据从card2传输时,我只想读取card1上的RX寄存器一次,然后我想清除它,以便读取card2传输的下一个数据


什么C代码可以帮我做到这一点?我可以使用什么标志?读取RX寄存器后,如何清除它?

您必须使用另一个寄存器来确定
RX
是否有有效数据

假设您使用ST的外设库(您应该!),使用
USART\u-GetFlagStatus()
函数调用
USART\u-FLAG\u-RXNE
(表示“RX寄存器不为空”)标志


当然,也可以设置一个中断,以便在收到字节时运行。

如果没有,请从ST下载STM32CubeF4。它包含发现板的驱动程序和示例代码。看看Examples->UART下的UART TwoBoards\u ComIT示例项目

示例项目中的说明:

*   This sample code shows how to use STM32F4xx UART HAL API to transmit 
*   and receive a data buffer with a communication process based on
*   IT transfer. 
*   The communication is done using 2 Boards.

你可以用这个。我在使用stm32f4zgt从RS485读取和接收数据时使用了此选项

USART3初始化命令

void RS485Init(USART_TypeDef *Usart, uint32_t BaudRate, uint16_t DataBits, uint16_t Parity, uint16_t StopBits){

GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef  NVIC_InitStruct;

// Enable clock for GPIOD
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); 
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART3);
// Initialize pins as alternating function
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = BaudRate;
USART_InitStructure.USART_WordLength = DataBits;
USART_InitStructure.USART_StopBits = StopBits;
USART_InitStructure.USART_Parity = Parity;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure); // USART3-> Usart

NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(Usart,ENABLE); 
}
变数

char txt_buf[100];
char bin_buf[]={'b','i','n','a','r','y',':',0,1,2,3,4,0x30,0x31,0x32,65,66,67,13,10};
uint16_t tx_len=0;
char *tx_ptr=0;
uint8_t send_ok=1;
缓冲区和中断命令

void Usart_SendBuf(USART_TypeDef *USART,  uint16_t length, char *buff){
/***********  RS485 DE ve RE pins. **********/
GPIO_SetBits(GPIOD,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_9);
send_ok=0;
tx_len = length; // sending byte count.
// if we'll use string,we don't need this value.
tx_ptr = buff;  // using array address-->> pointer
USART_ITConfig(USART,USART_IT_TXE,ENABLE); // TX  (DR) is empty create an interrupt
}
打断

void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3,USART_IT_TXE)){
if(--tx_len == 0){ // End of array?
USART_ITConfig(USART3,USART_IT_TXE,DISABLE); // TX flag is unuseful
    USART_ITConfig(USART3,USART_IT_TC,ENABLE); // when sending is ok, create an interr.
    }
    USART_SendData(USART3,(uint16_t) *tx_ptr);
    tx_ptr++;
    USART_ClearITPendingBit(USART3,USART_IT_TXE);
}
if(USART_GetITStatus(USART3,USART_IT_TC)){ // Last bit arrived?
    GPIO_ResetBits(GPIOD,GPIO_Pin_8);  // take the RS485 mode (take data, buf etc.)
    GPIO_SetBits(GPIOD,GPIO_Pin_9);
    USART_ITConfig(USART3,USART_IT_TC,DISABLE); // all datas is over. We don't need TC Flag
    USART_ClearITPendingBit(USART3,USART_IT_TC);
    send_ok=1;
  }
}

如果我有两张卡(Card1(主卡)和Card2(从卡))通过USARTx连接(例如USART6),并且我使用USART6_SendData()从我的从卡发送了一些东西,它会自动进入我的主卡的RX寄存器吗?这会触发中断吗?@Flux是,假设主机上的USART配置相同(波特率、字节格式等相同)并且(当然)启用。不过,你可能不希望链接是全双工的,它会让人更头疼。还有一个问题!何时输入USARTx_IRQHandler()函数?是什么打扰了我?Systick从内部时钟中断?