void gpio0_callback(void)
{
    NVIC_DisableIRQ(GPIO0_IRQn);    // Disable this interrupt
    
    if(GPIO_GetPinStatus(UART1_CTS_PORT, UART1_CTS_PIN)==FALSE)
    {
        app_override_ble_xon();
        //Set interrupt to detect rising edge of CTS
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 0, 1, 0);
    }
    else if(GPIO_GetPinStatus(UART1_CTS_PORT, UART1_CTS_PIN)==TRUE)
    {
        app_override_ble_xoff();
        //Set interrupt to detect falling edge of CTS
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 1, 0, 0);
    }
    NVIC_ClearPendingIRQ(GPIO0_IRQn);
	NVIC_EnableIRQ(GPIO0_IRQn);     // Enable this interrupt
}
/**
 ****************************************************************************************
 * @brief Enable pad's and peripheral clocks assuming that peripherals' power domain is down. The Uart and SPi clocks are set.
 *
 * @return void
 ****************************************************************************************
 */
void periph_init(void) 
{
	// Power up peripherals' power domain
    SetBits16(PMU_CTRL_REG, PERIPH_SLEEP, 0);
    while (!(GetWord16(SYS_STAT_REG) & PER_IS_UP)) ; 
    
	
	//rom patch
	patch_func();
	
	//Init pads
	set_pad_functions();
    
    SetBits16(CLK_PER_REG, UART1_ENABLE, 1);    // enable clock - always @16MHz
	
    // baudr=9-> 115k2
    // mode=3-> no parity, 1 stop bit 8 data length

    uart_sps_init(UART_SPS_BAUDRATE, 3); //exact baud rate defined in uart.h

   // Enable the pads
	SetBits16(SYS_CTRL_REG, PAD_LATCH_EN, 1);

#if (EXT_SLEEP_ENABLED)
    app_scheduler_reinit();
#endif //EXT_SLEEP_ENABLED

#if ((UART_HW_FLOW_ENABLED) && !defined(GPIO_DRV_IRQ_HANDLING_DISABLED))
    GPIO_RegisterCallback(GPIO0_IRQn, gpio0_callback);
    if(GPIO_GetPinStatus(UART1_CTS_PORT,UART1_CTS_PIN)==FALSE)
    {
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 0, 1, 0);
    }
    else if(GPIO_GetPinStatus(UART1_CTS_PORT,UART1_CTS_PIN)==TRUE)
    {
        GPIO_EnableIRQ(UART1_CTS_PORT, UART1_CTS_PIN, GPIO0_IRQn, 1, 0, 0);
    }
#endif //((UART_HW_FLOW_ENABLED) && !defined(GPIO_DRV_IRQ_HANDLING_DISABLED))
}
Exemple #3
0
/**
 * @brief Enable the IRQ of the specified GPIO
 * @param[in] port GPIO port
 * @param[in] pin GPIO pin number
 * @param[in] param Pointer to GPIO_IrqParam structure
 * @return None
 */
void HAL_GPIO_EnableIRQ(GPIO_Port port, GPIO_Pin pin, const GPIO_IrqParam *param)
{
	uint32_t regIdx;
	uint32_t bitShift;
	GPIO_IRQ_T *gpiox;
	GPIO_Private *gpioPriv;
	IRQn_Type IRQn;
	unsigned long flags;

	flags = HAL_EnterCriticalSection();

	if (port == GPIO_PORT_A) {
		gpioPriv = gGPIOAPrivate;
		IRQn = GPIOA_IRQn;
	} else if (port == GPIO_PORT_B) {
		gpioPriv = gGPIOBPrivate;
		IRQn = GPIOB_IRQn;
	} else {
		HAL_ERR("Invalid port %d for IRQ\n", port);
		return;
	}
	gpiox = GPIO_GetIRQInstance(port);

	/* set callback */
	gpioPriv[pin].callback = param->callback;
	gpioPriv[pin].arg = param->arg;

	/* set IRQ trigger mode */
	GPIO_GET_REG_IDX_SHIFT(regIdx, bitShift, pin, GPIO_IRQ_EVT_BITS);
	HAL_MODIFY_REG(gpiox->IRQ_MODE[regIdx],
				   GPIO_IRQ_EVT_VMASK << bitShift,
				   (param->event & GPIO_IRQ_EVT_VMASK) << bitShift);

	if (GPIO_IsPendingIRQ(gpiox, pin)) {
		GPIO_ClearPendingIRQ(gpiox, pin);
	}
	GPIO_EnableIRQ(gpiox, pin);
	HAL_NVIC_SetPriority(IRQn, NVIC_PERIPHERAL_PRIORITY_DEFAULT);
	HAL_NVIC_EnableIRQ(IRQn);

	HAL_ExitCriticalSection(flags);
}