このコード機能が達成すべきである:取得した電圧値、単一のシングルチャンネルサンプリングADCレオスタット取得の割り込みやDMAモードを使用!
(私がリストされていないので、それが直接電圧変換機能のために必要とされていないので、関数変換に彼らの必要性に応じて、インターネット上で見つけることができます。)
ツリーコードの構造:
| ---- ADC_GPIO_Config(空)
(空)ADC_Config | ---- ADC_Mode_Config(無効)
| _______(無効)ADC_NVIC_Config / ADC_DMA_Config(無効)
ADC_GPIO_Config:
空 ADC_GPIO_Config(無効) { // 初期化PA2ピン GPIO_InitTypeDef GPIO_InitStruct。 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA、ENABLE)。 GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN。 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN。 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL。 GPIO_Init(ADC_GPIO_PORT、 &GPIO_InitStruct)。 }
ADC_Mode_Config:
空 ADC_Mode_Config(無効) { ADC_InitTypeDef ADC_InitStruct; RCC_HSICmd(ENABLE); // HSIが提供するHSIクロック、非常に重要な、stm32l151クロック開く しばらく(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESETを)。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1は、ENABLE); // ADCクロックをオン ADC_DeInit(ADC1)。 ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b。 ADC_InitStruct.ADC_ScanConvMode = DISABLE; // スキャンモードは使用しない ; = ENABLE ADC_InitStruct.ADC_ContinuousConvModeを//は連続変換可能 ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Noneを; //は提供せずに、外部トリガを使用していない ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Rightを; // 右揃え ADC_InitStruct = ADC_Channel_1 .ADC_NbrOfConversion; // 。使用されるチャネルの数1 = ADC_Init(ADC1、&ADC_InitStruct)。 ADC_RegularChannelConfig(ADC1、ADC_Channel_2、1。、ADC_SampleTime_4Cycles); // 構成ADCサンプリング順序およびチャンネル切り替え時間 の#if ADC_DMA_ENABLE ADC_DMARequestAfterLastTransferCmd(ADC1、ENABLE); // DMAの開放位置ADC_CR2 DDSが自動的に後に起動完了 ADC_DMACmdを(ADC1 、ENABLE); // DMA開く #ELSE ADC_ITConfig(ADC1、ADC_IT_EOC、イネーブル); // 割り込みレギュラーチャンネル変換完了を有効 #ENDIF ADC_Cmd(ADC1、ENABLE)。 一方、(ADC_GetFlagStatus(ADC1、ADC_FLAG_ADONS)== RESET); // ADC開始完了を待つ ADC_SoftwareStartConv(ADC1)。 }
ADC_NVIC_Config:
空 ADC_NVIC_Config(無効) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 設定優先 NVIC_InitStruct.NVIC_IRQChannel = ADC1_IRQn; // 選択割り込み要因 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1。 ; // 先取優先 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1。 ; // 子の優先順位 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 割り込みオープンマスター NVIC_Init(&NVIC_InitStruct); // 初期化構造 }
ADC_DMA_Config:
空 ADC_DMA_Config(無効) { DMA_InitTypeDef DMA_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1、ENABLE)。 DMA_DeInit(DMA1_Channel1); // DMAリセット DMA_InitStruct.DMA_PeripheralBaseAddr = ADC_DR_ADDRESSを; // 周辺アドレス DMA_InitStruct.DMA_MemoryBaseAddr =((のuint32_t)&Adc_Data); // メモリアドレス DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // ADCデータが送信 DMA_InitStruct.DMA_BufferSize = 1 ; // データの送信数 DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // シリアルデータは、唯一の登録、無インクリメント = DMA_MemoryInc_Disable DMA_InitStruct.DMA_MemoryInc; // メモリアドレスがインクリメントしない DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 周辺データ幅:ハーフワードD DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // メモリデータ転送幅 DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // サイクル送信 DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 優先順位が高い DMA_InitStruct.DMA_M2M = DMA_M2M_Disable。 DMA_Init(ADC_DMA_CHANNEL、&DMA_InitStruct); // DMAチャネルADCのADC1チャネルを使用して1。 DMA_Cmd(ADC_DMA_CHANNEL、ENABLE)。 }
注:私は与えた割り込みとDMAのコードは、自分のニーズに合わせてお選び。