日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32f429vref怎么接_STM32如何通过内部VREF得到实际的VDDA值

發(fā)布時間:2025/3/12 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32f429vref怎么接_STM32如何通过内部VREF得到实际的VDDA值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

/****************************************************/

// 程序用途:用來測試通過內(nèi)部基準電壓計算外部VDDA的值

// 程序作者:孟瑞生

// 微信公眾號:科技老頑童

/****************************************************/

#include "stm32f0xx.h"

#include "stdio.h"

__IO uint16_t VREFINT_CAL;

__IO uint16_t VREFINT_DATA;

__IO float VDDA_VAL;

// 下面三個延時函數(shù),是用示波器試出來的,非精確延時(48MHz)

void delay_1us(void)

{

volatile uint16_t i=1;

while(i--);

}

void delay_us(uint16_t us)

{

while(us--)

{

delay_1us();

}

}

void delay_ms(uint16_t ms)

{

while(ms--)

{

delay_us(995);

}

}

/**

* @brief??ADC Configuration

* @param??None

* @retval None

*/

static void ADC_Config(void)

{

ADC_InitTypeDef? ???ADC_InitStructure;

GPIO_InitTypeDef? ? GPIO_InitStructure;

/* GPIOC Periph clock enable */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

/* ADC1 Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* Configure ADC Channel 0 as analog input */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* ADCs DeInit */

ADC_DeInit(ADC1);

/* Initialize ADC structure */

ADC_StructInit(&ADC_InitStructure);

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_Init(ADC1, &ADC_InitStructure);

/* Convert the ADC1 Channel 0 with 239.5 Cycles as sampling time */

ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_239_5Cycles);

ADC_VrefintCmd(ENABLE);

/* 得到基準電壓校準值 */

VREFINT_CAL = *(__IO uint16_t *)(0X1FFFF7BA);

/* ADC Calibration */

ADC_GetCalibrationFactor(ADC1);

/* Enable the ADC peripheral */

ADC_Cmd(ADC1, ENABLE);

/* Wait the ADRDY flag */

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));

/* ADC1 regular Software Start Conv */

ADC_StartOfConversion(ADC1);

}

/**

* @brief??UART1 Configuration

* @param??None

* @retval None

*/

void UART1_Init()

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef USART_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

/* Enable USART1 Clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/* USART1 Pins configuration ************************************************/

/* Connect pin to Periph */

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

/* Configure pins as AF pushpull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 IRQ Channel configuration */

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* USART1??configured as follow:

- BaudRate = 9600 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

*/

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

/* Enable the USART1 */

USART_Cmd(USART1, ENABLE);

}

int fputc(int ch, FILE *f)

{

/* Place your implementation of fputc here */

/* e.g. write a character to the USART */

USART_SendData(USART1, (uint8_t) ch);

/* Loop until transmit data register is empty */

while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

return ch;

}

// 主函數(shù)

int main(void)

{

delay_ms(200);

ADC_Config();

UART1_Init();

while(1)

{

VREFINT_DATA =ADC_GetConversionValue(ADC1);

VDDA_VAL = (3.3*VREFINT_CAL)/VREFINT_DATA;

printf("\n\rVDDA:%.3fV\n\r",VDDA_VAL);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

delay_ms(1000);

}

}

總結(jié)

以上是生活随笔為你收集整理的stm32f429vref怎么接_STM32如何通过内部VREF得到实际的VDDA值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。