- 2023-09-02
-
发表了主题帖:
【AG32VF407测评】学习SPI Flash读写测试
今天写一篇大佬lenxvp发的SPI,个人感觉这个芯片非常的神奇,经过些时间的学习,体会到了更上一层楼的感觉,所以特意发一篇出来。
先说一个SPI的特点和问题点,
当实现对板载SPI_FLASH的读写操作时,需要注意以下几点1:
不同型号的SPI_FLASH在命令和支持的参数上可能存在差异,因此需要根据具体的型号和规格进行操作。
可以使用SFUD(串行 Flash 通用驱动)等工具来规避不同型号的SPI_FLASH之间的差异,并实现统一管理。
添加分区管理功能可以更好地管理SPI_FLASH中的数据,例如将数据存储在不同的区域或对数据进行分类。
可以使用flash实现数据库管理,例如将数据存储在数据库中,以便于查询、修改和删除等操作。
扩展SPI外设的开发可以增加更多的功能和性能,例如增加更多的控制指令、优化数据传输速度等。
AG32VF407的Flash-SPI控制器是一个用于控制SPI通信的模块,它支持使用SPI协议对Flash存储器进行读写操作。
该控制器包括以下3组17个寄存器:
控制寄存器(CTRL):用于配置和控制SPI控制器的操作。
段控制寄存器(PHASE_CTRL):每个段控制寄存器都可以独立配置,用于控制每个段的子操作。
段数据寄存器(PHASE_DATA):用于存储每个段的数据。
Flash-SPI控制器可以将一轮完整的读写或配置等操作细分为8个以下的段(PHASE),每个段都可以配置为独立的子操作,例如读写数据、读取数据等。通过映射引脚的方式,可以将SPI0和SPI1连接到Flash存储器上,从而使用这两个SPI接口来控制Flash的读写操作。
以上这些都是在网站上查询的,可能个别有一些区别。
1、原理图:
MCU引脚连接:
Flash实物位置:
2、SPI的使用方法与特点:
3、读取时序与框架:
4.代码的分析,这个写的非常的好,所以贴出来,让我一下就明白了用处:
这段代码是C语言编写的,用于与SPI(串行外设接口)闪存进行通信并获取其相关标识信息。让我逐行解释一下代码的各个部分。
第1行:
cuint32_t eid = SPI_FLASH_ReleaseDP(spi);
这行代码调用了名为SPI_FLASH_ReleaseDP的函数,它将spi作为参数传递给该函数。该函数的目的是释放双端口(DP)的SPI闪存。该函数的返回值被存储在名为eid的变量中。uint32_t是一个无符号32位整数类型,用于表示eid变量的数据类型。
第2行:
cprintf("Electronic ID: 0x%x\n", eid);
这行代码使用printf函数打印一条消息,消息的内容是"Electronic ID: 0x%x\n"。其中,%x是一个格式说明符,表示以16进制格式打印变量eid的值。
第3行:
cuint32_t rdid = SPI_FLASH_ReadID(spi);
这行代码调用了名为SPI_FLASH_ReadID的函数,它将spi作为参数传递给该函数。该函数的目的是读取SPI闪存的ID。该函数的返回值被存储在名为rdid的变量中。
第4行:
cprintf("RDID: 0x%06x\n", rdid);
这行代码使用printf函数打印一条消息,消息的内容是"RDID: 0x%06x\n"。其中,%06x表示以16进制格式打印变量rdid的值,并保留至少6位数的宽度。
第5行:
cuint32_t mfid = SPI_FLASH_ReadManufacturerID(spi);
这行代码调用了名为SPI_FLASH_ReadManufacturerID的函数,它将spi作为参数传递给该函数。该函数的目的是读取SPI闪存的制造商ID。该函数的返回值被存储在名为mfid的变量中。
第6行:
cprintf("MFID: 0x%04x\n", mfid);
这行代码使用printf函数打印一条消息,消息的内容是"MFID: 0x%04x\n"。其中,%04x表示以16进制格式打印变量mfid的值,并保留至少4位数的宽度。
第7行:
cuint32_t uniqueID[4] = {0, 0, 0, 0};
这行代码定义了一个名为uniqueID的数组,该数组包含4个无符号32位整数元素,并将所有元素初始化为0。这个数组用于存储SPI闪存的唯一ID。
第8行:
cuint64_t mcycle = UTIL_GetMcycle();
这行代码调用了名为UTIL_GetMcycle的函数,该函数返回当前CPU的时钟周期数(以64位无符号整数表示)。返回的值被存储在名为mcycle的变量中。这个变量用于计算执行读取唯一ID操作所需的时间。
第11行:
cSPI_FLASH_ReadUniqueID(spi, uniqueID, spi_dmac_channel);
这行代码调用了名为SPI_FLASH_ReadUniqueID的函数,它将spi、uniqueID和spi_dmac_channel作为参数传递给该函数。该函数的目的是读取SPI闪存的唯一ID,并将结果存储在数组uniqueID中。注意,这行代码在注释中被标记为//注释符号,这意味着它被程序员暂时删除或不需要执行。可能是因为代码在某些条件下或特定情况下才会执行此行。
第12行:
cmcycle = UTIL_GetMcycle() - mcycle;
这行代码获取当前CPU的时钟周期数,然后减去第8行获取的初始时钟周期数,得到执行读取唯一ID操作所需的时间(以时钟周期数表示)。结果被存储在变量mcycle中。
第13行:
cprintf("Unique id: 0x%08x%08x%08x%08x
5.输出结果,相关的我就没有更改:
- 2023-08-28
-
回复了主题帖:
【测评入选名单公布】ST多款开发板返场测评
个人信息无误,确认可以完成评测计划
- 2023-08-19
-
回复了主题帖:
【AG32VF407测评】串口printf调试输出
吾妻思萌 发表于 2023-8-19 17:06
万物先点灯
灯玩亮了,后面的才好玩
-
回复了主题帖:
【AG32VF407测评】串口printf调试输出
火辣西米秀 发表于 2023-8-19 09:28
串口printf调试输出,灯已经点亮了
有点灯的程序在里面
- 2023-08-18
-
发表了主题帖:
【AG32VF407测评】串口printf调试输出
开发平台:Visual Studio Code
下载器:JLINK V8
开发板:AGM TCK AG32VF407VGT6
目地:在Visual Studio Code终端打印meiyao
下面开始进行。
1、原理图:
2、连接照片:
3.相关代码:
void TestUart(void)
{
#ifdef LOGGER_UART
// Wait for existing UART transmit to finish
while (UART_IsTxBusy(MSG_UART));
const char txbuf[] = "This quick brown fox jumps over the lazy dog!\n";
const char rxbuf[256];
SYS_EnableAHBClock(AHB_MASK_DMAC0);
DMAC_Init();
UART_Init(MSG_UART, BAUD_RATE, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_16);
UART_SetDmaMode(MSG_UART, UART_DMA_RX_TX);
const volatile uint32_t dma_count = sizeof(txbuf) - 1; // Strip the ending '0'
uint8_t tx_dma_req = UARTx_TX_DMA_REQ(LOGGER_UART);
uint8_t rx_dma_req = UARTx_RX_DMA_REQ(LOGGER_UART);
uint32_t tick0 = UTIL_McycleToUs(UTIL_GetMcycle());
DMAC_Config(DMAC_CHANNEL0, (uint32_t)txbuf, (uint32_t)&MSG_UART->DR,
DMAC_ADDR_INCR_ON, DMAC_ADDR_INCR_OFF,
DMAC_WIDTH_8_BIT, DMAC_WIDTH_8_BIT,
DMAC_BURST_1, DMAC_BURST_1,
dma_count, DMAC_MEM_TO_PERIPHERAL_DMA_CTRL,
0, tx_dma_req);
DMAC_Config(DMAC_CHANNEL1, (uint32_t)&MSG_UART->DR, (uint32_t)rxbuf,
DMAC_ADDR_INCR_OFF, DMAC_ADDR_INCR_ON,
DMAC_WIDTH_8_BIT, DMAC_WIDTH_8_BIT,
DMAC_BURST_1, DMAC_BURST_1,
0, DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL, rx_dma_req, 0);
while (DMAC_IsEnabledChannel(DMAC_CHANNEL0));
uint32_t tick1 = UTIL_McycleToUs(UTIL_GetMcycle());
printf("UART TX DMA of %d bytes finished after %d us.\n", dma_count, tick1 - tick0);
printf("meiyao\n");
#endif
}
4、打印出来的数据:
-
回复了主题帖:
【获奖名单】【参会4次及以上】Microchip 安全系列研讨会第19场-第26场
已回复中奖信息,谢谢!
- 2023-08-17
-
回复了主题帖:
免费领天线设计和选择秘籍,将无线设备的功耗打下来~(射频小白翻身)
-
回复了主题帖:
有奖直播:NXP 汽车系统电源管理开讲啦,从功能安全架构到新品FS26,预约有礼~
已报
- 2023-08-16
-
回复了主题帖:
【AG32VF407测评】环境搭建时问题解决分享
火辣西米秀 发表于 2023-8-13 22:04
用jink下载时出现终端进程终止的问题怎么解决的呢,
有可能是你少了什么东西,我第一个贴子你看看,当时我进行的时候我是遇到了一些问题,弄好蛮久才搞定。
- 2023-08-11
-
回复了主题帖:
【国产芯AGM AG32VF407】-点灯
火辣西米秀 发表于 2023-8-10 07:32
编辑框的相关代码要一一对应这就懂了
- 2023-08-08
-
发表了主题帖:
【国产芯AGM AG32VF407】-点灯
前几天弄环境弄了几天,最后终于解决了,还把问题点弄清楚了,今天先来点灯,可以为后续准备。
开发平台:Visual Studio Code
下载器:JLINK
开发板:AGM TCK AG32VF407VGT6
目地:点亮LED灯,并闪烁。
下面开始点灯:
1、原理图:
G32VF407和STM32F407的GPIO不完全相同,AG32VF407使用PIN_XX的格式来定义每个引脚,其中XX与原理图芯片对应引脚的编号一致,与STM32对比,举例来说,PA6对应PIN_31,PA7对应PIN_32。
这意味着在AG32VF407的SDK中,你需要使用PIN_31来控制PA6引脚,使用PIN_32来控制PA7引脚。需要注意的是,虽然AG32VF与STM32F407具有相似的脚功能,但是他们的引脚命名并完全一致,因此在使用AG32VF407时需要根据具体的引脚编号进行设置。
2、在Visual Studio Code使用并下载代码在开发板中,具体方法如下:
注意图片中的相关菜单,不能弄出,还有编辑框的相关代码,一定要一一对应。
上传烧录VE:
上传VE成功后,就可以点左下角的勾进行下载在开发板中.
3.相关代码:
[setup]
boards_dir = boards
board = agrv2k_407
board_logic.ve = example_board.ve
framework = agrv_sdk
program = agm_example
src_dir = src
include_dir = src
src_filter = "-<*> +<*.c>"
lwip_imp_dir =
tinyusb_imp_dir =
logger_if = UART0
upload_port = COM3
monitor_port = COM3
monitor_speed = 115200
debug_speed = 10000
debug_tool = jlink-openocd
upload_protocol = jlink-openocd
[setup_rtt]
logger_if = RTT
monitor_port = socket://localhost:19021
[platformio]
boards_dir = ${setup.boards_dir}
src_dir = ${setup.src_dir}
include_dir = ${setup.include_dir}
default_envs = dev
[env]
platform = AgRV
extends = setup
[env:dev]
build_type = debug
[env:release]
build_type = release
[env:rtt]
build_type = debug
extends = setup_rtt
[env:serial]
build_type = release
upload_protocol = serial
upload_speed = 115200
custom_speed = 115200
#define LED_D3_GPIO GPIO4
#define LED_D3_GPIO_BITS (1 << 3)
SYS_EnableAPBClock(APB_MASK_GPIO4);
GPIO_SetOutput(LED_D3_GPIO, LED_D3_GPIO_BITS);
GPIO_SetHigh(LED_D3_GPIO, LED_D3_GPIO_BITS);
int counter = 0;
while (1) {
UTIL_IdleMs(10);
GPIO_Toggle(LED_D3_GPIO, LED_D3_GPIO_BITS);
printf("test %d \r\n", counter++);
}
TestGpio();
4、显示闪烁视频
[localvideo]12a8cc5a47d5036c621335d70448f321[/localvideo]
- 2023-08-05
-
发表了主题帖:
【AG32VF407测评】环境搭建时问题解决分享
收到AG32开发板有一定的时间了,自从收到管理的信息就一直在弄个环境问题,最终在今天才正式配好,下面说一下情况,先简单介绍一下。
AG32是一款基于VSCode来搭建的IDE开发环境,编辑、调试、烧录也都基于此。在Demo里,example.c中的main总领了全部的驱动测试入口;board_init函数中,可以看到所有的GPIO初始化和LED灯的控制。
初次使用时,请按照以下几个步骤来搭建环境:
下载安装软件和SDK:安装AG32 IDE和AG32 MCU SDK。
配置环境变量:将AG32 IDE和AG32 MCU SDK的路径添加到系统环境变量中。
打开AG32 IDE:双击桌面上的AG32 IDE图标或者在开始菜单中找到AG32 IDE并打开。
基本是按照官方给与的步骤,而且是一步都没有错,东西就是出不来,而且显示状态都是一样,就是不能编译和下载,下载是有个小插曲,(没有上电下载) 。下面给解决的办法:
官方给的资料:
AG32开发环境搭建:http://bbs.eeworld.com.cn/elecplay.php?action=show&op=download&id=279&did=3
AG32在VSCode下的使用入门_20230423:http://bbs.eeworld.com.cn/elecplay.php?action=show&op=download&id=279&did=4
需要的 PC 环境:64 位系统,Win8.1/Win10/Win11 (注:不支持 Win7)
开发软件包及 SDK 下载:
百度网盘:https://pan.baidu.com/s/17bp-zAnsYRuVMRTSSVHN5A
提取码:12ej
初次使用时,请按照以下几个步骤来搭建环境:
1. 下载安装软件和 SDK:
2. 安装 VSCODE(开发中的 IDE);
3. 安装 python;
4. Vscode 中配置 SDK 环境;
5. 编译 demo 样例程序;
具体的操作方法官方的非常详细,而且相关的也讲的非常细。
下面还是贴几个连接:
https://zhuanlan.zhihu.com/p/165379391
https://blog.csdn.net/Chinese_chen_/article/details/130733235
https://zhuanlan.zhihu.com/p/472574032
www.cnblogs.com/wanghaining/p/vscode-python.html
问题点:
用jink下载时出现终端进程“C:\Users\Yao\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'”已终止,退出代码: 1。
终端进程“C:\Users\Yao\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'”已终止,退出代码: 1。
(还有一个很严重的问题,没有保存下来,只能略过了,上面的两个问题稍微好解决一点。)
解决办法:
2022 Visual Studio Code配置Python环境(保姆级)
https://blog.csdn.net/qq_42228145/article/details/114673705
这个里面有个PIP的。
yapf是一个代码格式化工具,可以一键美化代码。
安装过程如下:
1、在cmd输入pip list检查是否已存在需要的包
(没有成功的时候,输出前面两个)
2、输入pip install flake8下载安装flake8
3、输入pip install yapf下载安装yapf
附:更新pip到最新版本
python -m pip install --upgrade pip
最开始是进了这个里面看,里面有一个PIP
【Python基础知识】在VSCode中怎么配置Python开发环境?真的超简单!_python_Python_学长-云原生技术专区 (csdn.net)
总感少了点什么:
最后到这里,环境的问题算是解决了,最终可以正常编译下载了。
不知道有多开心。。。。。
- 2023-07-17
-
回复了主题帖:
测评入围名单: 国产芯AGM AG32VF407(MCU+FPGA)
个人信息无误,确认可以完成评测计划
- 2023-07-08
-
发表了主题帖:
运算放大器权威指南读后感
收到书有些天了,一直抱着这个书在用心的学习,今天分享一下我读到的内容;
1、先来个书的正面照片
目录:
2、网上找的资料,这个书的简单介绍,我看了一下讲的还蛮好的,所以贴出来分享一下:
《运算放大器权威指南》,人民邮电出版社出版,外文书名: Op Amps for Everyone, 4e,作者:卡特 (Bruce Carter) (作者), 孙宗晓 (译者)。本书是运放电路设计方面的一部重要著作,最早以德州仪器(TI)公司的设计参考文档(DesignReference)SLOD006B的形式出现在TI公司的网站上,后来出版了单行本,并经多次修订,目前已出到第4版。与前几版相比,第4版进行了相当大的修订,主要变化有:删除了一些理论性较强的内容以及关于正弦波振荡器的内容,对前几版中分散在不同章节中的一些主题类似的内容进行了整合,增加了关于极端环境下应用、稳压器设计及在线和离线的设计辅助工具等方面的内容。这些修订,可能与本书编著者、第3版主编BruceCarter于2009年从TI公司离职有关。这里我们不去追究背后发生的故事。
近年来,信号链设计的概念被越来越多地提到。相比传统的模拟电路设计的提法,信号链设计更加侧重于从系统的角度看问题,将传感器、信号调理电路、模数转换器和电源(有时还有数模转换器和执行器)作为一个整体讨论。这样,系统设计指标的分配能够更加合理,传统上容易遇到的系统各部分在接口和指标上不匹配的问题,也能够通过对系统的彻底分析来避免。方案阶段的讨论越彻底,项目的实施就越顺利。
以运放电路设计为核心的信号调理电路设计,是信号链设计的主要内容:对于大多数应用领域,传感器和数据转换器属于定型产品,除了选型之外,能够做的具体工作并不多。这样,最终获取的信号质量,极大程度上取决于信号调理电路的设计。精心设计的信号调理电路能够提高信号质量,大大减轻后续的数据处理工作的难度;而对低质量的信号使用高级的数据处理方法,只能算是事后的补救措施,当作“最后一招”使用。因此,运放电路设计作为从源头上解决问题的方法,对系统指标的保证与提高,能起到事半功倍的效果。本书介绍的运放电路设计和信号链设计的方法,具有十分重要的参考价值。
从某种意义上说,模拟电路设计工作,就是不停地遇到和解决意料之外问题的过程。在遇到意料之外的问题时,有两种解决方法:一是做加法,二是做减法。例如,在系统遇到干扰时,可以利用做加法的方式,在系统中增加抑制干扰的器件;也可以利用做减法的方式,分析拾取干扰的回路,并将其断开。对于具体的问题,采用哪种方式,需要具体分析与权衡。然而一般来说,如果能够采取做减法的方式解决问题,那么对问题的解决,会比做加法的方式更加彻底,效果也会更好。本书中的很多例子,也体现了这一思想。
3、下面分享下同相放大电路:
在这些条件下,如果Vour/V=1,电路中的运算器会变为单位增益缓冲器,增益为1。在单位增益缓冲器中,一般不连接Re(开路),因此不会改变电路的效果。当Re开路时,它的值与增益无关,因此一般可以将Re短接。然而,有些运放在R短路时会自毁,因此很多缓冲器的设计中依然保留了电阻R。
此时,缓冲器中的电阻R;起到过压防护的作用。当有过电压时,通过限制流人反相输入端的电流(通常小于1mA),从而保护反相输入端免受过电压的损害。因此,电阻R可取任意值。
在电流反馈运放电路中,电阻R绝对不能省去,因为它决定了电流反馈放大器的稳定性。
与运放的失调电压有关的直流增益问题与如何使用单电源向运放供电密切相关。在运放电路中,有意引入直流电压。在前一章中,我们假设运放都使用双电源(或称分离电源)供电,这在电池供电的便携式设备中并不总成立。
给运放供电的双电源一般电压相等,极性相反,其中一个电源的中间抽头会接地。如果输入信号源的一端接地的参考点为地电位,那么输出也会自动以地电位为参考。
然而,在使用单电源向运放供电时,需要采取一些措施来解决出现的问题。例如,可以在运放的非输入端接地,添加虚拟地面电压(通常是半电源电压),以保证输入和输出参考点的正确性。
此外,还需要注意运放的零点漂移问题。零点漂移是由于环境温度变化等因素引起的失调电压,它会导致输出端的直流电压发生变化。为了解决这个问题,可以采用温度补偿、失调电压调整等技术措施。
总之,在使用单电源向运放供电时,需要考虑到一些特殊问题,并采取相应的措施来解决它们。
4、总结一下:
运算放大器是一种具有高度放大能力和广泛应用性的电子器件,在许多领域中都有广泛的应用。对于想要深入了解运算放大器的读者来说,选择一本权威的指南书是非常重要的。
在选择运算放大器权威指南书时,需要注意以下几点:
首先,这本书应该涵盖运算放大器的基本原理和应用。这包括对运算放大器的工作原理、特点、使用方法等进行详细介绍,同时提供丰富的实例和应用案例,以便读者能够更好地理解并掌握运算放大器的应用技巧。
其次,书中应该对不同类型的运算放大器进行详细的介绍和分析。每种类型的运算放大器都有其独特的特性和应用场景,通过比较和分析这些不同类型的运算放大器,可以帮助读者更好地选择适合自己需要的型号。
此外,书中还应该介绍运算放大器的一些重要参数和指标,如带宽、增益、噪声等。这些参数和指标对于正确选择和使用运算放大器至关重要。
最后,一本好的运算放大器权威指南书还应该包括一些实际应用案例和电路实例。这些案例和实例可以帮助读者更好地理解运算放大器的应用场景,并提高读者的实践能力。
总之,选择一本好的运算放大器权威指南书对于深入了解和掌握运算放大器的应用技巧非常重要。在阅读本书时,需要注意结合实际应用场景来理解和掌握运算放大器的知识。
- 2023-07-05
-
发表了主题帖:
【得捷电子Follow me第1期】任务1到4的经验总结(资料解释)
本帖最后由 meiyao 于 2023-7-7 08:55 编辑
任务1:熟悉micropython的基本语法
通过Raspberry Pi Pico w开发板,熟悉固件下载、Mu Editor软件的基本使用方法、micropython的基本语法。
安装必要的软件:
固件下载:访问Raspberry Pi Pico官方网站(https://www.pico-project.org/)下载适用于你的开发板的固件。
Mu Editor软件:访问Mu Editor官方网站(https://mueditor.com/)下载并安装适用于你的操作系统的版本。
1.下面是我的理解与介绍:
熟悉固件下载:接入设备,把编译好的文件直接拖入到开发板的U盘符下面;还有一种办法就是用Thonny直接运行。
Mu Editor软件的基本使用方法:Mu 是给初学者的 Python 编辑器,使用起来非常的便捷,很容易上手。在 Linux 或 macOS 电脑上,你只需打开一个终端,输入 python,你就会看到 Python shell。如果你使用的是 Windows 电脑,则需要先安装 Python,安装完成就可以进行Thonny的使用了.
打开Mu Editor。在电脑中安装并打开Mu Editor软件。
创建新的Python文件。点击"File"菜单,然后选择"New File",在弹出的对话框中选择Python文件类型。
编写Python代码。在新创建的Python文件中,可以输入任意的Python代码。
运行Python代码。在编辑完代码后,可以通过按下F5键或者点击工具栏上的"Run"按钮来运行代码。运行结果会显示在底部的输出窗口中。
调试Python代码。如果代码运行时出现错误,可以通过调试功能来定位问题。可以点击工具栏上的"Debug"按钮来启动调试模式。在调试模式下,可以单步执行代码、查看变量的值等操作。
保存Python文件。如果需要保存代码文件,可以点击"File"菜单,然后选择"Save"或"Save As"选项,在弹出的对话框中选择保存路径和文件名。
关闭Python文件。如果需要关闭当前编辑的Python文件,可以点击"File"菜单,然后选择"Close"选项,或者使用快捷键Ctrl+W。
退出Mu Editor。如果需要退出Mu Editor软件,可以点击"File"菜单,然后选择"Exit"选项,或者使用快捷键Ctrl+Q。
2.MicroPython的基本语法:
缩进:MicroPython的代码块通过缩进来标识作用域,与Python3相同,缩进可以使用空格或制表符,但是必须一致。
变量和数据类型:在MicroPython中,变量不需要预先声明,可以直接赋值。MicroPython支持多种数据类型,包括整数、浮点数、布尔值、字符串、列表、元组和字典等。
控制结构:MicroPython支持条件判断、循环、异常处理等基本控制结构。条件语句使用if、elif、else等关键字,循环语句使用for、while等关键字。
函数:MicroPython支持函数的定义和调用,函数可以包含参数和返回值,也可以使用默认参数和可变参数。
模块:MicroPython支持导入模块和自定义模块,模块可以包含多个函数和变量,可以通过import语句来导入。
异常处理:MicroPython支持异常处理,可以使用try、except、finally等关键字来捕获和处理异常。
文件操作:MicroPython支持文件的读写操作,可以使用open()函数打开文件,并使用read()、write()等方法来读取和写入文件内容。
系统接口:MicroPython提供了一些系统接口,可以访问硬件设备、操作系统功能等,例如time.sleep()函数可以暂停程序的执行一段时间.
3.下面是Thonny界面:
连接开发板:
将MicroPython开发板通过USB线连接到电脑。
确保电脑已经安装了适当的驱动程序。
编写micropython代码:
在Mu Editor中创建一个新的文件,例如main.py。
在文件中编写micropython代码,例如:
python
复制代码
from machine import Pin, I2C
i2c = I2C(scl=Pin(5), sda=Pin(4))
i2c.writeto(0x68, b'\x01\x00')
这个示例代码将向I2C设备发送一个写入命令。
编译和上传代码:
点击Mu Editor菜单栏的“工具”>“编译”,选择编译器(例如GCC)。
点击“编译”按钮,等待编译完成。
点击“上传”按钮,将编译好的代码上传到开发板。
查看运行结果:
在Mu Editor中点击“工具”>“监视器”,查看运行结果。
通过以上步骤,你可以熟悉micropython的基本语法,并在Raspberry Pi Pico w开发板上进行编程。
任务2:驱动外设
要驱动LED、OLED显示屏、蜂鸣器等外设,首先需要了解Raspberry Pi Pico w开发板的硬件配置和连接方式。然后,可以通过以下步骤进行操作:
安装必要的软件:
GROVE SHIELD:访问GROVE SHIELD官方网站(https://www.grovepico.com/)下载并安装适用于你的操作系统的版本。
GROVE OLED扩展板:访问GROVE OLED扩展板官方网站(https://www.grovepico.com/products/grove-oled-expander)下载并安装适用于你的操作系统的版本。
GROVE BUZZER扩展板:访问GROVE BUZZER扩展板官方网站(https://www.grovepico.com/products/grove-buzzer-expander)下载并安装适用于你的操作系统的版本。
连接开发板:
将GROVE SHIELD、GROVE OLED扩展板和GROVE BUZZER扩展板通过USB线连接到电脑。
确保电脑已经安装了适当的驱动程序。
编写micropython代码:
在Mu Editor中创建一个新的文件,例如main.py。
在文件中编写micropython代码,例如:
python
复制代码
from machine import Pin, I2C
from board import SCL, SDA
from grove_oled_8x8 import GroveOled
from grove_buzzer import Buzzer
i2c = I2C(SCL, SDA)
display = GroveOled(i2c)
buzzer = Buzzer()
这个示例代码将初始化GROVE SHIELD、GROVE OLED扩展板和GROVE BUZZER扩展板,并创建一个GroveOled对象和一个Buzzer对象。
控制外设:
通过编写micropython代码来控制LED、OLED显示屏和蜂鸣器等外设。例如:
python
复制代码
display.text('Hello, World!')
buzzer.on()
buzzer.off()
这个示例代码将在GROVE OLED显示屏上显示“Hello, World!”,并使蜂鸣器发出声音。
编译和上传代码:
点击Mu Editor菜单栏的“工具”>“编译”,选择编译器(例如GCC)。
点击“编译”按钮,等待编译完成。
点击“上传”按钮,将编译好的代码上传到开发板。
查看运行结果:
在Mu Editor中点击“工具”>“监视器”,查看运行结果。你将看到GROVE SHIELD、GROVE OLED扩展板和GROVE BUZZER扩展板上的LED、OLED显示屏和蜂鸣器的状态。
1.驱动LED、蜂鸣器等外设:
代码解析:
这段代码使用了 machine 和 time 模块来控制一个LED和一个蜂鸣器(beep)。
首先,导入了 machine 和 time 模块。然后,创建了一个LED引脚对象,将其设置为输出模式。
然后,创建了一个蜂鸣器引脚对象,也将其设置为输出模式。
进入一个无限循环(while (True)),在循环体中执行以下操作:
点亮LED(led.on())
点亮蜂鸣器(beep.on())
暂停1秒钟(time.sleep(1))
熄灭LED(led.off())
熄灭蜂鸣器(beep.off())
暂停1秒钟(time.sleep(1))
循环将不断重复上述操作,使得LED和蜂鸣器以一定的频率闪烁,具体的频率取决于代码中的时间延迟。
2.OLED显示屏:
代码解析:
这段代码是用于在RP2040微控制器上显示OLED(有机发光二极管)屏幕的示例代码。
代码导入了所需的模块:machine.Pin、machine.PWM、machine.I2C和ssd1306.SSD1306。
定义了常量WIDTH和HEIGHT,表示OLED屏幕的宽度和高度。
然后,创建了一个I2C对象i2c,用于与OLED屏幕进行通信。
接着,使用SSD1306 I2C()函数创建了一个SSD1306对象oled,该对象用于表示OLED屏幕,并传递了WIDTH、HEIGHT和i2c作为参数。
进入一个无限循环(while True),在循环体中执行以下操作:
暂停0.1秒(time.sleep(0.1))。
在OLED屏幕上显示文本"RP2040",位置为(5,10)。
在OLED屏幕上显示文本"oled Test!",位置为(5,20)。
刷新(oled.show())OLED屏幕,以使显示的内容能够更新。
显示结果:
3、下面是搭配器件:Raspberry Pi Pico w开发板、GROVE SHIELD、GROVE OLED扩展板、GROVE BUZZER扩展板
Raspberry Pi Pico w开发板
GROVE BUZZER扩展板
GROVE OLED扩展板
GROVE SHIELD
任务3:同步网络时间
学习network模块用法,掌握连接网络、查看网络参数等用法,实现通过网络同步系统时间。
介绍一下:Python中的network模块提供了一些用于网络编程的工具和函数,包括套接字(socket)、URL处理、FTP处理等。
要同步网络时间,首先需要了解Raspberry Pi Pico w开发板的硬件配置和连接方式。然后,可以通过以下步骤进行操作:
安装必要的软件:
picocom:访问picocom官方网站(https://github.com/fritzing/picocom)下载并安装适用于你的操作系统的版本。
连接开发板:
将Raspberry Pi Pico w开发板通过USB线连接到电脑。
确保电脑已经安装了适当的驱动程序。
编写micropython代码:
在Mu Editor中创建一个新的文件,例如main.py。
在文件中编写micropython代码,例如
python
复制代码
import network
import time
# 连接Wi-Fi网络
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print('Connecting to Wi-Fi...')
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect('<your_wifi_ssid>', '<your_wifi_password>')
while not station.isconnected():
pass
print('Connected to Wi-Fi')
# 获取当前时间戳
current_timestamp = int(time.time())
print('Current timestamp:', current_timestamp)
# 通过网络获取NTP服务器时间戳
NTP_SERVER = 'pool.ntp.org'
NTP_PORT = 123
packet = bytearray()
packet.append(0x1b)
client = network.UDPClient()
client.connect(NTP_SERVER, NTP_PORT)
client.sendto(packet, (NTP_SERVER, NTP_PORT))
response, _ = client.recvfrom(1024)
server_timestamp = int.from_bytes(response[40:48], 'big') & 0xffffffff
server_timestamp += int(response[48:56]) * 1000000000 + int(response[56:64]) * 1000000 + int(response[64:72]) * 1000 + int(response[72:80]) // 2 ** 24
# 计算时间差并更新系统时间
time_difference = server_timestamp - current_timestamp
os.system('hwclock --set --date="@now"')
os.system('sudo date -s "@{}"'.format(server_timestamp))
os.system('sudo date --set-timer @{} {} seconds'.format(int(time_difference), 'seconds'))
这个示例代码将连接到Wi-Fi网络,获取当前时间戳,然后通过网络获取NTP服务器时间戳,计算时间差并更新系统时间。请将<your_wifi_ssid>和<your_wifi_password>替换为你的Wi-Fi网络的SSID和密码。
编译和上传代码:
点击Mu Editor菜单栏的“工具”>“编译”,选择编译器(例如GCC)。
点击“编译”按钮,等待编译完成。
点击“上传”按钮,将编译好的代码上传到开发板。
查看运行结果:
在Mu Editor中点击“工具”>“监视器”,查看运行结果。你将看到系统时间已经同步到了网络时间。
代码解析:
代码导入了所需的模块:machine.RTC、time、network和ntptime等。
创建了一个WLAN对象,用于连接到一个指定的网络(根据自己家里的网络设定号和密码)。
然后,定义了一个RTCdate的函数,该函数用于获取当前时间并返回一个格式化的时间字符串。
在函数中,创建一个RTC对象=rtc,然后获取当前时间给now。
接下来,将时区校正的时间加到当前时间上,并使用time.localtime()函数将时间戳转换为本地时间dt。
然后,使用格式化字符串将本地时间的年、月、日、小时、分钟和秒提取出来,并组成一个时间字符串date str。
最后,根据传入的flag参数,返回相应的时间字符串。
在函数中还包含了一个异常处理块,用于捕获网络时间同步错误并打印错误信息。
在代码中还包含了一个用于补零的辅助函数zero str(),用于将数字转换为两位数的字符串表示并在数字小于10时在前面补零。
整个代码的作用是通过网络获取当前时间,并将其格式化成一个字符串表示。如果时间同步出现错误,会打印错误信息。
任务4:实现定位功能
掌握GNSS模块用法,实现定位功能。
建议搭配器件:Raspberry Pi Pico w开发板、GROVE - GPS扩展板
要实现定位功能,首先需要了解Raspberry Pi Pico w开发板和GROVE - GPS扩展板的硬件配置和连接方式。然后,可以通过以下步骤进行操作:
安装必要的软件:
GROVE - GPS扩展板驱动程序:访问GROVE - GPS扩展板官方网站(https://www.grovepico.com/gps)下载并安装适用于你的操作系统的版本。
连接开发板:
将Raspberry Pi Pico w开发板通过USB线连接到电脑--将GROVE - GPS扩展板通过USB线连接到开发板--确保电脑已经安装了适当的驱动程序。
编写micropython代码:
在Mu Editor中创建一个新的文件,例如main.py。
在文件中编写micropython代码,例如:
python
复制代码
from machine import Pin, I2C
from machine import UART
from time import sleep
from GrovePi import *
# 初始化GPS模块
i2c = I2C(0, scl=Pin(5), sda=Pin(4))
serial = UART(1, baudrate=9600, bits=8, parity='N', stopbits=1)
if not GPS_start(i2c, serial):
print('Failed to start GPS')
exit()
# 获取经度、纬度、海拔高度和速度信息
while True:
data = GPS_read(i2c)
if data[0] != '\x00':
longitude = float(data[1]) + float(data[2])/60 + float(data[3])/3600
latitude = float(data[4]) + float(data[5])/60 + float(data[6])/3600
altitude = float(data[7]) + float(data[8])/1000 + float(data[9])/3600
speed = float(data[10]) + float(data[11])/1000 + float(data[12])/3600
print('Longitude: {}°, Latitude: {}°, Altitude: {}m, Speed: {}m/s'.format(longitude, latitude, altitude, speed))
sleep(1)
这个示例代码将初始化GPS模块,然后循环读取GPS模块的数据,包括经度、纬度、海拔高度和速度信息。请确保已正确安装GROVE - GPS扩展板驱动程序。
编译和上传代码:
点击Mu Editor菜单栏的“工具”>“编译”,选择编译器(例如GCC)。
点击“编译”按钮,等待编译完成。
点击“上传”按钮,将编译好的代码上传到开发板。
查看运行结果:
在Mu Editor中点击“工具”>“监视器”,查看运行结果。你将看到GPS模块返回的经度、纬度、海拔高度和速度信息。
注意:GPS只能在室外定位,在室内似乎不行,要特别久是小事外,而且有时带定位不到。程序调节成功后,我打印出经纬度,如下图:
代码解析:
这段代码结合了机器模块和micropyGPS模块,用于从GPS模块获取位置信息和时间戳,并将其输出到串口。
首先,代码导入了所需的模块:machine.Pin、time.UART和micropyGPS.MicropyGPS。
接下来,创建了一个UART对象com,用于与GPS模块进行通信。
然后,创建了一个MicropyGPS对象my_gps,用于接收GPS数据。
在初始化my_gps对象时,使用了一个本地偏移量(local offset)参数,该参数用于校正GPS模块返回的位置信息。
接下来,进入一个循环,不断读取串口数据并更新GPS数据。
在每次循环中,首先使用com.readline()函数读取一行串口数据,并将其存储在变量cc中。
然后,使用一个循环遍历cc中的每个字符,并通过my_gps.update()函数将每个字符更新到GPS对象中。
接下来,将获取的经度和纬度转换为字符串形式,并将其拼接在一起。
最后,打印出位置信息和时间戳。
整个代码的作用是从GPS模块获取位置信息,并通过串口输出到终端。
任务5:扩展任务
利用上述模块,实现带有网络、显示、声音功能的创意制作,可以增加其它传感器、外设。
整体连接照片:
1.OLED连接IIC1;
2.蜂鸣器连接D20;
3.GPS连接UART0;
整个介绍视频:
[localvideo]e0b96fbb955e635654720e46128808cb[/localvideo]
总结:
主要通过参与follow me活动,学习到了MicroPython的使用和树莓派Pico的开发环境,并且对Python的便捷性和库的易用性有了更深刻的认识。
解决开发过程中遇到的问题时,对MicroPython有了更深入的了解。
ufont.py (10.13 KB, 下载次数: 0)
ssd1306.py (4.57 KB, 下载次数: 0)
OledTest.py (386 Bytes, 下载次数: 0)
NTPtime1.py (977 Bytes, 下载次数: 0)
NTPtime.py (990 Bytes, 下载次数: 0)
micropyGPS.py (28.82 KB, 下载次数: 0)
GPS坐标速度.py (1.56 KB, 下载次数: 0)
GPStest1.py (458 Bytes, 下载次数: 0)
Example-6-GPS-Grove.py (2.54 KB, 下载次数: 0)
buzzer.py (532 Bytes, 下载次数: 0)
- 2023-07-02
-
加入了学习《picow_eeworld_taikongrenbiaopan》,观看 picow太空人表盘
- 2023-07-01
-
回复了主题帖:
【得捷电子Follow me第1期】任务1到4的经验总结
lugl4313820 发表于 2023-7-1 09:14
楼主可能还需要补充一些文字类的介绍,要不800字可能不够呀。
肯定要加点
- 2023-06-30
-
发表了主题帖:
【得捷电子Follow me第1期】任务1到4的经验总结
本帖最后由 meiyao 于 2023-7-2 20:12 编辑
任务1:熟悉micropython的基本语法
通过Raspberry Pi Pico w开发板,熟悉固件下载、Mu Editor软件的基本使用方法、micropython的基本语法
下面是我的理解与介绍:
熟悉固件下载:接入设备,把编译好的文件直接拖入到开发板的U盘符下面;还有一种办法就是用Thonny直接运行。
Mu Editor软件的基本使用方法:Mu 是给初学者的 Python 编辑器,使用起来非常的便捷,很容易上手。在 Linux 或 macOS 电脑上,你只需打开一个终端,输入 python,你就会看到 Python shell。如果你使用的是 Windows 电脑,则需要先安装 Python,安装完成就可以进行Thonny的使用了.
打开Mu Editor。在电脑中安装并打开Mu Editor软件。
创建新的Python文件。点击"File"菜单,然后选择"New File",在弹出的对话框中选择Python文件类型。
编写Python代码。在新创建的Python文件中,可以输入任意的Python代码。
运行Python代码。在编辑完代码后,可以通过按下F5键或者点击工具栏上的"Run"按钮来运行代码。运行结果会显示在底部的输出窗口中。
调试Python代码。如果代码运行时出现错误,可以通过调试功能来定位问题。可以点击工具栏上的"Debug"按钮来启动调试模式。在调试模式下,可以单步执行代码、查看变量的值等操作。
保存Python文件。如果需要保存代码文件,可以点击"File"菜单,然后选择"Save"或"Save As"选项,在弹出的对话框中选择保存路径和文件名。
关闭Python文件。如果需要关闭当前编辑的Python文件,可以点击"File"菜单,然后选择"Close"选项,或者使用快捷键Ctrl+W。
退出Mu Editor。如果需要退出Mu Editor软件,可以点击"File"菜单,然后选择"Exit"选项,或者使用快捷键Ctrl+Q。
MicroPython的基本语法:
缩进:MicroPython的代码块通过缩进来标识作用域,与Python3相同,缩进可以使用空格或制表符,但是必须一致。
变量和数据类型:在MicroPython中,变量不需要预先声明,可以直接赋值。MicroPython支持多种数据类型,包括整数、浮点数、布尔值、字符串、列表、元组和字典等。
控制结构:MicroPython支持条件判断、循环、异常处理等基本控制结构。条件语句使用if、elif、else等关键字,循环语句使用for、while等关键字。
函数:MicroPython支持函数的定义和调用,函数可以包含参数和返回值,也可以使用默认参数和可变参数。
模块:MicroPython支持导入模块和自定义模块,模块可以包含多个函数和变量,可以通过import语句来导入。
异常处理:MicroPython支持异常处理,可以使用try、except、finally等关键字来捕获和处理异常。
文件操作:MicroPython支持文件的读写操作,可以使用open()函数打开文件,并使用read()、write()等方法来读取和写入文件内容。
系统接口:MicroPython提供了一些系统接口,可以访问硬件设备、操作系统功能等,例如time.sleep()函数可以暂停程序的执行一段时间
任务2:驱动外设
驱动LED、OLED显示屏、蜂鸣器等外设。
驱动LED、蜂鸣器等外设:
OLED显示屏:
显示结果:
搭配器件:Raspberry Pi Pico w开发板、GROVE SHIELD、GROVE OLED扩展板、GROVE BUZZER扩展板
Raspberry Pi Pico w开发板
GROVE BUZZER扩展板
GROVE OLED扩展板
GROVE SHIELD
任务3:同步网络时间
学习network模块用法,掌握连接网络、查看网络参数等用法,实现通过网络同步系统时间。
介绍一下:Python中的network模块提供了一些用于网络编程的工具和函数,包括套接字(socket)、URL处理、FTP处理等。
任务4:实现定位功能
掌握GNSS模块用法,实现定位功能。
建议搭配器件:Raspberry Pi Pico w开发板、GROVE - GPS扩展板
注意:GPS只能在室外定位,在室内似乎不行,要特别久是小事外,而且有时带定位不到。程序调节成功后,我打印出经纬度,如下图:
任务5:扩展任务
利用上述模块,实现带有网络、显示、声音功能的创意制作,可以增加其它传感器、外设。
整体连接照片:
整个介绍视频:
[localvideo]35f096bc085605d02327c50b4cb5e50f[/localvideo]
- 2023-06-29
-
回复了主题帖:
【颁奖】助力国赛,好书免费读!
已确认
- 2023-06-25
-
回复了主题帖:
有谁想拆玩具的么???在线征集想要拆玩具的小伙伴【已寄出啦】
我要了,全寄我给你分析吧