新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2021-4-27
- 在线时间
- 0 小时
|
1金钱
在使用DMA的时候,DMA1_Channel1的配置已经成功,但是当配置DMA2 Channel5的时候,却进不了中断。
DMA2_Channel5 ADC3_Channel7 PF9
引掉的是另一个成功的DAM
main函数:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// MYDMA1_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)¤tadc1,1);
MYDMA2_Config(DMA2_Channel5,(u32)&ADC3->DR,(u32)¤tadc3,1);
delay_init();
uart_init(115200);
LED_Init();
KEY_Init();
TPAD_Init(6);
// Adc1_Init();
Adc3_Init();
// TIM2_PWM_Init(T1-1,pre1-1);
TIM3_PWM_Init(T2-1,pre2-1);
LCD_Init();
LCD_Clear(BLACK);
while(1)
{
printf("currentadc3:%u\r\n",currentadc3);
printf("adc3:%u\r\n",adcx3[t3]);
printf("Flag:%u\r\n",DMA_GetITStatus(DMA2_IT_TC5));
delay_ms(300);
}
}
中断
void DMA2_Channel4_5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_IT_TC5)!=RESET)
{
adcx3[t3]=currentadc3;
t3++;
if(t3==NPT)
{
t3=0;
adc3_flag=1;//ADC采样完成
DMA_Cmd(DMA2_Channel5, DISABLE); //失能DMA
}
DMA_ClearITPendingBit(DMA2_IT_TC5);
}
}
DMA
void MYDMA2_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); //使能DMA传输
DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存//
DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure); //ADC1匹配DMA通道1
DMA_ITConfig(DMA2_Channel5,DMA2_IT_TC5,ENABLE); //使能DMA传输中断
//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_Cmd(DMA2_Channel5,ENABLE);//使能DMA通道
}
串口打印数据:
currentadc3有数据,说明ADC成功,但是却没有传到DMA的数组中
|
|