当我通过USART从另一张Discovery卡传输数据时,我有一个关于读取STM32F4-Discovery卡上的RX寄存器的问题。我只想在从card2传输数据时读取card1上的RX寄存器,然后我想清除它以便我可以读取card2传输的下一个数据。
C代码可以为我做什么?我可以使用哪些标志?读完后如何清除RX寄存器?
答案 0 :(得分:1)
您必须使用其他寄存器来确定RX
是否包含有效数据。
假设您使用ST的外围库(您应该!),请使用USART_GetFlagStatus()
(即“RX寄存器不为空”)标志调用USART_FLAG_RXNE
函数。
或者,当然,只要收到一个字节就设置一个中断运行。
答案 1 :(得分:0)
如果还没有,请从ST下载STM32CubeF4。它包含发现板的驱动程序和示例代码。看看Examples-> UART下的UART_TwoBoards_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.
答案 2 :(得分:0)
你可以用它。我在阅读时使用了这个,用stm32f4zgt从RS485接收数据。
USART3初始化命令
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;
}
}
中断
ch.qos.logback.access.tomcat.LogbackValve