新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2015-12-15
- 在线时间
- 1 小时
|

楼主 |
发表于 2015-12-15 14:01:31
|
显示全部楼层
我目前在用外设库调串口DMA通讯,发现一直进不了DMA发送中断,请版主帮忙看一下:
void Uart1_DMAConfig(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*DMA USART1_TXD???????? */
DMA_InitStructure.DMA_BufferSize = TX_LEN;//?è??·????????¤??
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//8?????è?????í??
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//8???????????í??
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_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;//?è??·??????????×???·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//???è×÷???????????????????·?¨??????->???è??
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA????????
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->TDR) ;//?è??????·??????è?×???·
DMA_Init(DMA1_Channel4, &DMA_InitStructure);//????????
/*DMA USART1_RXD???????? */
// DMA_InitStructure.DMA_BufferSize = RX_LEN;//?è???????????¤??
// DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//8?????è?????í??
// DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//8???????????í??
// 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_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer;//?è??·??????????×???·
// DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//???è×÷?????????????????·?¨???è->????????
// DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA????????
// DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->RDR) ;//?è?????????????è?×???·
// DMA_Init(DMA1_Channel5, &DMA_InitStructure);//????????
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1?±??????
//USART_DMACmd(USART1, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);//UART1·???????????DMA????
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
DMA_ITConfig(DMA1_Channel4, DMA_IT_TC,ENABLE);//DMA1?¨??4·????ê??????????
//DMA_ITConfig(DMA1_Channel5, DMA_IT_TC,ENABLE);//DMA1?¨??5·????ê??????????
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_5_IRQn;//DMA?¨??4,5????????
NVIC_InitStructure.NVIC_IRQChannelPriority=2;//??????????2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//????????
DMA_ClearFlag(DMA1_FLAG_GL4); //?????¨??4?ù??±ê??
//DMA_ClearFlag(DMA1_FLAG_GL5); //?????¨??5?ù??±ê??
DMA_Cmd(DMA1_Channel4,ENABLE);//DMA1?¨??4????
//DMA_Cmd(DMA1_Channel5,ENABLE);//DMA1?¨??5????
}
以上是对DMA的配置
采用DMA发送中断方式
另有几个问题请教:
1. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->TDR)这一句取地址对吗?
2. DMA发送和接收中断能同时打开并使用吗?
3. USART1的TX和RX分别对应DMA的哪个通道,是2,3还是4,5
4.对UART1 DMA中断优先级设置有何要求?
5.如何再次启动DMA发送,是直接使能通道就可以吗?如:DMA_Cmd(DMA1_Channel4,ENABLE);
是否需要对数据长度和地址重新赋值?
谢谢 |
|