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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5927|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

stm32定時(shí)器觸發(fā)ADC采集DMA,只能進(jìn)行一次轉(zhuǎn)換,第二次就失敗,咋原因啊?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:267330 發(fā)表于 2019-1-11 14:11 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
只能進(jìn)行一次DMA轉(zhuǎn)換,第二次采集不行?

源碼如下:
  1. #include "ADC.h"
  2. #include "usart.h"
  3. __IO uint16_t ADC_ConvertedValue[24];
  4. //************1.配置觸發(fā)所用定時(shí)器參數(shù)************************
  5. /*******************************************************************************
  6. * 函數(shù)名+函數(shù)功能: My_trigger_Time_Init: LED初始化函數(shù)
  7. * 輸入:usPer:自動(dòng)重裝載寄存器的值; usPsc:時(shí)鐘預(yù)分頻數(shù)
  8. 定時(shí)頻率=72M/(usPer+1)=72/36000=2kHz;中斷周期=usPsc*(1/定時(shí)頻率)=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; //定時(shí)器1觸發(fā)adc轉(zhuǎn)換的輸出的那個(gè)口
  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.初始化定時(shí)器參數(shù)********************************
  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;//注意:必須配置成這個(gè)模式  
  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);  //【改】:用不同的定時(shí)器觸發(fā)這個(gè)函數(shù)要改
  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);//【改】:用不同的定時(shí)器觸發(fā)這個(gè)函數(shù)要改

  37. TIM_CtrlPWMOutputs(trigger_Time, ENABLE);      //這個(gè)是必須有的
  38.   
  39. }
  40. //************2.配置觸發(fā)所用定時(shí)器參數(shù)************************
  41. /*******************************************************************************
  42. * 函數(shù)名+功能: My_ADC_Init:初始化函數(shù)
  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的數(shù)據(jù)寄存器的地址
  52. DMA_InitStructure.DMA_MemoryBaseAddr        = (uint32_t)&ADC_ConvertedValue;//【改】:根據(jù)數(shù)據(jù)所放地址(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; //這個(gè)必須為模擬輸入。
  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;    //注意:不要使用連續(xù)轉(zhuǎn)換模式,否則只要出發(fā)一次,后續(xù)的轉(zhuǎn)換就不會(huì)停止,,這樣第一次以后的ADC,就不是有定時(shí)器觸發(fā)了。
  91. ADC_InitStruct.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_T1_CC1;//【改】:根據(jù)不同的定時(shí)器觸發(fā)腳
  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外部觸發(fā)使能

  101. ADC_DMACmd(ADC_x, ENABLE);//使能ADC DMA 請(qǐng)求這句不能少。
  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))                  //轉(zhuǎn)換完成
  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. }

復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:579380 發(fā)表于 2019-7-7 14:25 | 只看該作者
你的DMA模式(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //傳送一次)設(shè)置有誤,改成連續(xù)傳輸應(yīng)該就可以了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩一级免费观看 | 亚州春色| av入口| 亚洲成人一区 | 国产一区久久精品 | 久久久久久久香蕉 | 欧美在线天堂 | 欧美日韩成人在线观看 | 日本色高清| 国产欧美日韩一区二区三区在线观看 | 国内精品视频在线观看 | 日本午夜在线视频 | 91麻豆精品国产91久久久久久 | 欧洲一级毛片 | 午夜影院在线免费观看视频 | 99福利| 九九热视频这里只有精品 | 国产2区| 国产福利在线 | 日韩中文电影 | 国产精品成人久久久久 | 蜜月va乱码一区二区三区 | 国产一区二 | 中国黄色毛片视频 | 福利久久 | 一级毛片色一级 | 7777在线视频免费播放 | 中文字幕亚洲精品 | ririsao久久精品一区 | 免费一区| 日本综合在线观看 | 青青艹在线视频 | 黄色大片在线播放 | 日韩一区二区三区视频在线观看 | 一区二区在线免费观看视频 | 国产精品1区2区 | 色吧久久 | av毛片在线播放 | 草樱av| 成人欧美一区二区三区在线观看 | 91视视频在线观看入口直接观看 |