新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2017-11-15
- 在线时间
- 3 小时
|
2金钱
芯片是STM32F407
问题是这样的:我设置USART2的接收到DMA1,然后在DMA中断中解析数据。当我把USART2的引脚设置为PD5、PD6时解析得到的数据是正确的,当我把引脚改为PA2、PA3时解析到的数据就是错的。然后我把同样的程序下载到另一块芯片上,发现两种引脚都不行了,数据都是错的,症状一样。不知道这是为什么,求助。给串口发的数据和解析的程序确定是对的。
补充:第一块芯片是407VET6,第二块芯片是407ZGT6
[mw_shl_code=c,true]u8 sbus_rx_buffer[18];//为接收数据开辟的内存空间
void USART2_Init(u32 Baud, u8 NvicPP, u8 NvicSP)
{
GPIO_InitTypeDef gpio;
USART_InitTypeDef usart;
NVIC_InitTypeDef nvic;
DMA_InitTypeDef dma;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
/*usart gpio init config*/
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);//PA2:TX
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);//PA3:RX
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &gpio);
gpio.GPIO_Pin = GPIO_Pin_6;
gpio.GPIO_OType = GPIO_OType_OD;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &gpio);
/*usart_dma init config*/
DMA_Cmd(DMA1_Stream5, DISABLE);//先失能
while(DMA_GetCmdStatus(DMA1_Stream5) != DISABLE);//等待DMA可配置
DMA_DeInit(DMA1_Stream5);
dma.DMA_Channel = DMA_Channel_4;
dma.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);
dma.DMA_Memory0BaseAddr = (uint32_t)sbus_rx_buffer;
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma.DMA_BufferSize = 18;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma.DMA_Mode = DMA_Mode_Circular;
dma.DMA_Priority = DMA_Priority_VeryHigh;
//指定如果FIFO模式或直接模式将用于指定的流_不使能FIFO模式
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
//指定了FIFO阈值水平
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
//指定的Burst转移配置内存传输
dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
//指定的Burst转移配置外围转移
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream5, &dma);
DMA_Cmd(DMA1_Stream5, ENABLE);//再使能
/*dma channel nvic config*/
nvic.NVIC_IRQChannel = DMA1_Stream5_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = NvicPP;
nvic.NVIC_IRQChannelSubPriority = NvicSP;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);
/*usart init config*/
usart.USART_BaudRate = Baud;
usart.USART_WordLength = USART_WordLength_8b;
usart.USART_StopBits = USART_StopBits_1;
usart.USART_Parity = USART_Parity_Even;//偶校验
usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART2, &usart);
/*usart receive and transmit interrupt config*/
USART_Cmd(USART2, ENABLE);
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);//usart2 挂接dma
}
[/mw_shl_code]
|
|