[LPC] LPC4370 使用HADC时为何DMA无法开启中断?

[复制链接]
 楼主| lyl5530330 发表于 2020-4-17 17:46 | 显示全部楼层 |阅读模式
借鉴官方论坛,调试了LPC4370 80M ADC的采样,但是为何DMA无法开启中断呢,我已经始能了DMA中断,以下贴下代码
  1. int main(void)
  2. {

  3.   uint8_t DGEC = 0xE;
  4.        
  5.         SystemCoreClockUpdate();
  6.         Board_Init();//设置调试串口LPC_USART2 与LED状态
  7.        
  8.         Chip_USB0_Init();/*将USB0 PLL初始化为480 MHz */

  9.   Chip_Clock_SetDivider(CLK_IDIV_A,CLKIN_USBPLL,2); /*来自USB0PLL的DIV_A源,并将分频器设置为2(支持的最大div值为4)[IN 480 MHz;输出240 MHz */

  10.   Chip_Clock_SetDivider(CLK_IDIV_B,CLKIN_IDIVA,3); /*来自DIV_A的源DIV_B,[IN 240 MHz;输出80 MHz */
  11.        
  12.        
  13.   Chip_Clock_SetBaseClock(CLK_BASE_ADCHS,CLKIN_IDIVB,true,false); /*来自DIV_B的ADHCS基本时钟*/
  14.        
  15.         Chip_Clock_EnableOpts(CLK_MX_ADCHS, true, true, 1);/*启用寄存器时钟*/

  16.         Chip_Clock_Enable(CLK_ADCHS);        /*启用时钟*/
  17.        
  18.         ////////////////////////////////// HSADC设置///// ///////////////////////////////////////////////////// /////////

  19.          /* 中断设置 */
  20.          LPC_ADCHS-> INTS [0] .CLR_EN = 0x7F; //禁用中断0
  21.          LPC_ADCHS-> INTS [0] .CLR_STAT = 0x7F; //清除中断状态
  22.          while(LPC_ADCHS-> INTS [0] .STATUS&0x7D); //等待状态清除,必须排除FIFO_EMPTY
  23.          LPC_ADCHS-> INTS [1] .CLR_EN = 0x7F;
  24.          LPC_ADCHS-> INTS [1] .CLR_STAT = 0x7F;
  25.          while(LPC_ADCHS-> INTS [1] .STATUS&0x1E);

  26.          /*初始化HSADC */
  27.          Chip_RGU_TriggerReset(RGU_ADCHS_RST);//复位HADC
  28.          while (Chip_RGU_InReset(RGU_ADCHS_RST)){}
  29.                  
  30.          LPC_ADCHS-> POWER_DOWN = 0; //禁用电源关闭模式
  31.          
  32.          LPC_ADCHS-> FIFO_CFG =(8 << 1)/* FIFO_LEVEL大小 */ | (1)/* PACKED_READ 数据保存在FIFO的方式,1表示两个采样数据打包存放 */;
  33.          LPC_ADCHS-> DSCR_STS = (1 << 1)| 0; //设置活动的描述符表与描述符
  34.                  
  35.   /* 设置描述符表0中的描述符0*/
  36.         LPC_ADCHS->DESCRIPTOR[0][0] = (1 << 24) /* RESET_TIMER 复位定时器*/
  37.                                                                                                                         | (0 << 22) /* THRESH 未添加比较器*/
  38.                                                                                                                         | (0 << 8) /* MATCH 描述符计时器值等于MATC时,转换描述符*/
  39.                                                                                                                         | (1 << 6) /* BRANCH to First 转换完成后跳转到该表第一个描述符*/;
  40.        
  41.                  /* Set descriptor 1 to take a measurement after 0x9A clocks and branch to first descriptor*/
  42.         LPC_ADCHS->DESCRIPTOR[0][1] = (1 << 31) /* UPDATE TABLE*/
  43.                                                                                                                         | (1 << 24) /* RESET_TIMER*/
  44.                                                                                                                         | (0 << 22) /* THRESH*/
  45.                                                                                                                         | (0x9A << 8) /* MATCH*/
  46.                                                                                                                         | (0x01 << 6) /* BRANCH to first*/;
  47.          
  48.          LPC_ADCHS-> CONFIG =(0x90 << 6)/*恢复时间,建议值*/
  49.                                                                                         | (0 << 5)/* CHANNEL_ID_EN ,0表示不将通道ID输入到FIFO中*/
  50.                                                                                         | (0x01)/* TRIGGER_MASK 01 表示仅使用软件触发*/;

  51.    /* CRS设置为0x4,所以SPEED所有DGEC应该被设置为0xE */
  52.          LPC_ADCHS-> ADC_SPEED =(DGEC << 20)
  53.                                                                                                  | (DGEC << 16)
  54.                                                                                                  | (DGEC << 12)
  55.                                                                                                  | (DGEC << 8)
  56.                                                                                                  | (DGEC << 4)
  57.                                                                                                  | (DGEC);
  58.                                                                                                  
  59.          //未设置阈值寄存器,因为未使用它们
  60.          LPC_ADCHS->POWER_CONTROL =(1 << 18)/* BGAP */
  61.                                                                                                                 |(1 << 17)/*电源 ADC保持供电*/
  62.                                                                                                                 |(0 << 4) /* DCINNEG在ADC0 No dc bias*/
  63.                                                                                                                 |(0 << 10)/* DC在ADC0中 No dc bias*/
  64.                                                                                                                 |(0 << 16)/* 1 =以TWOS输出-0 =以Offset Binary输出*/
  65.                                                                                                                 |(0x4)/* CRS ,设置ADC速度*/;
  66.                                                                                                                
  67.                 LPC_ADCHS-> FLUSH = 1;        //FIFO刷新
  68.          
  69.          ///////////////////////////////////////////////////// //// DMA设置///////////////////////////////////////////// ///////////////////////
  70.          /* 初始化与使能 */
  71.          Chip_GPDMA_Init(LPC_GPDMA);
  72.          
  73.          NVIC_DisableIRQ(DMA_IRQn);
  74.          NVIC_SetPriority(DMA_IRQn, ((0x01 << 3) | 0x01));
  75.          NVIC_EnableIRQ(DMA_IRQn);
  76.          
  77.          LPC_GPDMA-> CONFIG = 0x01;
  78.          while(!(LPC_GPDMA-> CONFIG&0x01)); //使能
  79.          
  80.          /*清除所有DMA中断和错误标志*/
  81.          LPC_GPDMA-> INTTCCLEAR = 0xFF; //清除通道终端计数中断
  82.          LPC_GPDMA-> INTERRCLR = 0xFF; //清除通道错误中断。
  83.          
  84.          /* ADC描述符寄存器的值仅能通过DMA通道7传递 */
  85.          LPC_GPDMA-> CH[DMA_CH].SRCADDR =(uint32_t)&LPC_ADCHS-> FIFO_OUTPUT [0];//DMA源地址
  86.          LPC_GPDMA-> CH[DMA_CH].DESTADDR =((uint32_t)&sample);//DMA目标地址
  87.          LPC_GPDMA-> CH[DMA_CH].CONTROL =(DMA_TRANSFER_SIZE)//传输大小 最大4095
  88.                                                                                                                                                                                          | (0x0 << 12)// src突发大小
  89.                                                                                                                                                                                          | (0x0 << 15)// dst突发大小
  90.                                                                                                                                                                                          | (0x2 << 18)// src传输宽度,0x2表示以字的形式传输
  91.                                                                                                                                                                                          | (0x2 << 21)// dst传输宽度,0x2表示以字的形式传输
  92.                                                                                                                                                                                          | (0x1 << 24)// src AHB主选择
  93.                                                                                                                                                                                          | (0x0 << 25)// dst AHB主选择
  94.                                                                                                                                                                                          | (0x0 << 26)// src增量:0,每次传输后src地址不递增
  95.                                                                                                                                                                                          | (0x1 << 27)// dst增量:1,每次传输后的dst地址增量
  96.                                                                                                                                                                                          | (0x1 << 31); //终端计数中断使能位:1,使能

  97.          LPC_GPDMA-> CH [DMA_CH] .CONFIG = (HSADC_DMA_READ << 1)// src外设:设置为8-HSADC
  98.                                                                                                                                                                                    | (0x0 << 6)// dst外设:无设置-内存
  99.                                                                                                                                                                                          | (0x6 << 11)//流控制:外设-存储器
  100.                                                                                                                                                                                          | (0x0 << 14)// IE-中断错误掩码
  101.                                                                                                                                                                                          | (0x0 << 15)// ITC-终端计数中断掩码
  102.                                                                                                                                                                                          | (0x0 << 16)//锁定:置位时,此位启用锁定传输
  103.                                                                                                                                                                                          | (0x0 << 18); //DMA请求忽略位
  104.    
  105.                 //LPC_GPDMA-> CH [DMA_CH] .LLI = 0;
  106.                
  107.          /////////////////////////////////////////////////// /////////////////////////////////////////////////////

  108.          //开始DMA与ADC
  109.          LPC_ADCHS->FLUSH = 1;
  110.          Chip_HSADC_SWTrigger(LPC_ADCHS);
  111.          
  112.          //等待ADC稳定
  113.          for(i = 0; i <4096;i ++)
  114.          {
  115.                                  ; //发出DMA中断,等待采样结束
  116.          }
  117.          LPC_GPDMA-> CH [DMA_CH] .CONFIG =(0x1 << 0); //启用位,1启用,0禁用
  118.          
  119.          //等待DMA传输完成
  120.          for(i = 0; i <4096;i ++)
  121.          {
  122.                          ;
  123.          }
  124.          
  125.          Chip_HSADC_FlushFIFO(LPC_ADCHS);
  126.          sts = Chip_HSADC_GetFIFOLevel(LPC_ADCHS);
  127.          Chip_HSADC_DeInit(LPC_ADCHS);
  128.          Chip_GPDMA_DeInit(LPC_GPDMA);
  129.          
  130.          j=0;
  131.          for(i=0;i<4095;i++)
  132.          {
  133.                  TEST_DATA_8[j++]=(sample[i]&0xff000000)>>24;
  134.                  TEST_DATA_8[j++]=(sample[i]&0xff0000)>>16;
  135.                  TEST_DATA_8[j++]=(sample[i]&0xff00)>>8;
  136.                  TEST_DATA_8[j++]=sample[i]&0xff;
  137.          }
  138.          for(i = 0; i <4095*4; i ++)
  139.          {
  140.                  Chip_UART_SendByte(DEBUG_UART,TEST_DATA_8[i]);
  141.                  while((Chip_UART_ReadLineStatus(DEBUG_UART) & UART_LSR_THRE) == 0);
  142.          }
  143.          
  144.          while(1)
  145.          {
  146.                 if(Chip_GPDMA_Interrupt(LPC_GPDMA, 7) == SUCCESS)
  147.                 {
  148.                         DEBUGOUT("aa");
  149.                 }
  150.          }
  151. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部