|
|
#include "zport.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "zboard.h"
/***********************************************************************************************************************
* =====================================================基础组件====================================================== * ***********************************************************************************************************************/ /**
* @brief printf 串口重定向 * * @param ch * @param stream * @return int */ int fputc(int ch, FILE* stream) { uint8_t c = ch; HAL_UART_Transmit(&DEBUG_UART, &c, 1, 100); return ch; }
// systicket 辅助方法
uint32_t port_haspassedms(uint32_t ticket) { uint32_t nowticket = HAL_GetTick(); if (nowticket >= ticket) { return nowticket - ticket; } return UINT32_MAX - ticket + nowticket; } void port_delay_us(uint32_t us) { uint16_t counter = 0; __HAL_TIM_SET_COUNTER(&US_TIMER, 0); HAL_TIM_Base_Start(&US_TIMER); while (counter < us) { counter = __HAL_TIM_GET_COUNTER(&US_TIMER); } HAL_TIM_Base_Stop(&US_TIMER); } static uint8_t g_port_exit_critical_count; void port_enter_critical() { if (g_port_exit_critical_count == 0) { __disable_irq(); } g_port_exit_critical_count++; } void port_exit_critical() { g_port_exit_critical_count--; if (g_port_exit_critical_count == 0) { __enable_irq(); } } /***********************************************************************************************************************
* ===================================================硬件接口相关==================================================== * ***********************************************************************************************************************/
void port_set_led_brightness1(uint16_t brightness) { /**
* @brief 低电平有效 */ uint16_t count = (1 - brightness / 65535.0) * __HAL_TIM_GET_AUTORELOAD(&LED_CRL_PWMX_TIM);
__HAL_TIM_SET_COMPARE(&LED_CRL_PWMX_TIM, LED_CRL_PWM1_CH, count); __HAL_TIM_SET_COMPARE(&LED_CRL_PWMX_TIM, LED_CRL_PWM2_CH, count); __HAL_TIM_SET_COMPARE(&LED_CRL_PWMX_TIM, LED_CRL_PWM3_CH, count); __HAL_TIM_SET_COMPARE(&LED_CRL_PWMX_TIM, LED_CRL_PWM4_CH, count);
HAL_TIM_PWM_Start(&LED_CRL_PWMX_TIM, LED_CRL_PWM1_CH); HAL_TIM_PWM_Start(&LED_CRL_PWMX_TIM, LED_CRL_PWM2_CH); HAL_TIM_PWM_Start(&LED_CRL_PWMX_TIM, LED_CRL_PWM3_CH); HAL_TIM_PWM_Start(&LED_CRL_PWMX_TIM, LED_CRL_PWM4_CH); } void port_set_led_brightness2(uint16_t brightness) { /**
* @brief 高有效 * 10k */ uint16_t count = (1 - brightness / 65535.0) * __HAL_TIM_GET_AUTORELOAD(&LED_CRL_APWM1_TIM); __HAL_TIM_SET_COMPARE(&LED_CRL_APWM1_TIM, LED_CRL_APWM1_CH, count); HAL_TIM_PWM_Start(&LED_CRL_APWM1_TIM, LED_CRL_APWM1_CH); } /**
* @brief 模拟控制灯光亮度百分比限制 * * @param brightness * @return uint16_t */ uint16_t get_set_led_brightness2_limit(uint16_t brightness) { const float min_ratio = 0.16; const float max_ratio = 1 - 0.3; float expect_duty_ratio = brightness / 65535.0; float final_radio = min_ratio + (max_ratio - min_ratio) * expect_duty_ratio; return final_radio * 65535; }
void port_set_led_brightness(uint16_t brightness) { if (brightness == 0) { port_set_led_brightness1(0); port_set_led_brightness2(get_set_led_brightness2_limit(0)); } else { port_set_led_brightness1(65535); port_set_led_brightness2(get_set_led_brightness2_limit(brightness)); } }
/***********************************************************************************************************************
* =====================================================ExtraGPIO===================================================== * ***********************************************************************************************************************/
static extra_gpio_t s_extra_gpios[2] = {0}; void port_extra_gpio_init() { GPIO_InitTypeDef GPIO_InitStruct = {0};
s_extra_gpios[0].GPIOx = ExtraGPIO0_GPIOx; s_extra_gpios[0].pin = ExtraGPIO0_pin;
s_extra_gpios[1].GPIOx = ExtraGPIO1_GPIOx; s_extra_gpios[1].pin = ExtraGPIO1_pin; } void port_extra_gpio_set_mirror(int gpioNum, bool mirror) { extra_gpio_t* gpio = NULL; if (gpioNum >= ARRARY_SIZE(s_extra_gpios)) { return; } gpio = &s_extra_gpios[gpioNum]; gpio->mirror = mirror; }
void port_extra_gpio_set_mode(int gpioNum, extra_gpio_mode_e mode) { extra_gpio_t* gpio = NULL; GPIO_InitTypeDef GPIO_InitStruct = {0};
if (gpioNum >= ARRARY_SIZE(s_extra_gpios)) { return; }
gpio = &s_extra_gpios[gpioNum]; gpio->mode = mode;
if (mode == kegm_disable) { //模拟输入
HAL_GPIO_DeInit(gpio->GPIOx, gpio->pin);
GPIO_InitStruct.Pin = gpio->pin; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(gpio->GPIOx, &GPIO_InitStruct); } else if (mode == kegm_camera_trigger_signal) { //不拉输出
HAL_GPIO_DeInit(gpio->GPIOx, gpio->pin);
port_extra_gpio_set_level(gpioNum, false);
GPIO_InitStruct.Pin = gpio->pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(gpio->GPIOx, &GPIO_InitStruct); } } extra_gpio_mode_e port_extra_gpio_get_mode(int gpioNum) { extra_gpio_t* gpio = NULL; if (gpioNum >= ARRARY_SIZE(s_extra_gpios)) { return kegm_disable; } gpio = &s_extra_gpios[gpioNum]; return gpio->mode; } void port_extra_gpio_set_level(int gpioNum, bool level) { extra_gpio_t* gpio = NULL; bool nowState = false;
if (gpioNum >= ARRARY_SIZE(s_extra_gpios)) { return; }
gpio = &s_extra_gpios[gpioNum]; if (gpio->mirror) level = !level; if (level) { HAL_GPIO_WritePin(gpio->GPIOx, gpio->pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(gpio->GPIOx, gpio->pin, GPIO_PIN_RESET); } } bool port_extra_gpio_get_level(int gpioNum) { extra_gpio_t* gpio = NULL; bool nowState = false;
if (gpioNum > ARRARY_SIZE(s_extra_gpios)) { return false; }
gpio = &s_extra_gpios[gpioNum]; GPIO_PinState state = HAL_GPIO_ReadPin(gpio->GPIOx, gpio->pin); if (state == GPIO_PIN_SET) { nowState = true; } else { nowState = false; } if (gpio->mirror) nowState = !nowState; return nowState; }
|