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

实现基于STM32F7中周期采集

[复制链接]
STMCU小助手 发布时间:2023-3-13 22:32
实现了定时器加DMA的等周期采集。
adc.c:
  1. #include "adc.h"
  2. #include "delay.h"

  3. ADC_HandleTypeDef ADC1_Handler;//ADC句柄
  4. DMA_HandleTypeDef ADC1DMA_Handler;
  5. ADC_ChannelConfTypeDef ADC1_ChanConf;

  6. TIM_HandleTypeDef TIM2_Handler;
  7. TIM_OC_InitTypeDef TIM2_CH2Handler;
  8. uint16_t buffer[128];

  9. static void MX_TIM2_Init(void)
  10. {
  11.     __HAL_RCC_TIM2_CLK_ENABLE();
  12.        
  13.     HAL_NVIC_SetPriority(TIM2_IRQn, 1, 3);
  14.     HAL_NVIC_EnableIRQ(TIM2_IRQn);

  15.     TIM2_Handler.Instance = TIM2;
  16.     TIM2_Handler.Init.Prescaler = 10800;
  17.     TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
  18.     TIM2_Handler.Init.Period = 20000;
  19.     TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  20.     HAL_TIM_PWM_Init(&TIM2_Handler);


  21.     TIM2_CH2Handler.OCMode = TIM_OCMODE_PWM1;
  22.     TIM2_CH2Handler.Pulse = 10000;
  23.     TIM2_CH2Handler.OCPolarity = TIM_OCPOLARITY_HIGH;
  24.     TIM2_CH2Handler.OCFastMode = TIM_OCFAST_DISABLE;
  25.     HAL_TIM_PWM_ConfigChannel(&TIM2_Handler, &TIM2_CH2Handler, TIM_CHANNEL_2) ;


  26.     __HAL_TIM_ENABLE_IT(&TIM2_Handler, TIM_IT_UPDATE);
  27.     TIM_CCxChannelCmd(TIM2_Handler.Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
  28.     __HAL_TIM_ENABLE(&TIM2_Handler);
  29. }


  30. void TIM2_IRQHandler(void)
  31. {
  32.     HAL_TIM_IRQHandler(&TIM2_Handler);
  33. }


  34. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  35. {
  36.     if (htim == (&TIM2_Handler))
  37.     {
  38.         printf("timer irq\r\n");
  39.     }
  40. }


  41. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
  42. {
  43.     GPIO_InitTypeDef GPIO_InitStruct = {0};

  44.     __HAL_RCC_TIM2_CLK_ENABLE();
  45.     __HAL_RCC_GPIOA_CLK_ENABLE();
  46.     GPIO_InitStruct.Pin = GPIO_PIN_1;
  47.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  48.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  49.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  50.     GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
  51.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  52. }



  53. //初始化ADC
  54. //ch: ADC_channels
  55. //通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  56. void MY_ADC_Init(void)
  57. {
  58.     __HAL_RCC_DMA2_CLK_ENABLE();
  59.     HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
  60.     HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

  61.     ADC1DMA_Handler.Instance = DMA2_Stream0;
  62.     ADC1DMA_Handler.Init.Channel = DMA_CHANNEL_0;
  63.     ADC1DMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
  64.     ADC1DMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;               //外设非增量模式
  65.     ADC1DMA_Handler.Init.MemInc = DMA_MINC_ENABLE;                   //存储器增量模式
  66.     ADC1DMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;  //外设数据长度:16位
  67.     ADC1DMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //存储器数据长度:16位
  68.     ADC1DMA_Handler.Init.Mode = DMA_CIRCULAR;                          //传输一次就结束
  69.     ADC1DMA_Handler.Init.Priority = DMA_PRIORITY_LOW;             //中等优先级
  70.     ADC1DMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;            /* 禁止FIFO*/

  71.     HAL_DMA_Init(&ADC1DMA_Handler);

  72.     __HAL_LINKDMA(&ADC1_Handler, DMA_Handle, ADC1DMA_Handler);                //将DMA与ADC联系起来


  73.     ADC1_Handler.Instance = ADC1;
  74.     ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=108/4=27MHZ
  75.     ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;           //12位模式
  76.     ADC1_Handler.Init.ScanConvMode = ENABLE;                    //非扫描模式
  77.     ADC1_Handler.Init.ContinuousConvMode = DISABLE;              //关闭连续转换
  78.     ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;           //禁止不连续采样模式
  79.     ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; //使用软件触发
  80.     ADC1_Handler.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_CC2;     //软件触发
  81.     ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT;           //右对齐
  82.     ADC1_Handler.Init.NbrOfConversion = 2;                       //1个转换在规则序列中 也就是只转换规则序列1
  83.     ADC1_Handler.Init.DMAContinuousRequests = ENABLE;           //关闭DMA请求
  84.     ADC1_Handler.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  85.     HAL_ADC_Init(&ADC1_Handler);

  86.     ADC1_ChanConf.Channel = ADC_CHANNEL_5;                                 //通道
  87.     ADC1_ChanConf.Rank = 1;                                     //序列1
  88.     ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;      //采样时间
  89.     ADC1_ChanConf.Offset = 0;
  90.     HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);       //通道配置

  91.     ADC1_ChanConf.Channel = ADC_CHANNEL_6;                                 //通道
  92.     ADC1_ChanConf.Rank = 2;                                     //序列2
  93.     ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;      //采样时间
  94.     ADC1_ChanConf.Offset = 0;
  95.     HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);       //通道配置

  96.    
  97.     MX_TIM2_Init();
  98.                 HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)buffer, 128);
  99. }

  100. //ADC底层驱动,引脚配置,时钟使能
  101. //此函数会被HAL_ADC_Init()调用
  102. //hadc:ADC句柄
  103. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  104. {
  105.     GPIO_InitTypeDef GPIO_Initure;
  106.     __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
  107.     __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟

  108.     GPIO_Initure.Pin = GPIO_PIN_5 | GPIO_PIN_6;        //PA5
  109.     GPIO_Initure.Mode = GPIO_MODE_ANALOG;   //模拟
  110.     GPIO_Initure.Pull = GPIO_NOPULL;        //不带上下拉
  111.     HAL_GPIO_Init(GPIOA, &GPIO_Initure);
  112. }

  113. void DMA2_Stream0_IRQHandler(void)
  114. {
  115.     HAL_DMA_IRQHandler(&ADC1DMA_Handler);
  116. }

  117. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
  118. {
  119.     printf("DMA transfer complete\r\n");
  120. }
  121. void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
  122. {
  123.     printf("DMA Half transfer complete\r\n");
  124. }

  125. void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
  126. {
  127.     printf("DMA transfer error\r\n");
  128. }
复制代码

main.c:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"

  4. #include "adc.h"

  5. extern uint16_t buffer[128];

  6. void show()
  7. {
  8.     int i;
  9.     printf("\r\ndata:");
  10.     for (i = 0; i < 128; i++)
  11.     {
  12.         if (i % 16 == 0) printf("\r\n");
  13.         printf("%6d", buffer[i]);
  14.                         //buffer[i]=0;

  15.     }
  16.     printf("\r\n");
  17. }


  18. int main(void)
  19. {
  20.     //Cache_Enable();                 //打开L1-Cache
  21.     HAL_Init();                     //初始化HAL库
  22.     Stm32_Clock_Init(432, 8, 2, 9); //设置时钟,216Mhz
  23.     delay_init(216);                //延时初始化
  24.     uart_init(115200);              //串口初始化

  25.     printf("\r\n\r\n\r\n---------------------------------------\r\nstart\r\n");
  26.     MY_ADC_Init();                  //初始化ADC1通道5
  27.    
  28.     while (1)
  29.     {
  30.         show();
  31.                                 //printf("cnt:%d\r\n",TIM2->CNT);
  32.         delay_ms(1000);
  33.     }
  34. }

复制代码

因为定时器是2s采集一次,主函数是1s打印一次,所以显示结果如下:

20200421195242686.png

————————————————
版权声明:小盼你最萌哒
如有侵权请联系删除


收藏 评论0 发布时间:2023-3-13 22:32

举报

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