2010-03-22 11:22 AM
TIM1 triggering ADC
2011-05-17 04:44 AM
Assuming you are using the libraries :
If you have done ADC_Init(), with ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1 (or whichever CC channel you are using). And you have done : ADC_ExternalTrigConvCmd( ADC1, ENABLE ); Then, if your SW trigger works, this should also - SW trigger working means you must have the ADC correctly set up, for the most part. If you're already doing this, you will probably need to post some of your code.2011-05-17 04:44 AM
Also - make sure TIM1's MOE is asserted.
2011-05-17 04:44 AM
Hi Brian.
I'm not using ST Libraries, just using directly the registers. I've compared some ST code examples and also that commands you just sent and I think everything is ok, my code and ST Libraries are doing the same thing. When I debug with IAR and inspect STM registers, everything is ok too. As you mentioned, ADC is working properly and seems to me that the unique difference when triggering ADC by software or external sources is the EXTSEL field in ADC_CR2 register... So I suspect my error is on TIM1configuration, precisely on event generation that should trigger ADC. Below the most important pieces of my code: //######### Timer Configuration ######### RCC_APB2ENR->TIM1EN = 1; //enable timer clock TIM1_CR1->CEN = 0; //disable counter TIM1_CR1->ARPE = 1; //auto reload TIM1_PSC = 500; //Timer prescaler. clk = 10KHz TIM1_ARR = 0xFFFF; TIM1_CNT = 0xFFFF; //Configure channel TIM1_CCMR1->CC1S = 2; //IC1 mapped to CH2 TIM1_CCMR1->IC1PSC = 0; //No prescaler TIM1_CCMR1->IC1F = 0; //No filter TIM1_CCER->CC1P = 0; //active on rising edge //Configure channel TIM1_CCMR1->CC2S = 1; //IC1 mapped to CH2 TIM1_CCMR1->IC2PSC = 0; //No prescaler TIM1_CCMR1->IC2F = 0; //No filter TIM1_CCER->CC2P = 1; //active on falling edge //Timer mode - PWM Input Capture TIM1_SMCR->TS = 6; //trigger input TIM1_SMCR->SMS = 4; //slave mode reset //Enable captures TIM1_CCER->CC1E = 1; TIM1_CCER->CC2E = 1; //Configure interruptions and DMA TIM1_DIER->CC2DE = 1; //CC2 DMA request enabled As you suggested I enabled MOE bit, but I didn't understand why this is needed. I'm using Input PWM mode and it seems to deal with outputs. Sorry if I'm wrong. Anyway I tested with it and got no trigger. TIM1_BDTR->MOE = 1; //Enable timer TIM1_CR1->CEN = 1; Thanks a lot for your attention. Best regards.2011-05-17 04:44 AM
I believe you will need to set up a compare channel (an additional one) as an *output* to trigger the ADC with. The trigger IS the output which requires MOE - I think. Not 100% sure; I have similar code to what you are doing, but I am generating a PWM signal, not detecting one, so I can trigger the ADC with my compare channel directly.
Good luck.2011-05-17 04:44 AM
Thanks a lot for your help Brian.
I founded other user with similar problem and he solved it like you sugested: using a pwm output. [DEAD LINK /public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/ARM CortexM3 STM32/ADC ADC Watchdog Triggered by Timer&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E¤tviews=754]See discution here. The most weird thing it seems to be an information inexistent in datasheet... Datasheet error? Bad interpretation? If anyone could explain this many would be greatfull....2011-05-17 04:44 AM
In general look at the images instead of the text in the stm datasheets. The text doesn't even mention many hard facts like this feature in this thread. The images have been ok for me yet. Nothing is so unspecific or changeable like the text says. Many hardware parts ONLY work in exactly ONE way. If you choose an other way, i doesn't work ;)
2011-05-17 04:44 AM
Use the FW library and examples, if only for setup, it helps :)
When all is done, you can change anything in registers and avoid lot of troubles.