[CW32F030系列] ADC转换之DMA传输

[复制链接]
563|4
 楼主| 51xlf 发表于 2022-9-11 20:42 | 显示全部楼层 |阅读模式
  1. #define DMA_CYCLE_EN  1
  2. uint32_t ADC_Result_Array[16] = {0};

  3. /******************************************************************************
  4. * Local pre-processor symbols/macros ('#define')
  5. ******************************************************************************/

  6. /*****************************************************************************
  7. * Function implementation - global ('extern') and local ('static')
  8. ******************************************************************************/
  9. static void ZeroMemory(uint8_t *buf,uint32_t size)
  10. {
  11.   uint32_t i = 0;
  12.   for(i = 0;i < size;i ++)
  13.   {
  14.     *buf = 0x0;
  15.   }
  16. }

  17. static void Error_Handle()
  18. {
  19.   while(1);
  20. }

  21. void DMA_CHANNEL1_IRQ_FUNCTION(void)
  22. {
  23.   if( DMA_GetITStatus(DMA_IT_TC1) )
  24.   {
  25.     DMA_ClearITPendingBit(DMA_IT_TC1);

  26. #ifdef DMA_CYCLE_EN
  27.                 CW_DMACHANNEL1->CNT      = 0x10010;                              //重置CNT计数
  28.                 CW_DMACHANNEL1->DSTADDR  = (uint32_t)( &ADC_Result_Array[0] );   //重置目的地址
  29.     DMA_Cmd(CW_DMACHANNEL1, ENABLE);  //使能DMA
  30. #else
  31.     ADC_Disable();    //传输完成,停止ADC
  32. #endif
  33.   }

  34.   if( DMA_GetITStatus(DMA_IT_TE1) )
  35.   {
  36.     DMA_ClearITPendingBit(DMA_IT_TE1);
  37.     Error_Handle();
  38.   }
  39. }
  40. /**
  41.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure the nested vectored interrupt controller.
  42.   * @param  None
  43.   * @retval None
  44.   */
  45. void NVIC_Configuration(void)
  46. {
  47.     __disable_irq();

  48.     NVIC_ClearPendingIRQ(DMACH1_IRQn);

  49.     NVIC_EnableIRQ(DMACH1_IRQn);

  50.     __enable_irq();  
  51. }


  52. /**
  53. ******************************************************************************
  54. ** \brief  Main function of project
  55. **
  56. ** \return uint32_t return value, if needed
  57. **
  58. **
  59. **
  60. ******************************************************************************/

  61. int32_t main(void)
  62. {
  63.     ADC_InitTypeDef   ADC_InitStruct;          
  64.           DMA_InitTypeDef   DMA_InitStruct;

  65.     RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_DMA | RCC_AHB_PERIPH_GPIOA | RCC_AHB_PERIPH_GPIOB, ENABLE);  //Open DMA and GPIOA/B Clk
  66.     RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_ADC, ENABLE);    //Open ADC Clk

  67.     //PB8/PB9 推挽输出
  68.           GPIO_InitTypeDef GPIO_InitStruct;
  69.                 GPIO_InitStruct.Pins = GPIO_PIN_8 | GPIO_PIN_9;
  70.                 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  71.                 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  72.                 GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
  73.                 PB08_SETLOW();
  74.                 PB09_SETLOW();
  75.        
  76.           //配置ADC测试IO口
  77.     PA00_ANALOG_ENABLE() ;      //PA00 (AIN0)
  78.        
  79.     //ADC初始化
  80.     ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode; //单通道单次转换模式
  81.     ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div128; //PCLK
  82.     ADC_InitStruct.ADC_SampleTime = ADC_SampTime5Clk; //5个ADC时钟周期
  83.     ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA; //VDDA参考电压
  84.     ADC_InitStruct.ADC_InBufEn = ADC_BufEnable; //开启跟随器
  85.     ADC_InitStruct.ADC_TsEn = ADC_TsDisable; //内置温度传感器禁用
  86.     ADC_InitStruct.ADC_DMAEn = ADC_DmaEnable; //ADC转换完成触发DMA传输
  87.     ADC_InitStruct.ADC_Align = ADC_AlignRight; //ADC转换结果右对齐
  88.     ADC_InitStruct.ADC_AccEn = ADC_AccDisable; //转换结果累加不使能
  89.     ADC_Init(&ADC_InitStruct);                                  //初始化ADC配置
  90.     CW_ADC->CR1_f.DISCARD = FALSE;                              //配置数据更新策略,不包含在ADC结构体中               
  91.     CW_ADC->CR1_f.CHMUX = ADC_Vref1P2Input;   //ADC_ExInputCH0; //配置ADC输入通道,不包含在ADC结构体中

  92.     ADC_ClearITPendingBit(ADC_IT_EOC);
  93.     ADC_ITConfig(ADC_IT_EOC, ENABLE);
  94.     ADC_EnableNvic(ADC_INT_PRIORITY);
  95.    
  96.     DMA_StructInit( &DMA_InitStruct );
  97.     ZeroMemory((uint8_t *)&ADC_Result_Array[0],sizeof(ADC_Result_Array));
  98.     DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;
  99.     DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_32BIT;
  100.     DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;
  101.         #ifdef DMA_CYCLE_EN
  102.     DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase;
  103.         #else
  104.     DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;
  105.         #endif

  106.     DMA_InitStruct.DMA_TransferCnt = 16;
  107.     DMA_InitStruct.DMA_SrcAddress = (uint32_t) &(CW_ADC->RESULT0);
  108.     DMA_InitStruct.DMA_DstAddress = (uint32_t)&ADC_Result_Array[0];
  109.     DMA_InitStruct.TrigMode = DMA_HardTrig;
  110.     DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;
  111.     DMA_Init(CW_DMACHANNEL1,&DMA_InitStruct);
  112.     DMA_ClearITPendingBit(DMA_IT_ALL);
  113.     DMA_ITConfig(CW_DMACHANNEL1, DMA_IT_TC|DMA_IT_TE , ENABLE);  //使能DMA_CHANNEL1中断
  114.     NVIC_Configuration();   //使能DMA_CHANNEL1中断
  115.     DMA_Cmd(CW_DMACHANNEL1, ENABLE);  //使能DMA

  116.     //ADC使能
  117.     ADC_Enable();
  118.     ADC_SoftwareStartConvCmd(ENABLE);

  119.                 while(1)
  120.                 {
  121.                         PB08_TOG();   
  122.                         PB09_TOG();
  123.                         FirmwareDelay(1000000);
  124.                 }
  125.    
  126. }


gouguoccc 发表于 2022-9-11 23:26 来自手机 | 显示全部楼层
学习了,谢谢分享,精度咋样呢?
Bowclad 发表于 2022-10-4 19:15 | 显示全部楼层
精度怎么样?
AloneKaven 发表于 2022-10-5 20:13 | 显示全部楼层
能分享一下精度咋样吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

551

主题

9969

帖子

24

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