diff --git a/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h b/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h index 31f1dd2..55b9574 100644 --- a/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h +++ b/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h @@ -56,7 +56,7 @@ /*#define HAL_CORTEX_MODULE_ENABLED */ /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_DMA_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED /*#define HAL_ETH_MODULE_ENABLED */ /*#define HAL_FLASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED diff --git a/cube/output/ttt2/Inc/stm32f1xx_it.h b/cube/output/ttt2/Inc/stm32f1xx_it.h index 616d284..6023c5b 100644 --- a/cube/output/ttt2/Inc/stm32f1xx_it.h +++ b/cube/output/ttt2/Inc/stm32f1xx_it.h @@ -56,6 +56,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void EXTI3_IRQHandler(void); void EXTI4_IRQHandler(void); +void DMA1_Channel1_IRQHandler(void); void EXTI9_5_IRQHandler(void); #ifdef __cplusplus diff --git a/cube/output/ttt2/Src/main.c b/cube/output/ttt2/Src/main.c index 75ccf74..1adaa08 100644 --- a/cube/output/ttt2/Src/main.c +++ b/cube/output/ttt2/Src/main.c @@ -39,6 +39,7 @@ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; +DMA_HandleTypeDef hdma_adc1; SPI_HandleTypeDef hspi1; @@ -53,6 +54,7 @@ TIM_HandleTypeDef htim1; void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); +static void MX_DMA_Init(void); static void MX_ADC1_Init(void); static void MX_SPI1_Init(void); static void MX_TIM1_Init(void); @@ -86,6 +88,7 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_ADC1_Init(); MX_SPI1_Init(); MX_TIM1_Init(); @@ -163,7 +166,7 @@ static void MX_ADC1_Init(void) */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; @@ -259,7 +262,7 @@ static void MX_TIM1_Init(void) } sConfigOC.OCMode = TIM_OCMODE_TOGGLE; - sConfigOC.Pulse = 10000; + sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; @@ -274,6 +277,21 @@ static void MX_TIM1_Init(void) } +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + +} + /** Configure pins as * Analog * Input diff --git a/cube/output/ttt2/Src/stm32f1xx_hal_msp.c b/cube/output/ttt2/Src/stm32f1xx_hal_msp.c index 79c7c37..ad7f27a 100644 --- a/cube/output/ttt2/Src/stm32f1xx_hal_msp.c +++ b/cube/output/ttt2/Src/stm32f1xx_hal_msp.c @@ -34,6 +34,8 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" +extern DMA_HandleTypeDef hdma_adc1; + extern void Error_Handler(void); /* USER CODE BEGIN 0 */ @@ -96,6 +98,23 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* Peripheral DMA init*/ + + hdma_adc1.Instance = DMA1_Channel1; + hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; + hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + hdma_adc1.Init.Mode = DMA_NORMAL; + hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1); + /* USER CODE BEGIN ADC1_MspInit 1 */ /* USER CODE END ADC1_MspInit 1 */ @@ -119,6 +138,8 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0); + /* Peripheral DMA DeInit*/ + HAL_DMA_DeInit(hadc->DMA_Handle); } /* USER CODE BEGIN ADC1_MspDeInit 1 */ diff --git a/cube/output/ttt2/Src/stm32f1xx_it.c b/cube/output/ttt2/Src/stm32f1xx_it.c index 2d8315c..cd34927 100644 --- a/cube/output/ttt2/Src/stm32f1xx_it.c +++ b/cube/output/ttt2/Src/stm32f1xx_it.c @@ -40,6 +40,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern DMA_HandleTypeDef hdma_adc1; /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ @@ -211,6 +212,20 @@ void EXTI4_IRQHandler(void) /* USER CODE END EXTI4_IRQn 1 */ } +/** +* @brief This function handles DMA1 channel1 global interrupt. +*/ +void DMA1_Channel1_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */ + + /* USER CODE END DMA1_Channel1_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_adc1); + /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */ + + /* USER CODE END DMA1_Channel1_IRQn 1 */ +} + /** * @brief This function handles EXTI line[9:5] interrupts. */ diff --git a/cube/output/ttt2/ttt2.ioc b/cube/output/ttt2/ttt2.ioc index 74988cb..2a67f6c 100644 --- a/cube/output/ttt2/ttt2.ioc +++ b/cube/output/ttt2/ttt2.ioc @@ -1,6 +1,6 @@ #MicroXplorer Configuration settings - do not modify ADC1.Channel-45\#ChannelRegularConversion=ADC_CHANNEL_0 -ADC1.ContinuousConvMode=DISABLE +ADC1.ContinuousConvMode=ENABLE ADC1.DataAlign=ADC_DATAALIGN_RIGHT ADC1.DiscontinuousConvMode=DISABLE ADC1.EnableAnalogWatchDog=false @@ -14,16 +14,28 @@ ADC1.Rank-45\#ChannelRegularConversion=1 ADC1.SamplingTime-45\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 ADC1.ScanConvMode=ADC_SCAN_DISABLE ADC1.master=1 +Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.ADC1.0.Instance=DMA1_Channel1 +Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD +Dma.ADC1.0.MemInc=DMA_MINC_ENABLE +Dma.ADC1.0.Mode=DMA_NORMAL +Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD +Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE +Dma.ADC1.0.Priority=DMA_PRIORITY_LOW +Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.Request0=ADC1 +Dma.RequestsNb=1 File.Version=6 KeepUserPlacement=false Mcu.Family=STM32F1 Mcu.IP0=ADC1 -Mcu.IP1=NVIC -Mcu.IP2=RCC -Mcu.IP3=SPI1 -Mcu.IP4=SYS -Mcu.IP5=TIM1 -Mcu.IPNb=6 +Mcu.IP1=DMA +Mcu.IP2=NVIC +Mcu.IP3=RCC +Mcu.IP4=SPI1 +Mcu.IP5=SYS +Mcu.IP6=TIM1 +Mcu.IPNb=7 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC @@ -52,6 +64,7 @@ Mcu.UserName=STM32F103C8Tx MxCube.Version=4.16.1 MxDb.Version=DB.4.0.161 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true +NVIC.DMA1_Channel1_IRQn=true\:0\:0\:false\:false\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true NVIC.EXTI3_IRQn=true\:0\:0\:false\:false\:true NVIC.EXTI4_IRQn=true\:0\:0\:false\:false\:true @@ -158,7 +171,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation=/home/wn/workspace-stm32/ttt2/cube/output/ttt2 ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_ADC1_Init-ADC1-false,3-MX_SPI1_Init-SPI1-false,4-MX_TIM1_Init-TIM1-false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_DMA_Init-DMA-false,3-MX_ADC1_Init-ADC1-false,4-MX_SPI1_Init-SPI1-false,5-MX_TIM1_Init-TIM1-false RCC.ADCFreqValue=12000000 RCC.ADCPresc=RCC_ADCPCLK2_DIV6 RCC.AHBFreq_Value=72000000 @@ -202,7 +215,7 @@ TIM1.IPParameters=OCMode_1,Pulse-Output Compare1 CH1,Prescaler,Period TIM1.OCMode_1=TIM_OCMODE_TOGGLE TIM1.Period=1000 TIM1.Prescaler=36 -TIM1.Pulse-Output\ Compare1\ CH1=10000 +TIM1.Pulse-Output\ Compare1\ CH1=0 VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_TIM1_VS_ClockSourceINT.Mode=Internal diff --git a/my_src/thermometer.c b/my_src/thermometer.c new file mode 100644 index 0000000..7b50f2a --- /dev/null +++ b/my_src/thermometer.c @@ -0,0 +1,54 @@ +/* + * thermometer.c + * + * Created on: Jun 13, 2017 + * Author: wn + */ + + +#include "stm32f1xx_hal.h" +#include "thermometer.h" +#include + + +extern ADC_HandleTypeDef hadc1; + + +#define NUM_OF_CONV 10 + +uint16_t adcBuf[NUM_OF_CONV]; +volatile uint32_t value; + +const float R_REF = 1000.0; +const uint16_t N_MAX = 4095; +const float PT1000_R0 = 1000.0; +const float PT1000_Coeff = 3.85e-3; + + + +void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { + HAL_ADC_Stop_DMA(hadc); + + uint32_t sum = 0; + for (uint8_t i = 0; i < NUM_OF_CONV; i++) { + sum += adcBuf[i]; + } + uint32_t avg = sum / NUM_OF_CONV; + value = avg; +} + +void thermometerStartCycle(void *handle) { + HAL_ADC_Start_DMA(&hadc1, ((uint32_t*)adcBuf), NUM_OF_CONV); +} + +void thermometerInit() { + HAL_ADCEx_Calibration_Start(&hadc1); + schAdd(thermometerStartCycle, NULL, 0, 100); +} + +uint32_t thermometerGetValue() { + float r = R_REF / ((((float)N_MAX) / ((float)value)) - 1.0); + float t = ((r / PT1000_R0) - 1) / PT1000_Coeff; + uint32_t tn = (t < 0) ? 0 : (uint16_t)t; + return tn; +} diff --git a/my_src/thermometer.h b/my_src/thermometer.h new file mode 100644 index 0000000..2fbff0c --- /dev/null +++ b/my_src/thermometer.h @@ -0,0 +1,14 @@ +/* + * thermometer.h + * + * Created on: Jun 13, 2017 + * Author: wn + */ + +#ifndef THERMOMETER_H_ +#define THERMOMETER_H_ + +void thermometerInit(); +uint32_t thermometerGetValue(); + +#endif /* THERMOMETER_H_ */