146 lines
3.6 KiB
C
146 lines
3.6 KiB
C
|
#include <stdio.h>
|
||
|
#include "bit_band.h"
|
||
|
#include "stm32f4xx_hal.h"
|
||
|
#include "stm32f407xx.h"
|
||
|
void gpio_input_set(GPIO_TypeDef *gpio, uint16_t pin)
|
||
|
{
|
||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||
|
GPIO_InitStruct.Pin = pin;
|
||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
|
HAL_GPIO_Init(gpio, &GPIO_InitStruct);
|
||
|
}
|
||
|
void gpio_output_set(GPIO_TypeDef *gpio, uint16_t pin)
|
||
|
{
|
||
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||
|
GPIO_InitStruct.Pin = pin;
|
||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
|
HAL_GPIO_Init(gpio, &GPIO_InitStruct);
|
||
|
}
|
||
|
|
||
|
void gpio_init()
|
||
|
{
|
||
|
// fan read
|
||
|
gpio_input_set(GPIOD, GPIO_PIN_4);
|
||
|
gpio_input_set(GPIOD, GPIO_PIN_5);
|
||
|
gpio_input_set(GPIOD, GPIO_PIN_6);
|
||
|
gpio_input_set(GPIOD, GPIO_PIN_7);
|
||
|
gpio_input_set(GPIOB, GPIO_PIN_4);
|
||
|
gpio_input_set(GPIOB, GPIO_PIN_3);
|
||
|
// pwm output
|
||
|
// gpio_output_set(GPIOC, GPIO_PIN_6);
|
||
|
// gpio_output_set(GPIOC, GPIO_PIN_7);
|
||
|
// gpio_output_set(GPIOC, GPIO_PIN_8);
|
||
|
// gpio_output_set(GPIOC, GPIO_PIN_9);
|
||
|
|
||
|
gpio_output_set(GPIOA, GPIO_PIN_5);
|
||
|
}
|
||
|
// void start_time()
|
||
|
// {
|
||
|
// PAout(5) = 1;
|
||
|
// }
|
||
|
// void stop_time()
|
||
|
// {
|
||
|
// PAout(5) = 0;
|
||
|
// }
|
||
|
static volatile char old[6];
|
||
|
static volatile int cnt[6];
|
||
|
static volatile int speed[6];
|
||
|
|
||
|
#define GPIO_DETECT(state, reg, cnt) \
|
||
|
if (state) \
|
||
|
{ \
|
||
|
if (reg == 0) \
|
||
|
{ \
|
||
|
reg = 1; \
|
||
|
cnt++; \
|
||
|
} \
|
||
|
} \
|
||
|
else \
|
||
|
{ \
|
||
|
if (reg == 1) \
|
||
|
{ \
|
||
|
reg = 0; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define SAVE_SPEED(speed, cnt) \
|
||
|
{ \
|
||
|
speed = cnt; \
|
||
|
cnt = 0; \
|
||
|
}
|
||
|
void gpio_save_speed()
|
||
|
{
|
||
|
SAVE_SPEED(speed[0], cnt[0]);
|
||
|
SAVE_SPEED(speed[1], cnt[1]);
|
||
|
SAVE_SPEED(speed[2], cnt[2]);
|
||
|
SAVE_SPEED(speed[3], cnt[3]);
|
||
|
SAVE_SPEED(speed[4], cnt[4]);
|
||
|
SAVE_SPEED(speed[5], cnt[5]);
|
||
|
}
|
||
|
void gpio_scan()
|
||
|
{
|
||
|
|
||
|
char state = PDin(4);
|
||
|
GPIO_DETECT(state, old[0], cnt[0]);
|
||
|
state = PDin(5);
|
||
|
GPIO_DETECT(state, old[1], cnt[1]);
|
||
|
state = PDin(6);
|
||
|
GPIO_DETECT(state, old[2], cnt[2]);
|
||
|
state = PDin(7);
|
||
|
GPIO_DETECT(state, old[3], cnt[3]);
|
||
|
state = PBin(4);
|
||
|
GPIO_DETECT(state, old[4], cnt[4]);
|
||
|
state = PBin(3);
|
||
|
GPIO_DETECT(state, old[5], cnt[5]);
|
||
|
static int save = 0;
|
||
|
if (save > 1000)
|
||
|
{
|
||
|
gpio_save_speed();
|
||
|
save = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
save++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static char duty[4] = {90, 60, 40, 10};
|
||
|
static char now = 0;
|
||
|
#define PWM_OUT(duty, now, io_deal) \
|
||
|
if (duty < now) \
|
||
|
{ \
|
||
|
io_deal = 1; \
|
||
|
} \
|
||
|
else \
|
||
|
{ \
|
||
|
io_deal = 0; \
|
||
|
}
|
||
|
void gpio_pwm_output()
|
||
|
{
|
||
|
// static char cnt = 0;
|
||
|
// if (cnt < 10)
|
||
|
// {
|
||
|
// cnt++;
|
||
|
// return;
|
||
|
// }
|
||
|
// cnt = 0;
|
||
|
// PAout(5) = 1;
|
||
|
// PCout(6) = 1;
|
||
|
// PCout(7) = 1;
|
||
|
// HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,1);
|
||
|
// PCout(8) = 1;
|
||
|
// PCout(9) = 1;
|
||
|
// PAout(5) = 0;
|
||
|
// PWM_OUT(duty[0], now, PCout(6));
|
||
|
// PWM_OUT(duty[1], now, PCout(7));
|
||
|
// PWM_OUT(duty[2], now, PCout(8));
|
||
|
// PWM_OUT(duty[3], now, PCout(9));
|
||
|
// now++;
|
||
|
// if (now == 99)
|
||
|
// {
|
||
|
// now = 0;
|
||
|
// }
|
||
|
}
|