[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的数据寄存器始终不清零(在单线半双工模式下)?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>