单线半双工模式下的USART的RXNE位没有变化?而且USART的数据寄存器始终不清零?

2019-07-20 09:09发布

[mw_shl_code=c,true]#include "stm32f4xx.h" #include <stdio.h> #include "USART_guanfang.h" __IO u16 RxData=0; void delay(int i); int main(void) { USART_Config_t(); USART_SendData(USART1,97); USART_ReceiveData(USART1); while(1) { while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); RxData = USART_ReceiveData(USART1); // printf("%c",RxData); delay(30000); USART_SendData(USART1,RxData); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); } } void delay(int i) { int j=3000; for(;i>0;i--) for(j=3000;j>0;j--); } int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; }[/mw_shl_code]
这个是main文件 [mw_shl_code=c,true]#include "USART_guanfang.h" void USART_Config_t(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Peripheral Clock Enable -------------------------------------------------*/ /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(USARTx_TX_GPIO_CLK | USARTx_RX_GPIO_CLK, ENABLE); /* Enable USART clock */ RCC_APB2PeriphClockCmd(USARTx_CLK, ENABLE);//USARTx_CLK_INIT(USARTx_CLK, ENABLE); /* Enable the DMA clock */ RCC_AHB1PeriphClockCmd(USARTx_DMAx_CLK, ENABLE); /* USARTx GPIO configuration -----------------------------------------------*/ /* Connect USART pins to AF7 */ GPIO_PinAFConfig(USARTx_TX_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF); GPIO_PinAFConfig(USARTx_RX_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF); /* Configure USART Tx and Rx as alternate function push-pull */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN; GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN; GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure); /* USARTx configuration ----------------------------------------------------*/ /* Enable the USART OverSampling by 8 */ USART_OverSampling8Cmd(USARTx_t, ENABLE); /* USARTx configured as follows: - BaudRate = 5250000 baud - Maximum BaudRate that can be achieved when using the Oversampling by 8 is: (USART APB Clock / 8) Example: - (USART3 APB1 Clock / 8) = (42 MHz / 8) = 5250000 baud - (USART1 APB2 Clock / 8) = (84 MHz / 8) = 10500000 baud - Maximum BaudRate that can be achieved when using the Oversampling by 16 is: (USART APB Clock / 16) Example: (USART3 APB1 Clock / 16) = (42 MHz / 16) = 2625000 baud Example: (USART1 APB2 Clock / 16) = (84 MHz / 16) = 5250000 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 = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; /* When using Parity the word length must be configured to 9 bits */ 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(USARTx_t, &USART_InitStructure); // /* Configure DMA controller to manage USART TX and RX DMA request ----------*/ // // /* Configure DMA Initialization Structure */ // DMA_InitStructure.DMA_BufferSize = BUFFERSIZE ; // DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ; // DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ; // DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ; // DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(USARTx->DR)) ; // DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; // DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // DMA_InitStructure.DMA_Priority = DMA_Priority_High; // /* Configure TX DMA */ // DMA_InitStructure.DMA_Channel = USARTx_TX_DMA_CHANNEL ; // DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)aTxBuffer ; // DMA_Init(USARTx_TX_DMA_STREAM,&DMA_InitStructure); // /* Configure RX DMA */ // DMA_InitStructure.DMA_Channel = USARTx_RX_DMA_CHANNEL ; // DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)aRxBuffer ; // DMA_Init(USARTx_RX_DMA_STREAM,&DMA_InitStructure); danxian(); /* Enable USART */ USART_Cmd(USARTx_t, ENABLE); } void danxian(void)//采用单线半双工模式 { USARTx_t->CR3 |= (1<<3); USARTx_t->CR2 &= ~0x4800; USARTx_t->CR3 &= ~0x0022; }[/mw_shl_code]
这是我自己按照帮助文档改的 [mw_shl_code=c,true]#ifndef _USART_GUANFANG_H_ #define _USART_GUANFANG_H_ #include "stm32f4xx.h" #define USARTx_TX_GPIO_CLK RCC_AHB1Periph_GPIOA #define USARTx_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define USARTx_CLK RCC_APB2Periph_USART1 #define USARTx_DMAx_CLK RCC_AHB1Periph_DMA2 #define USARTx_TX_GPIO_PORT GPIOA #define USARTx_RX_GPIO_PORT GPIOA #define USARTx_TX_SOURCE GPIO_PinSource9 #define USARTx_RX_SOURCE GPIO_PinSource10 #define USARTx_TX_AF GPIO_AF_USART1 #define USARTx_RX_AF GPIO_AF_USART1 #define USARTx_TX_PIN GPIO_Pin_9 #define USARTx_RX_PIN GPIO_Pin_10 #define USARTx_t USART1 void USART_Config_t(void); void danxian(void); #endif[/mw_shl_code]
这是上一个文件的头文件 usart1,单线半双工。是这么写吗? [mw_shl_code=c,true]void danxian(void)//采用单线半双工模式 { USARTx_t->CR3 |= (1<<3); USARTx_t->CR2 &= ~0x4800; USARTx_t->CR3 &= ~0x0022; }[/mw_shl_code] 我实验的时候确实好使,但是RXNE这个位没有变化。因此while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);这个语句从来就没有循环过,导致程序跑飞了。 问题1:难道单线半双工模式下RXNE永远不变,? 问题2:波特率只能选择115200,9600,2400,1200.。。。。。等这些特殊的数字吗?就不能设置成3000吗? 问题3:USART的数据寄存器始终不清零(在单线半双工模式下)?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。