中级会员
 
- 积分
- 291
- 金钱
- 291
- 注册时间
- 2013-11-6
- 在线时间
- 31 小时
|
1金钱
HI
我想使用STM32F103ZET6 UART2 连接蓝牙串口模块,实现DMA收发数据,目前UART2 DMA接收数据没有问题,但是使用DMA发送数据时,没有异常也不会报错,但是数据没有发出来,以下是UART2 初始化,以及DMA初始化的代码。
bluetooth.c (uart2相关代码)
uint8_t uart2_dma_rx_buf[UART2_TRANSFER_BUFF_SIZE];
uint8_t uart2_dma_tx_buf[UART2_TRANSFER_BUFF_SIZE];
volatile unsigned char BLUETOOTH_DMA_REC_Flag = 0;
void bluetoothInit(u32 baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
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(USART2, &USART_InitStructure);
USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ClearFlag(USART2,USART_FLAG_IDLE);
configUsart2Dma();
//Enable
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
USART_Cmd(USART2, ENABLE);
}
void USART2_IRQHandler(void)
{
uint32_t len;
if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
len = UART2_TRANSFER_BUFF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel6);
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
(void)USART2->SR;
(void)USART2->DR;
BLUETOOTH_DMA_REC_Flag = 1;
rbWrite(puart1_rb, uart2_dma_rx_buf, len);
DMA_Cmd(DMA1_Channel6, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC6);
DMA_SetCurrDataCounter(DMA1_Channel6,UART2_TRANSFER_BUFF_SIZE);
DMA_Cmd(DMA1_Channel6, ENABLE );
}
}
void bluetoothSendData(u8 *buf,u8 len)
{
uint8_t t;
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2,buf[t]);
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
dma.c
volatile uint8_t dma1_is_idle = 1;
void configUsart2Dma(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable the DMA periph */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Common DMA configuration */
DMA_InitStructure.DMA_BufferSize = UART2_TRANSFER_BUFF_SIZE;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/* DMA Memory to Peripher */
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)uart2_dma_tx_buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR;
DMA_Init(DMA1_Channel7, &DMA_InitStructure);
/* DMA Peripher to Memory */
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)uart2_dma_rx_buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR;
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
/* Enable the USART2 Rx and Tx DMA1 requests */
USART_DMACmd(USART2, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel6, ENABLE);
}
int8_t usingdma_send_frame(DMA_Channel_TypeDef *DMA_Channelx,uint16_t ndtr)
{
if (dma1_is_idle) {
printf("dma1_is_idle == 1 ndtr = %d\r\n", ndtr);
dma1_is_idle = 0;
DMA_SetCurrDataCounter(DMA_Channelx,ndtr);
DMA_Cmd(DMA_Channelx, ENABLE);
printf("before while GetFlagStatus\r\n");
while(!DMA_GetFlagStatus(DMA1_FLAG_TC7));
printf("after while GetFlagStatus\r\n");
DMA_ClearFlag(DMA1_FLAG_TC7);
DMA_Cmd(DMA1_Channel7, DISABLE);
dma1_is_idle = 1;
return 0;
} else {
printf("dma1_is_idle == 0");
return -1;
}
}
sys.c (NVIC 相关配置)
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//ENABLE UART2 IRQ
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
目前无论使用 usingdma_send_frame 还是 bluetoothSendData 都没法把数据发送出来,但是也不会报报错,请问是哪里有问题,劳烦各位大神帮忙给解决下,不胜感激!
|
最佳答案
查看完整内容[请看2#楼]
每次发送都应重新配置发送DMA,参考:
代码仓库:https://github.com/Prry/stm32-uart-dma
详细实现:https://acuity.blog.csdn.net/article/details/108367512
|