打印
[N32L4xx]

N32L406的ADC内部参考电压(2.048V)在软件中如何使用?

[复制链接]
741|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhitao2072|  楼主 | 2022-3-31 23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了用户手册PWR和ADC部分,始终没有找到相关的寄存器,熟悉的请指导一下,谢谢。

使用特权

评论回复
沙发
zhitao2072|  楼主 | 2022-4-7 14:29 | 只看该作者
本帖最后由 zhitao2072 于 2022-4-7 14:30 编辑

问题已解决,国产芯片的资料写的不清楚,哎,一个寄存器配的问题,浪费了三天时间,关键是这个寄存器配置位在用户手册里面找不到,只有找技术支持才给你说,要找到技术支持还需要找个公司去国民技术备案,还要有营业执照,真是无语。。。要感谢21IC电子网,在另一个帖子里面问出来了。。。

使用特权

评论回复
板凳
zhitao2072|  楼主 | 2022-4-7 14:37 | 只看该作者
GPIO_InitType GPIO_InitStructure;
        ADC_InitType ADC_InitStructure;
        DMA_InitType DMA_InitStructure;
        __IO uint16_t ADCConvertedValue[3];
    /* System clocks configuration ---------------------------------------------*/
    RCC_Configuration();

        GPIO_InitStruct(&GPIO_InitStructure);
    /* Configure PC0 PC1 as analog input -------------------------*/
    GPIO_InitStructure.Pin       = GPIO_PIN_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
    /* DMA channel1 configuration ----------------------------------------------*/
    DMA_DeInit(DMA_CH1);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 3;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA_CH1, &DMA_InitStructure);
        DMA_RequestRemap(DMA_REMAP_ADC1, DMA, DMA_CH1, ENABLE);
               
    /* Enable DMA channel1 */
    DMA_EnableChannel(DMA_CH1, ENABLE);

    /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 3;
    ADC_Init(ADC, &ADC_InitStructure);
        /* ADC1 enable temperature  */
        ADC_EnableTempSensorVrefint( ENABLE);
               
    /* ADC1 regular channel17 configuration */
        ADC_ConfigRegularChannel(ADC, ADC_CH_1_PA0, 1, ADC_SAMP_TIME_239CYCLES5);
    ADC_ConfigRegularChannel(ADC, ADC_CH_17,    2, ADC_SAMP_TIME_239CYCLES5);
        ADC_ConfigRegularChannel(ADC, ADC_CH_18,    3, ADC_SAMP_TIME_239CYCLES5);
    /* Enable ADC DMA */
    ADC_EnableDMA(ADC, ENABLE);
       
        (*((uint32_t*)(0x40001800+0x24))) |= 2<<19;//用户手册中找不到的配置位
    /* Enable ADC */
    ADC_Enable(ADC, ENABLE);
    /* Check ADC Ready */
    while(ADC_GetFlagStatusNew(ADC,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADC1 calibration */
    ADC_StartCalibration(ADC);
    /* Check the end of ADC1 calibration */
    while (ADC_GetCalibrationStatus(ADC))
        ;

    /* Start ADC1 Software Conversion */
    ADC_EnableSoftwareStartConv(ADC, ENABLE);
               
    /* Config Uart1 as Temperature output */
    USART_Config();
    while (1)
    {
        /* */   
        Delay(5000000);
                printf("ADCConvertedValue[0] = %x\r\n",ADCConvertedValue[0]);
                Delay(5000000);
                TempValue = TempCal(ADCConvertedValue[1]);
        printf("Temperature = %.3f C\r\n",TempValue);
                Delay(5000000);
                printf("ADCConvertedValue[2] = %x\r\n",ADCConvertedValue[2]);
    }

使用特权

评论回复
地板
zhitao2072|  楼主 | 2022-4-7 14:40 | 只看该作者
ADC_CH_17是mcu内部温度传感器通道,ADC_CH_18是mcu内部参考电源(2.048V)的采集通道,如果不配置(*((uint32_t*)(0x40001800+0x24))) |= 2<<19;这个位,ADCConvertedValue[2]的结果一直是0。

使用特权

评论回复
5
JeanJean| | 2022-4-8 06:37 | 只看该作者
zhitao2072 发表于 2022-4-7 14:29
问题已解决,国产芯片的资料写的不清楚,哎,一个寄存器配的问题,浪费了三天时间,关键是这个寄存器配置位 ...

感谢你的意见, 相关问题小版们都有记录,后续资料更新逐一完善!

使用特权

评论回复
6
Q1n| | 2022-9-8 12:41 | 只看该作者
zhitao2072 发表于 2022-4-7 14:40
ADC_CH_17是mcu内部温度传感器通道,ADC_CH_18是mcu内部参考电源(2.048V)的采集通道,如果不配置(*((uint ...

官方 FAQ 给出的是  (*((uint32_t*)(0x40001800+0x24))) |= 3 << 19; 不是2 << 19。我实际试了一下,应该是3 << 19 才是对的

使用特权

评论回复
7
zhitao2072|  楼主 | 2022-9-8 16:35 | 只看该作者
Q1n 发表于 2022-9-8 12:41
官方 FAQ 给出的是  (*((uint32_t*)(0x40001800+0x24))) |= 3

3表示2bit,一般一个bit就可以控制了,两个bit应是打开另一个不知名的东西了吧?2 我也试过,可以呀。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

447

帖子

2

粉丝