久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5958|回復: 1
收起左側

stm32定時器觸發ADC采集DMA,只能進行一次轉換,第二次就失敗,咋原因啊?

[復制鏈接]
ID:267330 發表于 2019-1-11 14:11 | 顯示全部樓層 |閱讀模式
只能進行一次DMA轉換,第二次采集不行?

源碼如下:
  1. #include "ADC.h"
  2. #include "usart.h"
  3. __IO uint16_t ADC_ConvertedValue[24];
  4. //************1.配置觸發所用定時器參數************************
  5. /*******************************************************************************
  6. * 函數名+函數功能: My_trigger_Time_Init: LED初始化函數
  7. * 輸入:usPer:自動重裝載寄存器的值; usPsc:時鐘預分頻數
  8. 定時頻率=72M/(usPer+1)=72/36000=2kHz;中斷周期=usPsc*(1/定時頻率)=1000*(1/2kHz)=0.5s
  9. * 輸出: 無
  10. *******************************************************************************/
  11. void My_trigger_Time_Init(u16 usPer,u16 usPsc,u16 usPulse)
  12. {
  13. GPIO_InitTypeDef GPIO_InitTypeStruct;
  14. RCC_APB2PeriphClockCmd(trigger_Time_GPIO_CLK, ENABLE );
  15. GPIO_InitTypeStruct.GPIO_Pin    = trigger_Time_GPIO_PIN; //定時器1觸發adc轉換的輸出的那個口
  16. GPIO_InitTypeStruct.GPIO_Speed  = GPIO_Speed_50MHz;
  17. GPIO_InitTypeStruct.GPIO_Mode   = GPIO_Mode_AF_PP;
  18. GPIO_Init(trigger_Time_GPIO_PORT, &GPIO_InitTypeStruct);

  19. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  20. TIM_OCInitTypeDef TIM_OCInitTypeStruct;
  21. //********************************1.初始化定時器參數********************************
  22. RCC_APB2PeriphClockCmd(trigger_Time_CLK,ENABLE);//本程序用的是TIME
  23. TIM_TimeBaseInitStructure.TIM_Period                   =usPer;            
  24. TIM_TimeBaseInitStructure.TIM_Prescaler                =usPsc;         
  25. TIM_TimeBaseInitStructure.TIM_ClockDivision            =TIM_CKD_DIV1;         
  26. TIM_TimeBaseInitStructure.TIM_CounterMode              =TIM_CounterMode_Up;//注意:必須配置成這個模式  
  27. TIM_TimeBaseInit(trigger_Time,&TIM_TimeBaseInitStructure);

  28. TIM_OCInitTypeStruct.TIM_OCMode       = TIM_OCMode_PWM1;         //注意:必須配置成pwm模式 ,不能更改
  29. TIM_OCInitTypeStruct.TIM_OutputState  = TIM_OutputState_Enable;
  30. TIM_OCInitTypeStruct.TIM_Pulse        = usPulse;
  31. TIM_OCInitTypeStruct.TIM_OCPolarity   = TIM_OCPolarity_Low;
  32. TIM_OC1Init(trigger_Time, &TIM_OCInitTypeStruct);  //【改】:用不同的定時器觸發這個函數要改
  33. TIM_Cmd(trigger_Time,ENABLE);

  34.   TIM_InternalClockConfig(trigger_Time);
  35.   TIM_ARRPreloadConfig(trigger_Time, ENABLE);
  36. TIM_OC1PreloadConfig(trigger_Time,TIM_OCPreload_Enable);//【改】:用不同的定時器觸發這個函數要改

  37. TIM_CtrlPWMOutputs(trigger_Time, ENABLE);      //這個是必須有的
  38.   
  39. }
  40. //************2.配置觸發所用定時器參數************************
  41. /*******************************************************************************
  42. * 函數名+功能: My_ADC_Init:初始化函數
  43. * 輸入 : 無
  44. * 輸出 : 無
  45. *******************************************************************************/
  46. void My_DMA_Init(void)
  47. {
  48. DMA_InitTypeDef DMA_InitStructure;
  49. RCC_AHBPeriphClockCmd(ADC_DMA_CLK, ENABLE);
  50. DMA_DeInit(ADC_DMA_Channel);     
  51. DMA_InitStructure.DMA_PeripheralBaseAddr    = ( uint32_t ) ( & ( ADC_x->DR ) );//ADC的數據寄存器的地址
  52. DMA_InitStructure.DMA_MemoryBaseAddr        = (uint32_t)&ADC_ConvertedValue;//【改】:根據數據所放地址(16位)
  53. DMA_InitStructure.DMA_DIR                   = DMA_DIR_PeripheralSRC;
  54. DMA_InitStructure.DMA_BufferSize            = 24;      //【改】:
  55. DMA_InitStructure.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;
  56. DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Enable;   
  57. DMA_InitStructure.DMA_PeripheralDataSize    = DMA_PeripheralDataSize_HalfWord;
  58. DMA_InitStructure.DMA_MemoryDataSize        = DMA_MemoryDataSize_HalfWord;   //16位
  59. DMA_InitStructure.DMA_Mode                  = DMA_Mode_Normal;             //傳送一次
  60. DMA_InitStructure.DMA_Priority              = DMA_Priority_High;
  61. DMA_InitStructure.DMA_M2M                   = DMA_M2M_Disable;
  62. DMA_Init(ADC_DMA_Channel, &DMA_InitStructure);
  63. DMA_Cmd(ADC_DMA_Channel , ENABLE);
  64. //*********************用中斷下面就需要,不用DMA中斷下面就不需要*************
  65.   DMA_ITConfig(ADC_DMA_Channel,DMA_IT_TC,ENABLE);
  66.   DMA_ClearFlag(DMA1_FLAG_TC1);
  67.   NVIC_InitTypeDef  NVIC_InitStructure;
  68.   NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;            //改
  69.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  //改
  70.   NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;        //改
  71.   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;         
  72.   NVIC_Init(&NVIC_InitStructure);
  73. }

  74. void My_ADC_Init( )
  75. {
  76.   My_DMA_Init( );
  77. //*******************初始化ADC--GPIO引腳***********************************************
  78. GPIO_InitTypeDef GPIO_InitStructure;
  79. RCC_APB2PeriphClockCmd( ADC_GPIO_CLK, ENABLE );
  80. GPIO_InitStructure.GPIO_Pin       =ADC_PIN;
  81. GPIO_InitStructure.GPIO_Mode      =GPIO_Mode_AIN; //這個必須為模擬輸入。
  82. GPIO_Init(ADC_PORT, &GPIO_InitStructure);
  83. //*******************配置ADC初始化***********************************************
  84. ADC_InitTypeDef ADC_InitStruct;
  85. RCC_ADCCLKConfig(RCC_PCLK2_Div6);       //【改】:
  86. RCC_APB2PeriphClockCmd(ADC_CLK, ENABLE );  
  87. ADC_DeInit(ADC_x);  

  88. ADC_InitStruct.ADC_Mode                = ADC_Mode_Independent;     
  89. ADC_InitStruct.ADC_ScanConvMode        = DISABLE;         
  90. ADC_InitStruct.ADC_ContinuousConvMode  = DISABLE;    //注意:不要使用連續轉換模式,否則只要出發一次,后續的轉換就不會停止,,這樣第一次以后的ADC,就不是有定時器觸發了。
  91. ADC_InitStruct.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_T1_CC1;//【改】:根據不同的定時器觸發腳
  92. ADC_InitStruct.ADC_DataAlign           = ADC_DataAlign_Right;        
  93. ADC_InitStruct.ADC_NbrOfChannel        = 1;      
  94. ADC_Init(ADC_x, &ADC_InitStruct);

  95. ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL, 1, ADC_SampleTime_1Cycles5);
  96.   ADC_InjectedSequencerLengthConfig(ADC_x, 1);
  97.   
  98. ADC_ExternalTrigInjectedConvConfig(ADC_x, ADC_ExternalTrigConv_T1_CC1 );//??????ADC_ExternalTrigInjecConv_None

  99. ADC_AutoInjectedConvCmd(ADC_x, ENABLE);
  100. ADC_ExternalTrigConvCmd(ADC_x,ENABLE);   //ADC外部觸發使能

  101. ADC_DMACmd(ADC_x, ENABLE);//使能ADC DMA 請求這句不能少。
  102. ADC_Cmd(ADC_x, ENABLE);               //是能ADC

  103. ADC_ResetCalibration(ADC_x);
  104.   while(ADC_GetResetCalibrationStatus(ADC_x));
  105.   ADC_StartCalibration(ADC_x);
  106.   while(ADC_GetCalibrationStatus(ADC_x));
  107.   
  108. }
  109. void DMA1_Channel1_IRQHandler(void)
  110. {   
  111. int kl=0;
  112.   if(DMA_GetITStatus(DMA1_IT_TC1))                  //轉換完成
  113.   {                        
  114.   TIM_Cmd(TIM1, DISABLE);
  115.     DMA_Cmd(DMA1_Channel1, DISABLE);
  116.   for(kl=0;kl<24;kl++)
  117.   {
  118.    printf("\r\n The current AD value = %f V \r\n",(float) ADC_ConvertedValue[kl]/4096*3.3); //把電壓值用顯示
  119.    printf("\r\n\r\n");
  120.    }
  121. }
  122.   DMA_ClearFlag(DMA1_FLAG_TC1);

  123. }

復制代碼

回復

使用道具 舉報

ID:579380 發表于 2019-7-7 14:25 | 顯示全部樓層
你的DMA模式(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //傳送一次)設置有誤,改成連續傳輸應該就可以了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97精品超碰一区二区三区 | 超碰高清| 日韩在线资源 | 免费黄视频网站 | 亚洲国产一区二区三区在线观看 | 国产精品日产欧美久久久久 | 久久大陆| 毛片一区二区三区 | 欧美一区二区三区视频在线观看 | 黄色免费av | 欧美在线观看一区二区 | 午夜国产| 中文字幕亚洲精品 | 亚洲一区视频在线 | 天天拍天天操 | 俺去俺来也www色官网cms | a中文在线视频 | 国产精品一区二区久久精品爱微奶 | 自拍视频网站 | va在线| 99在线精品视频 | 羞羞网站在线观看 | 暖暖成人免费视频 | a级性视频 | 欧美性区| 国产在线精品一区 | 国产98在线 | 免费, | 久久久五月天 | 国产免费一区二区三区网站免费 | 九九热最新视频 | 午夜网站视频 | 综合精品 | 国精日本亚洲欧州国产中文久久 | 色网在线播放 | 色橹橹欧美在线观看视频高清 | 亚洲国产高清高潮精品美女 | 久草在线 | 日韩午夜网站 | 国产成人一区二区 | 国产日韩欧美一区二区 | 欧美日韩综合一区 |