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)) }
/** * @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); }