kopia lustrzana https://github.com/mikaelnousiainen/RS41ng
56 wiersze
1.9 KiB
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);
|
|
}
|