stm32f407-openocd/Core/Src/gpio/soft_gpio.c

162 lines
4.0 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()
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
// 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]);
#include "debug.h"
// Printf("speed:%d,%d,%d,%d,%d\n", speed[0], speed[1], speed[2], speed[3], speed[4]);
}
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 volatile int duty[4] = {90, 60, 40, 10};
static volatile int now = 0;
#define PWM_OUT(duty, now, io_deal) \
if (duty <= now) \
{ \
io_deal = 0; \
} \
else \
{ \
io_deal = 1; \
}
void gpio_pwm_output()
{
static char cnt = 0;
if (cnt < 10)
{
cnt++;
return;
}
cnt = 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 == 100)
{
now = 0;
}
}
void duty_set(unsigned char ch, unsigned char _duty)
{
if (ch >= sizeof(duty))
{
return;
}
duty[ch] = _duty;
}
void soft_gpio_function()
{
gpio_pwm_output();
gpio_scan();
}