你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l476g-discovery ADC转换 USART

[复制链接]
bbbone 提问时间:2018-9-5 17:00 /
悬赏10ST金币未解决
接着我的上一帖。我打算usart显示ADC转化后的数值 aResultDMA ,但是依旧有问题(显示0.000,如图所示)。求大神指导啊,V:chongzi15896main.c 文件内容:
1.  #include "stm32l476g_discovery.h"
2.  #include "stm32l476xx.h"
3.  #include "stm32l4xx_hal_conf.h"
4.  #include "adc.h"
5.  #include "SysClock.h"
6.  #include "LED.h"
7.  #include "UART.h"
8.  #include "main.h"
9.  #include "string.h"
10. #include "stdio.h"
11.  
12. char RxComByte = 0;
13. uint8_t buffer[BufferSize];
14. /* ADC handle declaration */
15. ADC_HandleTypeDef             AdcHandle;
16.  
17. /* ADC channel configurationstructure declaration */
18. ADC_ChannelConfTypeDef        sConfig;
19.  
20. /* Converted value declaration */
21. uint32_t                      aResultDMA;
22.  
23. int main(void){
24.  
25.    int a,n,i;
26.    float b;
27.    a=1100;
28.   
29.  
30.    HAL_Init();
31.    System_Clock_Init();// SwitchSystem Clock = 80 MHz
32.    LED_Init();
33.    UART2_Init();
34.    ADCx_CLK_ENABLE();
35.    ADCx_CHANNEL_GPIO_CLK_ENABLE();
36.    DMAx_CHANNELx_CLK_ENABLE();
37.    ADCx_FORCE_RESET();
38.    ADCx_RELEASE_RESET();
39.  
40.    b=(float)aResultDMA*3300/4069;
41.    while (1){
42.          n= sprintf((char *)buffer, "a = %d\t", a);
43.          n+= sprintf((char *)buffer +n, "b = %f \r\n", b);
44.          USART_Write(USART2,buffer, n);
45.          a= a + 1;
46.          for (i = 0; i < 8000000; i++); // Delay
47.          Red_LED_On();
48.  
49.       }
50.    /* ### - 1 - Initialize ADCperipheral #################################### */
51.      AdcHandle.Instance         = ADC1;
52.      if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
53.      {
54.        /* ADC de-initialization Error */
55.         Red_LED_On();
56.      }
57.  
58.      AdcHandle.Init.ClockPrescaler        =ADC_CLOCK_ASYNC_DIV1;          /* Asynchronous clock mode, inputADC clock not divided */
59.      AdcHandle.Init.Resolution            =ADC_RESOLUTION_12B;             /* 12-bit resolution for converteddata */
60.      AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* Right-alignment for converted data */
61.      AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion ononly 1 channel: channel set on rank 1) */
62.      AdcHandle.Init.EOCSelection          =ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicateconversion end */
63.      AdcHandle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled*/
64.      AdcHandle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled(automatic conversion restart after each conversion) */
65.      AdcHandle.Init.NbrOfConversion       = 1;                             /* Parameter discarded becausesequencer is disabled */
66.      AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer isdisabled */
67.      AdcHandle.Init.NbrOfDiscConversion   =1;                             /* Parameter discarded becausesequencer is disabled */
68.      AdcHandle.Init.ExternalTrigConv      =ADC_SOFTWARE_START;            /* Software start to trigthe 1st conversion manually, without external event */
69.      AdcHandle.Init.ExternalTrigConvEdge  =ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
70.      AdcHandle.Init.DMAContinuousRequests = ENABLE;                        /* DMA circular mode selected */
71.      AdcHandle.Init.Overrun               =ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten withthe last conversion result in case of overrun */
72.      AdcHandle.Init.OversamplingMode      = DISABLE;                       /* No oversampling */
73.  
74.      /* Initialize ADC peripheral according to the passedparameters */
75.      HAL_ADC_Init(&AdcHandle);
76.      if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
77.      {
78.         Red_LED_On();
79.      }
80.  
81.  
82.      /* ### - 2 - Start calibration############################################ */
83.      HAL_ADCEx_Calibration_Start(&AdcHandle,ADC_SINGLE_ENDED);
84.      if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) !=  HAL_OK)
85.      {
86.         Red_LED_On();
87.      }
88.  
89.      /* ### - 3 - Channel configuration######################################## */
90.      sConfig.Channel      =ADCx_CHANNEL;                /* Sampled channel number */
91.      sConfig.Rank        = ADC_REGULAR_RANK_1;          /* Rank of sampled channel numberADCx_CHANNEL */
92.      sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;    /* Sampling time (number of clock cycles unit) */
93.      sConfig.SingleDiff   =ADC_SINGLE_ENDED;            /* Single-ended input channel */
94.      sConfig.OffsetNumber = ADC_OFFSET_NONE;             /* No offset subtraction */
95.      sConfig.Offset = 0;                                 /* Parameter discarded becauseoffset correction is disabled */
96.      HAL_ADC_ConfigChannel(&AdcHandle,&sConfig);
97.      if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
98.      {
99.         Green_LED_Toggle();
100.          }
101.      
102.          /* ### - 4 - Start conversion in DMA mode################################# */
103.          HAL_ADC_Start_DMA(&AdcHandle,&aResultDMA, 1);
104.          if (HAL_ADC_Start_DMA(&AdcHandle, &aResultDMA, 1) != HAL_OK)
105.          {
106.             Green_LED_Toggle();
107.          }
108.      
109.      
110.     }



adc.c  文件内容:
1.    #include "main.h"
2.     
3.    /** @addtogroupSTM32L4xx_HAL_Examples
4.      * @{
5.      */
6.     
7.    /** @defgroup ADC_DMA_Transfer
8.      * @{
9.      */
10.   
11.  /* Private typedef-----------------------------------------------------------*/
12.  /* Private define------------------------------------------------------------*/
13.  /* Private macro -------------------------------------------------------------*/
14.  /* Private variables---------------------------------------------------------*/
15.  /* Private function prototypes-----------------------------------------------*/
16.  /* Private functions---------------------------------------------------------*/
17.   
18.  /** @defgroup HAL_MSP_Private_Functions
19.    * @{
20.    */
21.   
22.  /**
23.  * @brief  ADC MSP Init
24.  * @param  hadc : ADC handle
25.  * @retval None
26.  */
27.  void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
28.  {
29.    GPIO_InitTypeDef          GPIO_InitStruct;
30.    staticDMA_HandleTypeDef         DmaHandle;
31.   
32.    /*##-1- Enable peripheralsand GPIO Clocks #################################*/
33.    /* ADC Periph clock enable*/
34.    ADCx_CLK_ENABLE();
35.    /* ADC Periph interface clockconfiguration */
36.    __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK);
37.    /* Enable DMA clock */
38.    DMAx_CHANNELx_CLK_ENABLE();
39.   
40.    __HAL_RCC_GPIOA_CLK_ENABLE();
41.   
42.    /*##- 2- Configureperipheral GPIO #########################################*/
43.    /* ADC Channel GPIO pinconfiguration */
44.    GPIO_InitStruct.Pin =ADCx_CHANNEL_PIN;
45.    GPIO_InitStruct.Mode =GPIO_MODE_ANALOG_ADC_CONTROL;
46.    GPIO_InitStruct.Pull =GPIO_NOPULL;
47.    HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT,&GPIO_InitStruct);
48.    /*##- 3- Configure DMA#####################################################*/
49.   
50.    /***********************Configure DMA parameters ***************************/
51.    DmaHandle.Instance                 = DMA1_Channel1;
52.    DmaHandle.Init.Request             = DMA_REQUEST_0;
53.    DmaHandle.Init.Direction           = DMA_PERIPH_TO_MEMORY;
54.    DmaHandle.Init.PeriphInc           = DMA_PINC_DISABLE;
55.    DmaHandle.Init.MemInc              = DMA_MINC_ENABLE;
56.    DmaHandle.Init.PeriphDataAlignment =DMA_PDATAALIGN_WORD;
57.    DmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
58.    DmaHandle.Init.Mode                = DMA_CIRCULAR;
59.    DmaHandle.Init.Priority            = DMA_PRIORITY_MEDIUM;
60.   
61.    /* Deinitialize  & Initialize the DMA for new transfer */
62.    HAL_DMA_DeInit(&DmaHandle);
63.    HAL_DMA_Init(&DmaHandle);
64.   
65.    /* Associate the DMA handle*/
66.    __HAL_LINKDMA(hadc,DMA_Handle, DmaHandle);
67.   
68.    /* NVIC configuration forDMA Input data interrupt */
69.    HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1,0);
70.    HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
71.  }
72.   
73.  /**
74.    * @brief ADC MSPDe-Initialization
75.    *        This function frees the hardwareresources used in this example:
76.    *          - Disable the Peripheral's clock
77.    *          - Revert GPIO to their default state
78.    * @param hadc: ADC handlepointer
79.    * @retval None
80.    */
81.  void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
82.  {
83.   
84.    /*##-1- Reset peripherals##################################################*/
85.    ADCx_FORCE_RESET();
86.    ADCx_RELEASE_RESET();
87.    /* ADC Periph clock disable
88.     (automatically reset allADC's) */
89.    __HAL_RCC_ADC_CLK_DISABLE();
90.   
91.    /*##-2- Disable peripheralsand GPIO Clocks ################################*/
92.    /* De-initialize the ADCChannel GPIO pin */
93.    HAL_GPIO_DeInit(ADCx_CHANNEL_GPIO_PORT,ADCx_CHANNEL_PIN);
94.  }
95.   
96.   
97.   
98.  /**
99.    * @brief  Initializes the Global MSP.
100.   * @param  None
101.   * @retval None
102.   */





微信6.png
收藏 评论7 发布时间:2018-9-5 17:00

举报

7个回答
wenyangzeng 回答时间:2018-9-5 17:52:47
这个b=(float)aResultDMA*3300/4069;
没有在while()循环里,ADC转换结果aResultDMA在循环里没有赋值给b变量。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

bbbone 回答时间:2018-9-5 18:38:36
本帖最后由 bbbone 于 2018-9-5 18:42 编辑
wenyangzeng 发表于 2018-9-5 17:52
这个b=(float)aResultDMA*3300/4069;
没有在while()循环里,ADC转换结果aResultDMA在循环里没有赋值给b变量 ...

怎么修改呢?我把 b=(float)aResultDMA*3300/4069;   放到while里,依然没起作用啊
老哥
bbbone 回答时间:2018-9-5 19:00:39
问题 出在第四步,main文件的102行 。 我在第四部后面加一个Green_LED_On,这个灯是不亮的。之前部分都会亮。

/* ### - 4 - Start conversion in DMA mode ################################# */
          HAL_ADC_Start_DMA(&AdcHandle, &aResultDMA, 1);
          if (HAL_ADC_Start_DMA(&AdcHandle, &aResultDMA, 1) != HAL_OK)
          {
                  Red_LED_On();
          }
          Green_LED_On();
wenyangzeng 回答时间:2018-9-5 20:03:59
bbbone 发表于 2018-9-5 18:38
怎么修改呢?我把 b=(float)aResultDMA*3300/4069;   放到while里,依然没起作用啊
老哥
...

楼主应该先确保读到ADC值,才能正确赋值给变量b。
ST官方代码应该多参考

ADC_DMA_Transfer.rar (58.13 KB, 下载次数: 6)
bbbone 回答时间:2018-9-5 20:18:46
wenyangzeng 发表于 2018-9-5 20:03
楼主应该先确保读到ADC值,才能正确赋值给变量b。
ST官方代码应该多参考

我也是从example上找的ADC,我感觉我跟例子里写的都一样。尴尬了
wenyangzeng 回答时间:2018-9-5 20:38:54
bbbone 发表于 2018-9-5 20:18
我也是从example上找的ADC,我感觉我跟例子里写的都一样。尴尬了

楼主可以直接运行ST演示代码,读取正确ADC值后再运行自己的代码试试。
feixiang20 回答时间:2018-9-5 23:25:00
你以为和例子一样,那么,你把例子来尝试看看,如果不行就简化代码再尝试

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版