RS41ng/src/drivers/pulse_counter/pulse_counter.c

56 wiersze
1.9 KiB
C

#include "pulse_counter.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x.h"
#include "misc.h"
#include "config.h"
// The pulse count will wrap to zero at 65535 as it is stored as a 16-bit unsigned integer value
uint16_t pulse_count = 0;
void pulse_counter_init(int pin_mode, int edge)
{
// Initialize pin PB11 with optional internal pull-up resistor
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_11;
gpio_init.GPIO_Mode = (pin_mode == PULSE_COUNTER_PIN_MODE_INTERNAL_PULL_UP)
? GPIO_Mode_IPU :
((pin_mode == PULSE_COUNTER_PIN_MODE_INTERNAL_PULL_DOWN)
? GPIO_Mode_IPD
: GPIO_Mode_IN_FLOATING);
gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &gpio_init);
// PB11 is connected to interrupt line 11, set trigger on the configured edge and enable the interrupt
EXTI_InitTypeDef exti_init;
exti_init.EXTI_Line = EXTI_Line11;
exti_init.EXTI_Mode = EXTI_Mode_Interrupt;
exti_init.EXTI_Trigger = (edge == PULSE_COUNTER_INTERRUPT_EDGE_FALLING)
? EXTI_Trigger_Falling
: EXTI_Trigger_Rising;
exti_init.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti_init);
// Attach interrupt line to port B
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
// PB11 is connected to EXTI_Line11, which has EXTI15_10_IRQn vector. Use priority 0 for now.
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
uint16_t pulse_counter_get_count()
{
return pulse_count;
}
void EXTI15_10_IRQHandler(void)
{
pulse_count = pulse_count + 1;
EXTI_ClearITPendingBit(EXTI_Line11);
}