Hexo


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

EPS32 WIFI的基本使用

发表于 2021-09-16
字数统计: 2.2k | 阅读时长 ≈ 9

主要函数解析

函数esp_netif_init()

esp_err_t esp_netif_init(void)

​ ESP32的WIFI连接是基于TCP服务的。这个函数的作用就是初始化底层的TCP/IP堆栈。可以说ESP32的WIFI模块依赖于这个函数。在使用WIFI之前需要先利用这个函数初始化TCP/IP。

函数esp_event_loop_create_default()

esp_err_t esp_event_loop_create_default(void)

​ 在例程中ESP32的使用是基于esp自带的一个esp-event事件组的。这个函数的作用就是创建一个默认的esp事件组并且不断的循环它。

​

函数esp_netif_create_default_wifi_ap()

esp_netif_t *esp_netif_create_default_wifi_ap(void)

​ 这个函数的作用就是创建默认的WIIF-AP,就是说创建一个默认的AP模式的WIFI。

阅读全文 »

EPS32 串口的基本使用

发表于 2021-09-11
字数统计: 2.5k | 阅读时长 ≈ 10

使用串口的基本流程

  1. 使用结构体uart_config_t 来为串口设置参数(波特率,停止位,是否有奇偶校验等)
  2. 利用函数uart_set_pin来设置串口的引脚映射(没有映射的话就默认为原来的)ESP32的串口管脚可以任意映射到其他管脚上,就是说任意两个PIN脚都可以作为串口的输出输入脚来使用
  3. 利用函数uart_driver_install来为ESP32安装串口驱动
  4. 串口应用函数的使用,即按照用户要求在任务中调用串口的收发函数
  5. 使用串口的中断(可选)
  6. 串口卸载(基本不常用)
阅读全文 »

EPS32 软件定时器的基本使用

发表于 2021-09-09
字数统计: 1.8k | 阅读时长 ≈ 7

概述

​ esp_timer相当于一个高分辨率的软件定时器,并且可以将ESP32从睡眠中唤醒。可以将其类比为FreeRTOS的定时器,但是这二者之间也是有区别的。

​ FreeRTOS的定时器定时周期不得小于其RTOS的滴答周期,并且FreeRTOS的定时器是从一个优先级较低的任务中调用的(虽然这个任务的优先级也是可以调高的)。但是esp_timer就不受这两者的限制。

​ 虽然如此但也是要注意,由于esp_timer回调函数的优先级很高,所以回调函数中不能执行很多命令(很大程度上会影响系统的实时性),还是老规矩,中断中尽量只是标记信号量,处理函数还是放到任务中去执行。

​ 并且这个定时器的回调函数也是会被其他更高优先级的任务抢占的,比如说 SPI FALSH操作。但是这种一般可以暂时先不考虑。

​ 周期性esp_timer还会对最小计时器周期施加50us的限制。周期小于50us的定期软件计时器不切实际,因为它们会占用大部分CPU时间。如果发现需要一个短周期的计时器,请考虑使用专用的硬件外设或DMA功能。(太短的定时也不太现实)

阅读全文 »

ESP32 GPIO基本使用

发表于 2021-09-08
字数统计: 1.9k | 阅读时长 ≈ 7

关于ESP32-C3工程的建立

​ 目前为止,我仍然采用的ESPIDF中的example作为一个最基本的工程,然后在此基础上在加以修改(比较笨,之后找到好的办法再说)

​ Ctrl + shift + p可以打开VSCODE的交互界面

之后便可以在这其中选择一个作为工程来创建如图

阅读全文 »

点亮HPDL-1414

发表于 2021-09-06
字数统计: 663 | 阅读时长 ≈ 3

手册中的一些重要信息

供电电压

相关引脚与引脚作用

​ WR信号可以看作触发器的时钟信号,只有WR为低电位时被A0、A1选中的段才会改变,否则显示之前的字符,这样就可以同时控制多个HPDL 1414了,A0、A1、D0~D6都可以复用只要单独控制WR即可。

阅读全文 »

如何把程序固化在FPGA中

发表于 2021-07-13
字数统计: 719 | 阅读时长 ≈ 2

​ 在之前的LED流水灯测试中使用的是“.sof”文件格式,这种烧录方式在开发板断电后程序会丢失。如果想在开发板掉电后程序不丢失的话那么就要利用JTAG 烧写“.jic”文件实现程序掉电不丢失。

​ 但是.jic文件的生成需要使用.sof来进行转化,手动生成

代码配置以及芯片的选择

存储芯片的选择(ROM)

​ 要掉电不丢失代码,代码就要存储在ROM 里,FPGA Cyclone 芯片本身是没有带ROM的,需要外挂这样的存储芯片。由于外挂怎样的存储芯片和FPGA芯片以及FPGA程序设计有关,因此FPGA软件需要根据外围配置的存储芯片进行选择。

​ 凌智电子的FPGA开发板采用的是EPCS4配置芯片, 有时候Quartus II 软件可以自动识别该芯片,为了识别不出错,在使用下载前进行配置选择,并在下载后,先给开发板断电再拔掉下载线,否则代码可能无法生效。

阅读全文 »

FPGA流水灯的实现

发表于 2021-07-12
字数统计: 1.7k | 阅读时长 ≈ 6

今天是11号,他妈的,有时候我也搞不懂自己为什么要抱着侥幸心理去做这种乱七八糟没有把握的事情。之后只好硬着头皮弄了。总之先把频率计和AD采样给实现了吧

使用Quartus II建立第一个工程

首先要先新建一个文件夹来存放Quartus的工程文件,要注意的是不要怕存在中文路径,如图

阅读全文 »

状态机

发表于 2021-07-09
字数统计: 1.4k | 阅读时长 ≈ 5

状态机

​ 对于FPGA而言,它的编程语言是Verilog,这是一款硬件描述语言硬件电路是并行执行的,当需要按照流程或者步骤来完成某个功能时,代码中通常会使用很多个if嵌套语句来实现,这样就增加了代码的复杂度,以及降低了代码的可读性,这个时候就可以使用状态机来编写代码。

​ 状态机相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。

有限状态机(Finite State Machine/FSM)

​ 在有限个状态之间按一定规律转化的时序电路

状态机的种类

​ 根据状态机的输出是否与输入条件相关,可将状态机分为两大类,即摩尔(Moore)型状态机和米勒(Mealy)型状态机。

阅读全文 »

CubeMX F407 利用TIM输入捕获来测量方波的频率与占空比

发表于 2021-05-29
字数统计: 1.9k | 阅读时长 ≈ 7

思路

主要是利用到了STM32的TIM输入捕获功能

将定时器设置为1MHZ的计数频率,定时计数器增加一就是增加1us

  1. 首先设置为上升沿捕获,捕获上升沿记录此刻的时间计数值;
  2. 然后切换为下降沿捕获,捕获下降沿记录此刻的时间计数值;
  3. 最后设置为上升沿捕获,捕获上升沿记录此刻的时间计数值;

对于16bit定时器,最大可计数0xFFFF,也就是65535us,那么:*高电平持续的时间 = 定时器溢出计数 * 0xFFFF + 当前计数值*
对于32bit定时器,最大可计数0xFFFFFFFF,也就是4294.967295s,这个时间足够测量脉冲宽度的了,那么:高电平持续的时间 = 当前计数值

高电平持续的时间 = ② - ①
周期 = ③ - ①

阅读全文 »

CubeMX F407 DAC输出正弦波

发表于 2021-05-27
字数统计: 1.8k | 阅读时长 ≈ 7

思路

​ 简单说下思路,STM32自带一个两路独立输出的DAC。要输出正弦波,实质是要控制 DAC 以 v=sin(t)的正弦函数关系输出电压,其中 v 为电压输出,t 为时间。 而由于模拟信号连续而数字信号是离散的,所以使用 DAC 产生正弦波时,只能按一定时间间隔输出正弦曲线上的点,在该时间段内输出相同的电压值,若缩短时间间隔,提高单个周期内的输出点数,可以得到逼近连续正弦波的图形,见下图 37-3,若在外部电路加上适当的电容滤波,可得到更完美的图形。

正弦波

​ 由于正弦曲线是周期函数,所以只需要得到单个周期内的数据后按周期重复即可,而单个周期内取样输出的点数又是有限的,所以为了得到呈 v=sin(t)函数关系电压值的数据通常不会实时计算获取,而是预先计算好函数单个周期内的电压数据表,并且转化成以 DAC 寄存器表示的值。 如 sin 函数值的范围为[-1: +1],而 STM32 的 DAC 输出电压范围为[0~3.3]V,按 12 位 DAC 分辨率表示的方法,可写入寄存器的最大值为 212 = 4096,即范围为[0:4096]。所以,实际输出时,会进行如下处理:

  1. 抬升 sin 函数的输出为正值:v = sin(t)+1 ,此时,v 的输出范围为[0:2];
  2. 扩展输出至 DAC 的全电压范围: v = 3.3*(sin(t)+1)/2 ,此时,v 的输出范围为[0:3.3], 正是 DAC 的电压输出范围,扩展至全电压范围可以充分利用 DAC 的分辨率;
  3. 把电压值以 DAC 寄存器的形式表示:Reg_val = 212/3.3 * v = 211*(sin(t)+1),此时,存储到 DAC 寄存器的值范围为[0:4096];
  4. 实践证明,在 sin(t)的单个周期内,取 32 个点进行电压输出已经能较好地还原正弦波形,所以在 t∈[0:2π]区间内等间距根据上述 Reg_val 公式运算得到 32 个寄存器值,即可得到正弦波表;
  5. 控制 DAC 输出时,每隔一段相同的时间从上述正弦波表中取出一个新数据进行输出,即可输出正弦波。改变间隔时间的单位长度,可以改变正弦波曲线的周期。

所以正弦波表如下

uint16_t Sine12bit[32] = {
    2048    , 2460    , 2856    , 3218    , 3532    , 3786    , 3969    , 4072    ,
    4093    , 4031    , 3887    , 3668    , 3382    , 3042    ,2661    , 2255    , 
    1841    , 1435    , 1054    , 714    , 428    , 209    , 65    , 3        ,
    24        , 127    , 310    , 564    , 878    , 1240    , 1636    , 2048
};

CubeMX以及代码的配置

DAC

DAC
  • OUT1/2 Configuration:

    对应着两个输出通道

  • External Trigger:

    是否使用外部中断触发 外部中断EXTI9 触发 就是使用外部中断来触发DAC。

  • Output Buffer:

    使能DAC输出缓存。

    DAC 集成了 2 个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个 DAC 通道输出缓存可以通过设置 DAC_CR 寄存器的 BOFFx 位来使能或者关闭。如果带载能力还不行,后面就接一个电压跟随器,选择运放一定要选择电流大的型号。
    使能输出缓冲后,DAC 输出的最小电压为 0.2V,最大电压为 VREF±0.2,而未使能输出缓冲则输出可达到0V。

    DACBUFF

  • Trigger:

    选择DAC的触发方式

    Timer 2/4/5/6/7/8 Trigger Out event 定时器触发,利用这种方式可以输出特定的波形。在这里我们选择定时器2。

    Software trigger 软件触发,在本模式下,向 DAC_SWTRIGR 寄存器写入配置即可触发信号进行转换。

  • Wave generation mode:

    波形发生器的选择,有三角波,和噪声,由于这里我们要输出正弦波,所以就不选择了

阅读全文 »

CubeMX F407串口以及串口中断的使用

发表于 2021-05-26
字数统计: 413 | 阅读时长 ≈ 1

​ 最近赶上电赛,为了驱动串口屏,同时方便调试,所以尝试着用串口2来为串口屏发送数据,串口1用于显示数据来进行调试

如图是STM32F407的串口引脚分布图

STM32F407串口分布图

F407 系统控制器有四个 USART 和两个 UART,其中USART1和USART2时钟来源于 APB2 总线时钟,其最大频率为 84MHz,其他四个的时钟来源于 APB1 总线时钟,其最大频率为 42MHz。UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。

##

阅读全文 »

图床测试

发表于 2021-05-24
字数统计: 74 | 阅读时长 ≈ 1

小练习

利用 STM32 驱动 AD9833 并调整它的频率

由于我没有电源,所以不能再外接运放来调整它的幅值,暂时先调整频率

再利用STM32的ADC去采集AD9833的输出信号,并存储在数组中做一次4096点的FFT变换

QQ23.png

gitee的图床测试

12<i class="fa fa-angle-right"></i>

23 日志
8 标签
© 2021 WJ
本站访客数 人次 本站总访问量 次