2014-03-24 01:28 PM
Hi,
I want to make a timer to count on each rising edge of a square signal on PC.6. I am using STM32F103RBT6. I searched a sample code for that, but I couldn't find anything. What I found are all about timer interrupts or so. I looked at the Standard Peripheral Library source codes as well, but I really don't understand :)Can anybody help me?Thanks. #external-clock-source.2014-03-24 02:07 PM
For the F1 you'd probably need to define the pin as an input and remap TIM3
[DEAD LINK /public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/STM32Discovery/STM32F4%20Timer%20External%20Pulse%20counting&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F¤tviews=134]https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FSTM32Discovery%2FSTM32F4%20Timer%20External%20Pulse%20counting&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F¤tviews=1342014-03-24 03:23 PM
Thank you very much for your answer :), I already read that thread and noticed that there are a function (GPIO_PinAFConfig) which is not in my development environment (CooCox IDE 1.7.6), but then I have used GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
now it seems to work with external clock, however I have now another problem:What exactly I wanto to make is to connect RFID Frond-End chip EM4095 with STM32. I am using two outputs of EM4095, RDY/CLK and DEMOD_OUT. I have a small osciloscope (DSO QUAD) and I upload the scope picture.
EM4095 outputs a square wave on RDY/CLK pin at 125 KHz as expected. If there is no RFID tag in front of the coil, it gives a square wave on DEMOD_OUT pin at ~3.600 KHz. I am using EXTI interrupts for that input and I want to count the RDY/CLK cycles until next rising edge of DEMOD_OUT, therefore I configured the TIM3 so that it will count up on each rising edge of RDY/CLK signal.
As you can see on the picture below, the TIM3 shall give 31 or 32 until next interrupt, but it gives always 0 or 1. Blue line is RDY/CLK, yellow is DEMOD_OUT.And here is my code:
void
EXTI_Exp(
void
)
{
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
Timer_Configuration(); //other configurations like USART and LCDGPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
EXTI_InitStructure.
EXTI_Line
= EXTI_Line6;
EXTI_InitStructure.EXTI_Mode
=
EXTI_Mode_Interrupt
;
EXTI_InitStructure.EXTI_Trigger
=
EXTI_Trigger_Rising
;
EXTI_InitStructure.EXTI_LineCmd
=
ENABLE
; EXTI_Init(&EXTI_InitStructure);while
(1)
{ }}
void
GPIO_Configuration(
void
)
{
// Input for DEMOD_OUT and RDY/CLK signal from EM4095
GPIO_InitStructure.
GPIO_Mode
=
GPIO_Mode_IN_FLOATING
;
GPIO_InitStructure.
GPIO_Pin
= GPIO_Pin_6;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.
GPIO_Mode
=
GPIO_Mode_IN_FLOATING
;
GPIO_InitStructure.
GPIO_Pin
= GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,
ENABLE
);}
void
Timer_Configuration(
void
){
TIM_TimeBase_InitStructure.
TIM_ClockDivision
= TIM_CKD_DIV1;
TIM_TimeBase_InitStructure.
TIM_CounterMode
= TIM_CounterMode_Up;
TIM_TimeBase_InitStructure.
TIM_Period
= 65535;
TIM_TimeBase_InitStructure.
TIM_Prescaler
= 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBase_InitStructure);
TIM_Cmd(TIM3,
ENABLE
);TIM_TIxExternalClockConfig(TIM3, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_Rising, 0);
}
void
NVIC_Configuration(
void
)
{
// Enable EXTI 9-5 Lines interrupt
NVIC_InitStructure.
NVIC_IRQChannel
= EXTI9_5_IRQn;
NVIC_InitStructure.
NVIC_IRQChannelPreemptionPriority
= 0;
NVIC_InitStructure.
NVIC_IRQChannelSubPriority
= 0;
NVIC_InitStructure.
NVIC_IRQChannelCmd
=
ENABLE
;
NVIC_Init(&NVIC_InitStructure);
}
void
RCC_Configuration(
void
){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | \
RCC_APB2Periph_GPIOC | \
RCC_APB2Periph_GPIOB | \
RCC_APB2Periph_AFIO ,
ENABLE
);
RCC_APB1PeriphClockCmd( RFID_TIM_RCC | \
RCC_APB1Periph_TIM3 | \
RCC_APB1Periph_USART2 | \
RCC_APB1Periph_USART3,
ENABLE
);}
</p>
void
</b>
EXTI9_5_IRQHandler(
void
)
{
uint8_t i;
if
(EXTI_GetFlagStatus(EXTI_Line6) ==
SET
) {
EXTI_ClearITPendingBit(EXTI_Line6);
iCnt = TIM_GetCounter(TIM3);
LCD_SendText(
'':''
);LCD_SendNumber(iCnt);
TIM_SetCounter(TIM3, 0);
}
I am calling EXTI_Exp() function in the main.c
2014-03-24 03:54 PM
If you must reset the timer's counter, then do it BEFORE outputting to the LCD, which is likely very slow.
Alternatively don't reset the counter, just remember the previous value and compute a delta (b-a) of how it changed.2014-03-25 03:26 AM