esp32程序解析


ESP-IDF 编程指南

整体框图(草稿版)

在这里插入图片描述

整体流程图(草稿版)

在这里插入图片描述

esp32-WIFI状态机

  • WiFi-start
    在这里插入图片描述
  • WiFi-event-machine
    在这里插入图片描述
  • 用户自定义状态机回调函数

  • 回调函数作为形参的方式传递给esp_event_loop_init(event_handler,NULL)函数

  • 创建任务esp_event_loop_task一直监测状态机状态,当底层驱动传递过来新状态时,自定义函数得到回调

esp_wifi.h depict WiFi programming model

参考esp-idf https://github.com/espressif/esp-idf/blob/ca1e5e5bc/components/esp32/include

在这里插入图片描述

  • 无线驱动程序可以考虑作为黑盒,它高层代码一无所知,例如TCPIP堆栈,应用程序的任务,事件任务等,它所能做的就是接受高层或API调用事件队列到指定队列,由API esp_wifi_init初始化()。
  • 事件任务是一个守护进程任务,它接收来自WiFi驱动程序或其他子系统的事件,如TCPIP stack,事件任务在接收到事件时会调用默认的回调函数。例如,在接收事件SYSTEM_EVENT_STA_CONNECTED时,它将调用tcpip_adapter_start()来启动DHCP 客户机的默认处理程序。
  • 应用程序可以通过API esp_event_init注册自己的事件回调函数,然后在默认回调后调用应用程序回调函数。另外,如果应用程序不希望在事件任务中执行回调,它需要做的是将相关事件发布到应用程序回调函数中的应用程序任务。
  • 应用程序任务(代码)通常将所有这些混合在一起,它调用api初始化系统/WiFi,并在必要时处理事件。
    • The WiFi driver can be consider as black box, it knows nothing about the high layer code, such as TCPIP stack, application task, event task etc, all it can do is to receive API call from high layer or post event queue to a specified Queue, which is initialized by API esp_wifi_init().
  • The event task is a daemon task, which receives events from WiFi driver or from other subsystem, such as TCPIP stack, event task will call the default callback function on receiving the event.
  • For example, on receiving event SYSTEM_EVENT_STA_CONNECTED, it will call tcpip_adapter_start() to start the DHCP client in it’s default handler.
  • Application can register it’s own event callback function by API esp_event_init, then the application callback function will be called after the default callback. Also, if application doesn’t want to execute the callback in the event task, what it needs to do is to post the related event to application task in the application callback function.
  • The application task (code) generally mixes all these thing together, it calls APIs to init the system/WiFi and handle the events when necessary.

tcp-client

在这里插入图片描述
在这里插入图片描述

GPIO

  • 注册一个gpio中断:

  • 1.创建一个gpio_config_t结构体,配置gpio_config_t结构体变量

  • 2.使能gpio_config_t结构体gpio_config(&io_conf)

  • 3.使用gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT)允许每个GPIO注册中断处理程序

  • 4.注册中断gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0)

  • 以上就是esp32注册一个中断的步骤,注意不再使用中断时释放中断gpio_isr_handler_remove(GPIO_INPUT_IO_0)

  • 同时说明,在FreeRTOS里面,一般不会在中断处理函数里面做太多东西,PS:RTOS嵌入式实时操作系统,一般的做法是间接通过一个等待队列来通知中断的发生,这样做的目的可大大减少中断处理函数花费的时间,达到实时目的。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值