跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. 重新启动后adc采样概率性所有值为0,请问怎么解决

重新启动后adc采样概率性所有值为0,请问怎么解决

已定时 已固定 已锁定 已移动 YT SDK
5 帖子 2 发布者 140 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • ethanE 离线
    ethanE 离线
    ethan
    写于 最后由 编辑
    #1

    因为同时采样了芯片内部的温度adc,理论上不能所有adc的值都是0,请帮忙看看
    代码如下:
    typedef struct
    {
    // ADC_data ADC_Channel; //ADC²ÉÑùͨµÀ-Ó¦ÓÃ
    volatile unsigned char ADC_SamplingChannel; // ADC²ÉÑùͨµÀ
    volatile unsigned char ADC_CurrentSamplingChannel; // ADC²ÉÑùͨµÀ
    volatile unsigned short ADC_ConversionBuff[ADCALLCHANNEL_DEPTH]; // ADC²ÉÑùÊý¾Ý»º´æ
    volatile unsigned int ADC_ConversionCount; // ADCͨµÀÇл»ÑÓʱ¼ÇÊý
    volatile unsigned char ADC_ConversionFlag; // ADCµ¥Í¨µÀ¶à´Î²ÉÑùÍê³É±êʶ
    } ADC_Control;
    ADC_Control ADC0_Control;
    const adc_converter_config_t adcInitConfig = {
    .clockDivider = 0U,
    .startTime = 64,//0x20,
    .sampleTime = 10,//0xFF,//0x2C,
    .overrunMode = false,
    .autoOffEnable = false,
    .waitEnable = false,
    .trigger = ADC_TRIGGER_HARDWARE,
    .align = ADC_ALIGN_RIGHT,
    .resolution = ADC_RESOLUTION_12BIT, //²ÉÑùʱ¼ä=£¨ADC_RESOLUTION_12BIT+2+sampleTime)*²ÉÑùʱÖÓÖÜÆÚ
    .dmaWaterMark = ADC_SEQUENCE_LENGTH - 1,
    .dmaEnable = true,
    .compareConfig = {
    .compareEnable = false,
    .compareAllChannelEnable = false,
    .compHigh = 0x00U,
    .compLow = 0x00U,
    .compIntEnable = false
    },
    .sequenceConfig = {
    .channels = {
    ADC_INPUTCHAN_EXT9,
    ADC_INPUTCHAN_EXT3,
    ADC_INPUTCHAN_EXT1,
    ADC_INPUTCHAN_EXT0,
    0x10, //MCU ÄÚÖÃζȲɼ¯
    // ADC_INPUTCHAN_EXT9,
    // ADC_INPUTCHAN_EXT3,
    // ADC_INPUTCHAN_EXT1,
    // ADC_INPUTCHAN_EXT0,

                              },
                              .totalChannels = ADC_SEQUENCE_LENGTH,
                              .sequenceMode = ADC_CONV_LOOP,
                              .sequenceIntEnable = false,
                              .convIntEnable = false
                          }
    

    };
    const dma_transfer_config_t adcTransferConfig = {
    .srcAddr = (uint32_t)&ADC0->FIFO,
    .destAddr = (uint32_t)&ADC0_Control.ADC_ConversionBuff,//g_adc_result[0U],
    .destOffset = 0x02U,
    .srcOffset = 0x00U,
    .srcTransferSize = DMA_TRANSFER_SIZE_2B,
    .destTransferSize = DMA_TRANSFER_SIZE_2B,
    .srcModulo = DMA_MODULO_OFF,
    .destModulo = DMA_MODULO_OFF,
    .transferLoopByteCount = (ADC_SEQUENCE_LENGTH * 2),
    .loopTransferConfig = &adcLoopTransferConfig,
    .destLastAddrAdjust = -(ADC_SEQUENCE_LENGTH * 2),
    .interruptEnable = false//true//false
    };

    /* Initialize adc instance */
    status |= ADCJqr_Init();
    

    status_t ADCJqr_Init(void)
    {
    status_t status = STATUS_SUCCESS;
    ADC_DRV_ConfigConverter(ADC_INST, &adcInitConfig);

    /* Initialize DMA module & channels */
    status |= DMA_DRV_Init(&dmaController_State,
        &dmaControllerInitConfig,
        dmaChnStateArray,
        dmaChnConfigArray,
        DMA_CONFIGURED_CHANNELS_COUNT);
    /* Initiate DMA Loop Transfer */
    status |= DMA_DRV_ConfigLoopTransfer(dmaControllerChn0InitConfig.virtChnConfig, &adcTransferConfig);
    status |= DMA_DRV_StartChannel(DMA_CHN0_NUMBER);
    // Enable temperature sensor
    ADC0->CTRL |= 0x1 << ADC_CTRL_TSEN_SHIFT;
    // ADC_DRV_ConfigConverter(ADC_INST, &adcInitConfig);
    ADC_DRV_Start(ADC_INST);
    return status;
    

    }

    1 条回复 最后回复
    0
    • ethanE 离线
      ethanE 离线
      ethan
      写于 最后由 编辑
      #2

      重启后有部分概率发现包括mcu内置温度的adc以及其他所有adc通道数值为0,请问怎么调试和定位问题

      1 条回复 最后回复
      0
      • DigaD 离线
        DigaD 离线
        Diga
        写于 最后由 编辑
        #3

        .destAddr = (uint32_t)&ADC0_Control.ADC_ConversionBuff,//g_adc_result[0U],
        这个是不是有点问题?ADC0_Control.ADC_ConversionBuff 已经是指针了,又对指针进行取址。
        另外如果要调试的话,可以把ADC->FIFO 的高16bit也拿出来,里面显示了当前ADC转换结果的通道号,即DMA 一次搬运4个bytes

        1 条回复 最后回复
        0
        • ethanE 离线
          ethanE 离线
          ethan
          写于 最后由 编辑
          #4

          Diga 改过了这个以后,也是一样的问题。
          详细描述一下,漏了一个提示,就是application单独这样运行没问题,从bootloader跳转到application以后,applicaiton里面的adc概率性不工作,bootloader程序没有对adc和dma进行任何操作

          1 条回复 最后回复
          0
          • DigaD 离线
            DigaD 离线
            Diga
            写于 最后由 编辑
            #5

            你可以把ADC->FIFO 的高16bit拿出来,check通道号有没有问题。
            ADC只要使能了,触发一下就会工作,你可以check一下ADC的功能时钟是不是受到影响

            1 条回复 最后回复
            0

          • 云途论坛规则/Yuntu Forum Rules

            发帖前请查看

          • YCT离线License申请流程

            帮助没办法联网的电脑使用YCT

          • YT CONFIG TOOL调查问卷

            帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

          • demo
            12
            can
            9
            lin stack
            6
            yt-link
            5
            vscode
            3
            adc模块
            2
            i2c
            2
            uuid
            2
            Online Users
            • 登录

            • 登录或注册以进行搜索。
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 最新
            • 标签
            • 热门