新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2016-1-20
- 在线时间
- 9 小时
|
5金钱
本帖最后由 MoWangCZ 于 2016-5-12 12:23 编辑
现象描述:
1.STM32F207能够发送一次数据帧
2.DMA发送完成中断没有触发,进不了DMA中断
下面是我的DMA配置,DMA发送,DMA中断,请大家和原子哥帮我看看
DMA和串口配置代码
[mw_shl_code=c,true]void usartDmaInit(void)
{
int Timeout = 5000;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
//使能DMA总线时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
//去初始化STREAM 7 ,USART1_TX流 将使用CHANNEL 4
DMA_DeInit(DMA2_Stream7);
//wait the DMA reset OK
while(DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}
//Configure DMA Stream
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usartBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 200;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream7,&DMA_InitStructure);
DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
#if 0
while ((DMA_GetCmdStatus(DMA2_Stream7) != ENABLE) && (Timeout-- > 0))
{
}
if(Timeout == 0){
while(1);
}
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
DMA_Cmd(DMA2_Stream7,DISABLE);
}
void usart1Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
memset(usartBuf , 0x35 , sizeof(usartBuf));
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//管脚配置
//Reconnect the pin to the AF
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//Set the Usart TX as alternate function
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource9;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//Set the Usart RX as alternate function
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource10;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART配置
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
//使能串口DMA
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
USART_ClearITPendingBit(USART1, USART_IT_TC);//清除中断TC位
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
//初始化DMA
usartDmaInit();
}
[/mw_shl_code]
下面是DMA发送代码
[mw_shl_code=c,true]void msgOut(unsigned short len)
{
int i = 0;
volatile int count = 0;
if(len > 200)
return;
Usart1DmaSendOverFlag = 0;
DMA_SetCurrDataCounter(DMA2_Stream7,len);
DMA_Cmd(DMA2_Stream7 , ENABLE);
//查看是否error
while(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TEIF7) == SET){
count++;
if(count > 200){
break;
}
}
}
//输出
void strout(char *p)
{
int len = 0;
len = strlen(p);
msgOut(len);
}
int main(void)
{
usart1Init();
//getSysClk();
// printk("we have end of the usart init\r\n");
while(1){
myDelay(500);
memset(usartBuf , 0 , sizeof(usartBuf));
strcpy(usartBuf , "helloworld\r\n");
strout(usartBuf);
// printk("hello world\r\n");
}
return 0;
}[/mw_shl_code]
下面是DMA中断代码:
[mw_shl_code=applescript,true]void DMA2_Stream7_IRQHandler(void)
{
//这里中断都不能够进入
if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
// if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
{
/* Clear DMA Stream Transfer Complete interrupt pending bit */
DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
// DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
Usart1DmaSendOverFlag = 1; //允许再次发送
DMA_Cmd(DMA2_Stream7, DISABLE);
}
}void DMA2_Stream7_IRQHandler(void)
{
//这里中断都不能够进入
if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
// if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
{
/* Clear DMA Stream Transfer Complete interrupt pending bit */
DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
// DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
Usart1DmaSendOverFlag = 1; //允许再次发送
DMA_Cmd(DMA2_Stream7, DISABLE);
}
}[/mw_shl_code]
以上就是我的相关代码,请大家帮我看看,谢谢
|
|