- /******************** (C) COPYRIGHT 2011 野火嵌入式開發工作室 ********************
- * 文件名 :tempad.c
- * 描述 :DMA方式讀取ADC值應用函數庫
- * 實驗平臺:野火STM32開發板
- * 硬件連接:無 (溫度傳感器在內部和ADCx_IN16輸入通道相連接)
- *
- * 庫版本 :ST3.5.0
- *
- * 作者 :wildfire team
- **********************************************************************************/
- #include"tempad.h"
- //ADC1_BASE地址:0x4000 0000+0x2400 即ADC1的基地址,而她的規則數據寄存器的偏移地址是:0x4c
- #define ADC1_DR_Address ((u32)0x4001244C)
- __IO u16 ADC_ConvertedValue;
- //__IO u16 ADC_ConvertedValueLocal;
- /*
- * 函數名:ADC1_GPIO_Config
- * 描述 :使能ADC1和DMA1的時鐘
- * 輸入 :無
- * 輸出 :無
- * 調用 :內部調用
- */
- static void ADC1_GPIO_Config(void)
- {
- /* Enable DMA clock */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- /* Enable ADC1 and GPIOC clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- }
- /* 函數名:ADC1_Mode_Config
- * 描述 :配置ADC1的工作模式為MDA模式
- * 輸入 : 無
- * 輸出 :無
- * 調用 :內部調用
- */
- static void ADC1_Mode_Config(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- /* DMA channel1 configuration */
-
- DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外設基地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // AD轉換值所存放的內存基地址 (就是給個地址)
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 外設作為數據傳輸的來源
- DMA_InitStructure.DMA_BufferSize = 1; // 定義指定DMA通道 DMA緩存的大小
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外設地址寄存器不變
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 內存地址寄存器不變
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 數據寬度為16位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // HalfWord
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循環模式下
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高優先級
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //沒有設置為內存到內存的傳輸
- DMA_Init(DMA1_Channel1, &DMA_InitStructure);
-
- /* Enable DMA channel1 */
- DMA_Cmd(DMA1_Channel1, ENABLE); //ENABLE她
- /* ADC1 configuration */
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨立工作模式
- ADC_InitStructure.ADC_ScanConvMode = ENABLE; //多通道
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //連續轉換
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //由軟件觸發啟動
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //Right
- ADC_InitStructure.ADC_NbrOfChannel = 1; //僅一個通道轉換
- ADC_Init(ADC1, &ADC_InitStructure);
- /*配置ADC時鐘,為PCLK2的8分頻,即9Hz*/
- RCC_ADCCLKConfig(RCC_PCLK2_Div8);
- /* ADC1 regular channel16 configuration */
- //設置采樣通道IN16, 設置采樣時間
- ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
- //使能溫度傳感器和內部參考電壓
- ADC_TempSensorVrefintCmd(ENABLE);
- /* Enable ADC1 DMA */
- ADC_DMACmd(ADC1, ENABLE);
-
- /* Enable ADC1 */
- ADC_Cmd(ADC1, ENABLE);
- /* Enable ADC1 reset calibaration register */
- ADC_ResetCalibration(ADC1);
- /* Check the end of ADC1 reset calibration register */
- while(ADC_GetResetCalibrationStatus(ADC1));
- /* Start ADC1 calibaration */
- ADC_StartCalibration(ADC1);
- /* Check the end of ADC1 calibration */
- while(ADC_GetCalibrationStatus(ADC1));
-
- /* Start ADC1 Software Conversion */
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- }
- /*
- * 函數名:Temp_ADC1_Init
- * 描述 :無
- * 輸入 :無
- * 輸出 :無
- * 調用 :外部調用
- */
- void Temp_ADC1_Init(void)
- {
- ADC1_GPIO_Config();
- ADC1_Mode_Config();
- }
復制代碼
|