Add GPIO config, interrupt registers, GPIO interrupt support, 'button' example
This commit is contained in:
parent
822533fd92
commit
0078252df3
7 changed files with 377 additions and 16 deletions
examples/button
84
examples/button/button.c
Normal file
84
examples/button/button.c
Normal file
|
@ -0,0 +1,84 @@
|
|||
/* Respond to a button press.
|
||||
*
|
||||
* This code combines two ways of checking for a button press -
|
||||
* busy polling (the bad way) and button interrupt (the good way).
|
||||
*
|
||||
* This sample code is in the public domain.
|
||||
*/
|
||||
#include "espressif/esp_common.h"
|
||||
#include "espressif/sdk_private.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
#include "esp8266.h"
|
||||
|
||||
/* pin config */
|
||||
const int gpio = 0; /* gpio 0 usually has "PROGRAM" button attached */
|
||||
const int active = 0; /* active == 0 for active low */
|
||||
const gpio_interrupt_t int_type = INT_FALLING;
|
||||
#define GPIO_HANDLER gpio00_interrupt_handler
|
||||
|
||||
|
||||
/* This task polls for the button and prints the tick
|
||||
count when it's seen.
|
||||
|
||||
Debounced to 200ms with a simple vTaskDelay.
|
||||
|
||||
This is not a good example of how to wait for button input!
|
||||
*/
|
||||
void buttonPollTask(void *pvParameters)
|
||||
{
|
||||
printf("Polling for button press on gpio %d...\r\n", gpio);
|
||||
while(1) {
|
||||
while(gpio_read(gpio) != active)
|
||||
{
|
||||
taskYIELD();
|
||||
}
|
||||
printf("Polled for button press at %dms\r\n", xTaskGetTickCount()*portTICK_RATE_MS);
|
||||
vTaskDelay(200 / portTICK_RATE_MS);
|
||||
}
|
||||
}
|
||||
|
||||
/* This task configures the GPIO interrupt and uses it to tell
|
||||
when the button is pressed.
|
||||
|
||||
The interrupt handler communicates the exact button press time to
|
||||
the task via a queue.
|
||||
|
||||
This is a better example of how to wait for button input!
|
||||
*/
|
||||
void buttonIntTask(void *pvParameters)
|
||||
{
|
||||
printf("Waiting for button press interrupt on gpio %d...\r\n", gpio);
|
||||
xQueueHandle *tsqueue = (xQueueHandle *)pvParameters;
|
||||
gpio_set_interrupt(gpio, int_type);
|
||||
|
||||
uint32_t last = 0;
|
||||
while(1) {
|
||||
uint32_t button_ts;
|
||||
xQueueReceive(*tsqueue, &button_ts, portMAX_DELAY);
|
||||
button_ts *= portTICK_RATE_MS;
|
||||
if(last < button_ts-200) {
|
||||
printf("Button interrupt fired at %dms\r\n", button_ts);
|
||||
last = button_ts;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static xQueueHandle tsqueue;
|
||||
|
||||
void GPIO_HANDLER(void)
|
||||
{
|
||||
uint32_t now = xTaskGetTickCountFromISR();
|
||||
xQueueSendToBackFromISR(tsqueue, &now, NULL);
|
||||
}
|
||||
|
||||
void user_init(void)
|
||||
{
|
||||
sdk_uart_div_modify(0, UART_CLK_FREQ / 115200);
|
||||
gpio_enable(gpio, GPIO_INPUT);
|
||||
|
||||
tsqueue = xQueueCreate(2, sizeof(uint32_t));
|
||||
xTaskCreate(buttonIntTask, (signed char *)"buttonIntTask", 256, &tsqueue, 2, NULL);
|
||||
xTaskCreate(buttonPollTask, (signed char*)"buttonPollTask", 256, NULL, 1, NULL);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue