Наведён порядок в коде
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
#define REG_BANK_SEL 0x7F
|
#define REG_BANK_SEL 0x7F
|
||||||
#define REG_GYRO_CONFIG_1 0x01
|
#define REG_GYRO_CONFIG_1 0x01
|
||||||
#define REG_ACCEL_CONFIG 0x14
|
#define REG_ACCEL_CONFIG 0x14
|
||||||
#define IMU_RATE_HZ 1000 // 1 ms
|
|
||||||
#define IMU_DT 0.002f // 2 ms
|
#define IMU_DT 0.002f // 2 ms
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -17,17 +16,21 @@ typedef struct
|
|||||||
int16_t gx, gy, gz; // lsb
|
int16_t gx, gy, gz; // lsb
|
||||||
} imu_raw_t;
|
} imu_raw_t;
|
||||||
|
|
||||||
|
void imu_pow_init();
|
||||||
|
|
||||||
void i2c_gpio_init();
|
void i2c_gpio_init();
|
||||||
|
|
||||||
void i2c1_init();
|
void i2c1_init();
|
||||||
|
|
||||||
void icm_init();
|
void imu_init();
|
||||||
|
|
||||||
|
void imu_tim6_init();
|
||||||
|
|
||||||
void i2c_read(uint8_t addr, uint8_t reg, uint8_t* buf, uint8_t len);
|
void i2c_read(uint8_t addr, uint8_t reg, uint8_t* buf, uint8_t len);
|
||||||
|
|
||||||
void i2c_write(uint8_t addr, uint8_t reg, uint8_t data);
|
void i2c_write(uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
|
|
||||||
void icm_read_raw(imu_raw_t* data);
|
void imu_read_raw(imu_raw_t* data);
|
||||||
|
|
||||||
static void i2c_wait_idle(I2C_TypeDef* i2c);
|
static void i2c_wait_idle(I2C_TypeDef* i2c);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
#include "imu.h"
|
#include "imu.h"
|
||||||
|
|
||||||
|
void imu_pow_init()
|
||||||
|
{
|
||||||
|
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;
|
||||||
|
GPIOC->MODER &= ~(3 << (13 * 2));
|
||||||
|
GPIOC->MODER |= 1 << (13 * 2);
|
||||||
|
GPIOC->OTYPER &= ~(1 << 13);
|
||||||
|
GPIOC->PUPDR &= ~(3 << (13 * 2));
|
||||||
|
GPIOC->BSRR = 1 << (13 + 16);
|
||||||
|
}
|
||||||
|
|
||||||
void i2c_gpio_init()
|
void i2c_gpio_init()
|
||||||
{
|
{
|
||||||
// enable GPIOB clock
|
// enable GPIOB clock
|
||||||
@@ -32,7 +42,7 @@ void i2c1_init()
|
|||||||
I2C1->CR1 |= I2C_CR1_PE;
|
I2C1->CR1 |= I2C_CR1_PE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void icm_init()
|
void imu_init()
|
||||||
{
|
{
|
||||||
// select bank 0
|
// select bank 0
|
||||||
i2c_write(ICM_ADDR, REG_BANK_SEL, ~(3 << 4));
|
i2c_write(ICM_ADDR, REG_BANK_SEL, ~(3 << 4));
|
||||||
@@ -53,6 +63,19 @@ void icm_init()
|
|||||||
i2c_write(ICM_ADDR, REG_BANK_SEL, ~(3 << 4));
|
i2c_write(ICM_ADDR, REG_BANK_SEL, ~(3 << 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void imu_tim6_init()
|
||||||
|
{
|
||||||
|
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM6EN;
|
||||||
|
|
||||||
|
TIM6->PSC = 16000 - 1; // 16 MHz / 16000 = 1000 Hz (1 ms)
|
||||||
|
TIM6->ARR = 2 - 1; // 2 ms
|
||||||
|
|
||||||
|
TIM6->DIER |= TIM_DIER_UIE; // interrupt enable
|
||||||
|
TIM6->CR1 |= TIM_CR1_CEN; // counter enable
|
||||||
|
|
||||||
|
NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
||||||
|
}
|
||||||
|
|
||||||
void i2c_read(uint8_t addr, uint8_t reg, uint8_t* buf, uint8_t len)
|
void i2c_read(uint8_t addr, uint8_t reg, uint8_t* buf, uint8_t len)
|
||||||
{
|
{
|
||||||
i2c_wait_idle(I2C1);
|
i2c_wait_idle(I2C1);
|
||||||
@@ -94,7 +117,7 @@ void i2c_write(uint8_t addr, uint8_t reg, uint8_t data)
|
|||||||
I2C1->CR2 |= I2C_CR2_STOP;
|
I2C1->CR2 |= I2C_CR2_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void icm_read_raw(imu_raw_t* data)
|
void imu_read_raw(imu_raw_t* data)
|
||||||
{
|
{
|
||||||
uint8_t buf[12];
|
uint8_t buf[12];
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ void imu_read_scaled(imu_scaled_t* out)
|
|||||||
{
|
{
|
||||||
static imu_raw_t raw;
|
static imu_raw_t raw;
|
||||||
|
|
||||||
icm_read_raw(&raw);
|
imu_read_raw(&raw);
|
||||||
|
|
||||||
out->ax = raw.ax / ACCEL_SENS_SCALE_FACTOR - accel_bias_x;
|
out->ax = raw.ax / ACCEL_SENS_SCALE_FACTOR - accel_bias_x;
|
||||||
out->ay = raw.ay / ACCEL_SENS_SCALE_FACTOR - accel_bias_y;
|
out->ay = raw.ay / ACCEL_SENS_SCALE_FACTOR - accel_bias_y;
|
||||||
@@ -68,7 +68,7 @@ void imu_calibrate()
|
|||||||
|
|
||||||
for (uint16_t i = 0; i < samples; ++i)
|
for (uint16_t i = 0; i < samples; ++i)
|
||||||
{
|
{
|
||||||
icm_read_raw(&imu);
|
imu_read_raw(&imu);
|
||||||
|
|
||||||
sum_ax += imu.ax / ACCEL_SENS_SCALE_FACTOR;
|
sum_ax += imu.ax / ACCEL_SENS_SCALE_FACTOR;
|
||||||
sum_ay += imu.ay / ACCEL_SENS_SCALE_FACTOR;
|
sum_ay += imu.ay / ACCEL_SENS_SCALE_FACTOR;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ void receiver_gpio_init()
|
|||||||
// pull-up
|
// pull-up
|
||||||
GPIOA->PUPDR &= ~(3 << (3 * 2));
|
GPIOA->PUPDR &= ~(3 << (3 * 2));
|
||||||
GPIOA->PUPDR |= 1 << (3 * 2);
|
GPIOA->PUPDR |= 1 << (3 * 2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void receiver_lpuart_clock_init()
|
void receiver_lpuart_clock_init()
|
||||||
@@ -167,39 +166,3 @@ int8_t bool_mapping_gt(int16_t x, int16_t boundary)
|
|||||||
{
|
{
|
||||||
return x >= boundary;
|
return x >= boundary;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void toggle_led()
|
|
||||||
{
|
|
||||||
if (GPIOA->ODR & (1 << 15))
|
|
||||||
{
|
|
||||||
GPIOA->BSRR = 1 << (15 + 16);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIOA->BSRR = 1 << 15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void led_init(void)
|
|
||||||
{
|
|
||||||
/* Enable GPIOA clock */
|
|
||||||
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
|
|
||||||
|
|
||||||
/* PA15 -> Output mode */
|
|
||||||
GPIOA->MODER &= ~(3U << (15 * 2));
|
|
||||||
GPIOA->MODER |= (1U << (15 * 2));
|
|
||||||
|
|
||||||
/* Push-pull */
|
|
||||||
GPIOA->OTYPER &= ~(1U << 15);
|
|
||||||
|
|
||||||
/* Low speed (?????????? ??? LED) */
|
|
||||||
GPIOA->OSPEEDR &= ~(3U << (15 * 2));
|
|
||||||
|
|
||||||
/* No pull-up / pull-down */
|
|
||||||
GPIOA->PUPDR &= ~(3U << (15 * 2));
|
|
||||||
|
|
||||||
/* Start with LED OFF */
|
|
||||||
GPIOA->BSRR = (1U << (15 + 16));
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#ifndef TIMER_H
|
|
||||||
#define TIMER_H
|
|
||||||
|
|
||||||
#include "stm32g431xx.h"
|
|
||||||
|
|
||||||
void tim6_init();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file Templates/Src/stm32g4xx_it.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Main Interrupt Service Routines.
|
|
||||||
* This file provides template for all exceptions handler and
|
|
||||||
* peripherals interrupt service routine.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under terms that can be found in the LICENSE file
|
|
||||||
* in the root directory of this software component.
|
|
||||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "stm32g4xx_it.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32G4xx_HAL_Examples
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup Templates
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* Cortex-M4 Processor Exceptions Handlers */
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles NMI exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void NMI_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Hard Fault exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void HardFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Hard Fault exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Memory Manage exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MemManage_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Memory Manage exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Bus Fault exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void BusFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Bus Fault exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Usage Fault exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void UsageFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Usage Fault exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles SVCall exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SVC_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Debug Monitor exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void DebugMon_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles PendSVC exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void PendSV_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles SysTick Handler.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SysTick_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* STM32G4xx Peripherals Interrupt Handlers */
|
|
||||||
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
|
|
||||||
/* available peripheral interrupt handler's name please refer to the startup */
|
|
||||||
/* file (startup_stm32g4xxxx.s). */
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles PPP interrupt request.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
/*void PPP_IRQHandler(void)
|
|
||||||
{
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file Templates/Inc/stm32g4xx_it.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file contains the headers of the interrupt handlers.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under terms that can be found in the LICENSE file
|
|
||||||
* in the root directory of this software component.
|
|
||||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef STM32G4xx_IT_H
|
|
||||||
#define STM32G4xx_IT_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* Exported macros -----------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
void NMI_Handler(void);
|
|
||||||
void HardFault_Handler(void);
|
|
||||||
void MemManage_Handler(void);
|
|
||||||
void BusFault_Handler(void);
|
|
||||||
void UsageFault_Handler(void);
|
|
||||||
void SVC_Handler(void);
|
|
||||||
void DebugMon_Handler(void);
|
|
||||||
void PendSV_Handler(void);
|
|
||||||
void SysTick_Handler(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* STM32G4xx_IT_H */
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#include "timer.h"
|
|
||||||
|
|
||||||
void tim6_init()
|
|
||||||
{
|
|
||||||
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM6EN;
|
|
||||||
|
|
||||||
TIM6->PSC = 16000 - 1; // 16 MHz / 16000 = 1000 Hz (1 ms)
|
|
||||||
TIM6->ARR = 2 - 1; // 2 ms
|
|
||||||
|
|
||||||
TIM6->DIER |= TIM_DIER_UIE; // interrupt enable
|
|
||||||
TIM6->CR1 |= TIM_CR1_CEN; // counter enable
|
|
||||||
|
|
||||||
NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#include "stm32g431xx.h"
|
#include "stm32g431xx.h"
|
||||||
#include "imu.h"
|
#include "imu.h"
|
||||||
#include "imu_processing.h"
|
#include "imu_processing.h"
|
||||||
#include "timer.h"
|
|
||||||
#include "attitude.h"
|
#include "attitude.h"
|
||||||
#include "radio_receiver.h"
|
#include "radio_receiver.h"
|
||||||
#include "motors.h"
|
#include "motors.h"
|
||||||
@@ -16,27 +15,19 @@ control_channels_t ctrl_chs;
|
|||||||
|
|
||||||
void delay_ms(uint32_t ms);
|
void delay_ms(uint32_t ms);
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;
|
|
||||||
GPIOC->MODER &= ~(3 << (13 * 2));
|
|
||||||
GPIOC->MODER |= 1 << (13 * 2);
|
|
||||||
GPIOC->OTYPER &= ~(1 << 13);
|
|
||||||
GPIOC->PUPDR &= ~(3 << (13 * 2));
|
|
||||||
GPIOC->BSRR = 1 << (13 + 16);
|
|
||||||
|
|
||||||
delay_ms(200);
|
|
||||||
|
|
||||||
NVIC_SetPriority(TIM6_DAC_IRQn, 1);
|
NVIC_SetPriority(TIM6_DAC_IRQn, 1);
|
||||||
NVIC_SetPriority(LPUART1_IRQn, 0);
|
NVIC_SetPriority(LPUART1_IRQn, 0);
|
||||||
|
|
||||||
|
imu_pow_init();
|
||||||
i2c_gpio_init();
|
i2c_gpio_init();
|
||||||
i2c1_init();
|
i2c1_init();
|
||||||
icm_init();
|
imu_init();
|
||||||
|
imu_tim6_init();
|
||||||
imu_processing_init();
|
imu_processing_init();
|
||||||
tim6_init();
|
|
||||||
|
|
||||||
imu_calibrate();
|
imu_calibrate();
|
||||||
|
|
||||||
|
|||||||
12
drone.ewp
12
drone.ewp
@@ -2311,24 +2311,12 @@
|
|||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\Source\Core\Inc\system_stm32g4xx.h</name>
|
<name>$PROJ_DIR$\Source\Core\Inc\system_stm32g4xx.h</name>
|
||||||
</file>
|
</file>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Inc\timer.h</name>
|
|
||||||
</file>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<name>Src</name>
|
<name>Src</name>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\stm32g4xx_it.c</name>
|
|
||||||
</file>
|
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\stm32g4xx_it.h</name>
|
|
||||||
</file>
|
|
||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\system_stm32g4xx.c</name>
|
<name>$PROJ_DIR$\Source\Core\Src\system_stm32g4xx.c</name>
|
||||||
</file>
|
</file>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\timer.c</name>
|
|
||||||
</file>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
|
|||||||
12
drone.ewt
12
drone.ewt
@@ -3496,24 +3496,12 @@
|
|||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\Source\Core\Inc\system_stm32g4xx.h</name>
|
<name>$PROJ_DIR$\Source\Core\Inc\system_stm32g4xx.h</name>
|
||||||
</file>
|
</file>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Inc\timer.h</name>
|
|
||||||
</file>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<name>Src</name>
|
<name>Src</name>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\stm32g4xx_it.c</name>
|
|
||||||
</file>
|
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\stm32g4xx_it.h</name>
|
|
||||||
</file>
|
|
||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\system_stm32g4xx.c</name>
|
<name>$PROJ_DIR$\Source\Core\Src\system_stm32g4xx.c</name>
|
||||||
</file>
|
</file>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\Source\Core\Src\timer.c</name>
|
|
||||||
</file>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
|
|||||||
Reference in New Issue
Block a user