STM32之ADC单通道单次例程
#include "stm32f10x.h"
/* RCC時(shí)鐘配置 */
void RCC_config(void)
{
?ErrorStatus HSEStartUpStatus;
?/* RCC寄存器設(shè)置為默認(rèn)配置 */
?RCC_DeInit();
?/* 打開(kāi)外部高速時(shí)鐘 */
?RCC_HSEConfig(RCC_HSE_ON);
?/* 等待外部高速時(shí)鐘穩(wěn)定 */
?HSEStartUpStatus = RCC_WaitForHSEStartUp();
?if(HSEStartUpStatus == SUCCESS)
?{
??/* 設(shè)置HCLK = SYSCLK */
??RCC_HCLKConfig(RCC_SYSCLK_Div1);
??/* 設(shè)置PCLK2 = HCLK */
??RCC_PCLK2Config(RCC_HCLK_Div1);
??/* 設(shè)置PCLK1 = HCLK / 2 */
??RCC_PCLK1Config(RCC_HCLK_Div2);
//??/* 設(shè)置FLASH代碼延時(shí) */
//??FLASH_SetLatency(FLASH_Latency_2);
//??/* 使能預(yù)取址緩存 */
//??FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
??/* 設(shè)置PLL時(shí)鐘源為HSE倍頻9 72MHz */
??RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
??/* 使能PLL */
??RCC_PLLCmd(ENABLE);
??/* 等待PLL穩(wěn)定 */
??while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
??/* 設(shè)置PLL為系統(tǒng)時(shí)鐘源 */
??RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
??/* 等待系統(tǒng)時(shí)鐘源切換到PLL */
??while(RCC_GetSYSCLKSource() != 0x08);
?}
}
/* 毫秒延時(shí)函數(shù) */
void delay_ms(uint16_t time)
{???
?uint16_t i = 0;?
?while(time--)
?{
??i = 12000;
??while(i--);???
?}
}
/* GPIO配置 */
void GPIO_config(void)
{
?GPIO_InitTypeDef GPIO_InitStructure;
?/* 時(shí)鐘配置 */
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
?/* 模擬輸入 */
?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
?GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/* ADC配置 */
void ADC_config(void)
{
?ADC_InitTypeDef ADC_InitStructure;
?/* 使能時(shí)鐘 */
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
?
?/* 配置ADC時(shí)鐘12MHz */
?RCC_ADCCLKConfig(RCC_PCLK2_Div6);
?
?ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;?????/* 獨(dú)立模式 */
?ADC_InitStructure.ADC_ScanConvMode = DISABLE;??????/* 單通道模式 */
?ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;?????/* 單次轉(zhuǎn)換模式 */
?ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;?/* 軟件觸發(fā) */
?ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;????/* 數(shù)據(jù)右對(duì)齊 */
?ADC_InitStructure.ADC_NbrOfChannel = 1;????????/* 1個(gè)通道 */
?ADC_Init(ADC1, &ADC_InitStructure);
?
?/* 模擬通道0、采樣序列1、采樣周期55.5 */
?ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
?
?/* 使能ADC */
?ADC_Cmd(ADC1, ENABLE);
?
?/* 重置校準(zhǔn)寄存器 */
?ADC_ResetCalibration(ADC1);
?while(ADC_GetResetCalibrationStatus(ADC1));
?
?/* 開(kāi)始校準(zhǔn) */
?ADC_StartCalibration(ADC1);
?while(ADC_GetCalibrationStatus(ADC1));
}
/* 主函數(shù) */
int main(void)
{
?uint32_t value;
?volatile float V;
?
?/* RCC時(shí)鐘配置 */
?RCC_config();
?/* IO配置 */
?GPIO_config();
?
?/* ADC配置 */
?ADC_config();
?
?while(1)
?{
??/* 啟動(dòng)轉(zhuǎn)換 */
??ADC_SoftwareStartConvCmd(ADC1, ENABLE);
??/* 等待轉(zhuǎn)換結(jié)束 */
??while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
??
??/* 獲取轉(zhuǎn)換值 */
??value = ADC_GetConversionValue(ADC1);
??
??/* 將數(shù)字量轉(zhuǎn)換為電壓值 */
??V = (float)value / 4096 * 3.3;
??
??delay_ms(1000);
?}
}
總結(jié)
以上是生活随笔為你收集整理的STM32之ADC单通道单次例程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 储能元件
- 下一篇: LwIP之ICMP协议