一、项目介绍
基于NXP i.MX RT1021跨界MCU实现一个简单的波形采集,使用了RT1021设计了一个简单的核心板,然后使用信号发生器产生波形,使用ADC采集,把数据通过串口输出给PC端的串口调试助手,然后在PC端的串口调试助手中显示波形。
二、项目设计思路(含设计框图)
(在介绍之前,我原先是想参照官方给的设计文件,设计一个核心板,再去外接一个屏幕去设使用LVGL,但是因为调试和设计等问题,还有经验不充分,导致最后只有一个核心板,没有时间进行编程和学习,只能使用一个adc去实现一个简单的显示。
硬件部分:
- 单片机选用规定的RT1021芯片,100引脚且LQFP封装,焊接时,先往一个引脚上锡,然后固定位置,接下来四个方位全部上锡,然后拖一下把多余的划掉。
- 参考了官方的手册,有一些设计需要注意,比如32k的晶振,电源设计也参考了官方套件。
- 基于核心板有两个按键,reset按键和BOOT按键,同时添加了四个led灯,以及一个电源灯和一个状态灯。
- 核心板实物测试过程比较简单,拿到板子后,从芯片开始焊接,使用手机开微距看引脚情况,然后优先芯片等器件,再焊接其他的阻容元件,最后连接typec简单看一下情况,然后进行各个电路的测试。
软件部分:
在项目中,由于功能较为简单,使用的资源并不多,只使用了一个adc和一个串口,基本上就没有其他的配置了,需要考虑的只有adc的采样率和最后串口如何在软件上显示数据,大致思路及操作如下。
- 环境配置:这个有两个方法,第一种是官方的环境,官网上有,SDK,MCUXpresso IDE ,我使用的是第二种,使用keil来配置,这个也比较简单,只需要去官方下一个RT1021的pack包,然后按照正常的导入方法即可。这个跟其他的配置差不多
- 准备:首先去找例程,官方有一些例子,然后也可去找别人的资源,找到之后就照着例子进行移植,然后配置自己的文件夹,最后调用一些函数去实现功能就可以了。
- 运行流程:首先由ADC去采集信号发生器产生的信号,这一部分需要配置ADC的采样率,然后将采样的值,存进一个数组里面,然后驱动串口,做一个循环,把这个数组的数据发送给串口端并打印出来,这一部分需要对adc的值进行电压转换,最后PC的VOFA+成功接收到数据并且显示波形即可。
- 单独部分代码解析和总体调试解析(见下面)。
代码和注释;
#include "headfile.h"
uint16_t adc_value;
uint8_t uart_data_out;
void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
{
if (kStatus_LPUART_RxIdle == status)
{
// 接收到数据后处理操作(此处暂时不处理)
}
handle->rxDataSize = 1;
handle->rxData = &uart_data_out;
}
int main(void)
{
DisableGlobalIRQ();
board_init();
// 初始化ADC_1通道0,采样精度为12位
adc_init(ADC_1, ADC1_CH0_B12, ADC_12BIT);
// 初始化UART_2,波特率为115200,TX引脚为B24,RX引脚为B25,并使能UART的接收中断
uart_init(USART_2, 115200, UART2_TX_B24, UART2_RX_B25);
uart_rx_irq(USART_2, 1);
// 配置接收缓冲区,用于接收一个字节的数据
uint8_t example_rx_buffer;
lpuart_transfer_t example_receivexfer;
example_receivexfer.dataSize = 1;
example_receivexfer.data = &example_rx_buffer;
// 注册UART的中断回调函数
lpuart_handle_t example_g_lpuartHandle;
uart_set_handle(USART_2, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
EnableGlobalIRQ(0);
while (1)
{
// 采集ADC数据
adc_value = adc_convert(ADC_1, ADC1_CH0_B12);
// 将ADC值通过串口发送
uart_putchar(USART_2, (uint8_t)(adc_value >> 8)); // 高8位
uart_putchar(USART_2, (uint8_t)adc_value); // 低8位
// 延时一段时间(可根据需要调整)
systick_delay_ms(10);
}
}
三、搜集素材的思路
首先本人没接触过恩智浦的,再加上没画过这种复杂一点的,所以学习的时间比较多,再加上调试花时间,所以最后没什么时间做程序,首先找资源,最先用的肯定是官方,官方的看完之后,因为那个套件很完善,我不需要这么多外设(暂时),所以又去找了别的核心板,然后我找到了前几年某个比赛的一个案例,接下来就是借鉴这些设计思路,然后因为我设计的时候布局没办法实现小尺寸,所以最后选择了大一点的布局,这样子方便布线。
四、画原理图、PCB制板过程中遇到的问题,以及解决方法
本次由于这个开发板相对麻烦,所以我很大情况下都是按照官方手册做的设计,再加上本人平时全做的软件编程,极少接触pcb设计,虽然上一次活动已经稍微熟悉kicad,但是设计经验不足还是有很多问题,设计和版本兼容问题等等。
- 还是7.0新版本的问题KICAD要使用pwr——flag连接
- 连接标签的时候没有对准拉出来的引脚,这个要求比较严格,所以DRC检查会报错。
- 个人经验问题,一开始不打算做标签化设计,但是最后因为元件数量多,还是改了标签,这个设计挺奇怪的。
- 错误四,原理图更新PCB的时候,有一些外部导入的库没有给引脚编号。
- 所有的封装库和符号库都是自建的,本次因为一些引脚封装不一样,还自己画了一些封装,还有硬禾官方的那个libirary也有很多,除此之外有很多资料来源于SnapEDA(我的库大多从这下载),
五、实现结果展示(调试过程中遇到什么问题)
核心板的正反两面
展示部分:
板卡ADC采集信号,分别是三种波形,正弦波,三角波和方波,三角波还改变了一下幅值。
下面四张图按照顺序就是,正弦波,方波,三角波2v,三角波2.5V
硬件调试问题:
目前有以下几个:
1、上电发现LED没亮,然后发现稳压二极管很烫,去查了芯片手册,发现不行,然后1N5819换成了1N4007,再测试,二极管引脚电压正常
2、点亮led的时候没有反应,然后发现焊接焊反了(不应该)
3、因为这次没有风枪,晶振没焊接好,然后导致测试的时候没反应,然后老样子,用示波器看晶振是否起振,发现焊接问题后重新焊接
软件调试问题:
本次软件调试较为简单,代码也非常容易,没有什么明显的问题,除了配置环境的时候麻烦一些,但是有教程,还算轻松。
六、在芯片设计过程中,遇到什么难题以及解决方法,或未来针对这个芯片的扩展项目
- 布局布线,总之,我学习的板子,其尺寸要小的很多,但是我自己设计的时候,我没办法做到这种程度,最终还是自己去改布局布线。
- 这次我本来想做LVGL的,就是个核心板,加上个屏幕,简单点就是实现一个UI交互,但是没办法,理想和现实不是一个东西,最终也只是简单完成了核心板,没有太多时间去做LVGL的编程,后续有时间学习一下LVGL再实现吧。
七、芯片的优势与局限
优势:
-
高性能:RT1021搭载了Cortex-M7内核,运行频率高达500MHz,拥有强大的计算和处理能力,适用于需要高性能的应用场景。
-
强大的外设:RT1021配备了丰富的外设,包括多个UART、SPI、I2C、USB等接口,以及多个定时器和PWM模块,满足了各种应用的需求。
-
强大的多媒体支持:RT1021集成了2D图形加速器和LCD控制器,支持多媒体应用,适合嵌入式图形界面和显示控制应用。
-
丰富的存储器:RT1021具备大容量的Flash存储器和RAM,可满足复杂应用程序和数据存储需求。
-
低功耗特性:虽然性能强大,但RT1021仍能在低功耗模式下运行,支持多种低功耗模式,有助于节能延长电池寿命。
-
完善的开发支持:NXP提供了完善的开发工具和支持,包括MCUExpresso IDE和SDK,方便开发人员快速开发应用。
局限性:
- 价格较高:由于其高性能和丰富的外设,RT1021的价格相对较高,可能不适合一些低成本的应用场景。
- 复杂性:RT1021是一款高性能MCU,其复杂性相对较高,对于初学者可能需要较长的学习和开发时间。
八、原理图/PCB图(放在项目附件)
这是大概的截图,原理图和PCB:
九、可编译下载的代码(放在项目的附件,用于验证)
代码注释都有解释了
全部完整资源见百度网盘链接:
链接:https://pan.baidu.com/s/1j9ZlGCRMLyUdoiHH7h34ig?pwd=6666
提取码:6666
我不确定压缩完后的放在附件里面的文件是否可以正常使用