自己做了块板子,今天调试发现进不了串口DMA中断,在线仿真能进中断,而且有时候下载程序能进一次,求助大师答疑。还有仿真的时候看了一下系统时钟是8M,我接的外部晶振也是8M的,我记得系统默认不是9倍频了吗?是不是我晶振没起震?没起震不是会卡在SystemInit函数里吗?程序能运行,但是从原子程序移植过来的延时函数慢10倍,也就是delay_ms(100)是1秒,怎么回事啊
static void MYDMA_Config_RX(DMA_Channel_TypeDef* DMA_CHx,uint32_t _uCpar,uint32_t _uCmar,uint16_t _uCndtr)
{
DMA_DeInit(DMA_CHx);
DMA_InitStructure.DMA_PeripheralBaseAddr = _uCpar;// DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr =_uCmar;// DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//数据传输方向
DMA_InitStructure.DMA_BufferSize = _uCndtr ;//DMA通道的DMA缓存的大小
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_VeryHigh;//
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure);//
}
/*******************************************************************************
* 函 数 名 : Uart_Init
* 函数功能 : 串口配置:串口1,8位数据位,1位停止位,无校验,无流控制,
使能接收和发送,打开中断,使能DMA接收。
* 输 入 : _ucBaud:波特率
* 输 出 : 无
*******************************************************************************/
void Uart_Init(uint32_t _Baud)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
USART_InitTypeDef USART_InitStructure; //声明一个结构体变量,用来初始化串口
NVIC_InitTypeDef NVIC_InitStructure; //声明一个结构体变量,用来设置串口中断
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //打开串口1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIOA外设时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //打开DMA1时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //串口输出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输出IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输入IO */
USART_InitStructure.USART_BaudRate=_Baud; //波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //数据长8位
USART_InitStructure.USART_StopBits=USART_StopBits_1; //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(USART1,&USART_InitStructure); /* 初始化USART1 */
USART_Cmd(USART1, ENABLE);//使能UART1
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能或者失能指定的USART中断 接收中断
USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待处理标志位
MYDMA_Config_RX(DMA1_Channel5,(u32)&USART1->DR,(u32)&_ucRecv_Buff,8);
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1的DMA接收
DMA_Cmd(DMA1_Channel5, ENABLE); //使能串口DMA传输
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //打开USART1的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //对中断进行分组,优先级
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; //打开USART1的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
|