问答

汇集网友智慧,解决技术难题

21ic问答首页 - 求一个MM32SPIN0230的ADC采集例程

求一个MM32SPIN0230的ADC采集例程

MM9572342024-04-27
回答 +关注 19
5335人浏览 13人回答问题 分享 举报
13 个回答
  • 话说官方没有提供相关例程?
  • 论坛上很多分享贴,自己看看吧。
  • 你试试这个
    1. #include "mm32.h"

    2. #define ADC_CHANNEL 0
    3. #define ADC_SAMPLE_COUNT 10

    4. uint16_t adc_data[ADC_SAMPLE_COUNT];

    5. void ADC_DMA_Init()
    6. {
    7.     // 初始化ADC
    8.     ADC_InitTypeDef ADC_InitStruct;
    9.     ADC_InitStruct.ADC_Mode = ADC_Mode_Continue;
    10.     ADC_InitStruct.ADC_ScanMode = DISABLE;
    11.     ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    12.     ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
    13.     ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    14.     ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    15.     ADC_InitStruct.ADC_NbrOfChannel = 1;
    16.     ADC_Init(ADC1, &ADC_InitStruct);

    17.     // 配置ADC通道
    18.     ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_Samctl_239_5);

    19.     // 初始化DMA
    20.     DMA_InitTypeDef DMA_InitStruct;
    21.     DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
    22.     DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)adc_data;
    23.     DMA_InitStruct.DMA_Direction = DMA_DIR_PeripheralSRC;
    24.     DMA_InitStruct.DMA_BufferSize = ADC_SAMPLE_COUNT;
    25.     DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    26.     DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    27.     DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    28.     DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    29.     DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
    30.     DMA_InitStruct.DMA_Priority = DMA_Priority_High;
    31.     DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
    32.     DMA_Init(DMA1_Channel1, &DMA_InitStruct);

    33.     // 启动DMA
    34.     DMA_Cmd(DMA1_Channel1, ENABLE);

    35.     // 启动ADC
    36.     ADC_Cmd(ADC1, ENABLE);
    37.     ADC_DMACmd(ADC1, ENABLE);
    38. }

    39. int main()
    40. {
    41.     // 初始化系统时钟等

    42.     // 初始化ADC和DMA
    43.     ADC_DMA_Init();

    44.     while (1)
    45.     {
    46.         // 等待DMA传输完成
    47.         while (!DMA_GetFlagStatus(DMA1_FLAG_TC1))
    48.         {
    49.         }

    50.         // 数据处理
    51.         for (int i = 0; i < ADC_SAMPLE_COUNT; i++)
    52.         {
    53.             // 处理adc_data[i]
    54.         }

    55.         // 清除DMA传输完成标志
    56.         DMA_ClearFlag(DMA1_FLAG_TC1);
    57.     }
    58. }
    但需要自己改哈,肯定不能直接编译通过的,可以参考一下思路
  • 能编译通过的,ADC DMA采集即可,谢谢
12

您需要登录后才可以回复 登录 | 注册