- 2025-04-14
-
回复了主题帖:
【FireBeetle 2 ESP32 C6】下载 micropython 固件的几种方法
刷了micropython固件后,再想刷回arduino的固件,可以吗?提供arduino的固件吗?
- 2025-03-28
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】双核通讯FIFO分析与测试
关于fifo的函数,在C语言的SDK中有如下几个:
SIO模块包含两个FIFO(先进先出队列),用于在两个核心之间传递数据、消息或有序事件。每个FIFO的位宽为32位,深度为4个条目。其中一个FIFO只能由核心0写入、核心1读取,另一个FIFO则只能由核心1写入、核心0读取。
在例程中使用的是:
multicore_fifo_push_blocking,入栈操作
multicore_fifo_pop_blocking,出栈操作
1、multicore_fifo_push_blocking内部调用的是multicore_fifo_push_blocking_inline,实际是把数据,写入sio_hw->fifo_wr寄存器、
该函数会阻塞当前核心,直到目标 FIFO 有空间可写入数据。若 FIFO 已满,调用线程会暂停执行,直到另一个核心通过 multicore_fifo_pop_blocking 读取数据腾出空间
这是一个32位的寄存器
类似的,multicore_fifo_pop_blocking读取 寄存器sio_hw->fifo_rd中的数值。
阻塞读取:该函数会阻塞当前核心,直到目标 FIFO 中有数据可读取。若 FIFO 为空,调用线程会暂停执行,直到另一个核心通过 multicore_fifo_push_blocking 写入数据
若需避免阻塞,可先用 multicore_fifo_rvalid() 检查 FIFO 是否有数据
if (multicore_fifo_rvalid()) {
uint32_t data = multicore_fifo_pop_blocking();
}
这样一入一出,就可以让数据在两个核心之间传输,传输一些标志,设计一些信号量,实现互锁机制就没有问题。
需要注意,这个函数是阻塞的,就是在运行这两个函数后,其下面的代码是无法运行的。
当然,这种检查FIFO的方式还是效率低一些,芯片还支持了FIFO 的中断方式、门铃方式,都是可以比较快速的进行核间的通讯,可以两种方式进行配置使用,增加实时性。
整个测试代码如下:
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/timer.h"
#include "hardware/clocks.h"
#include "hardware/pll.h"
#include "pico/multicore.h"
void pico_set_led(bool led_on)
{
gpio_put(PICO_DEFAULT_LED_PIN, led_on);
}
#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif
#define LED_FLAG 1
#define FLAG_VALUE 123
int pico_led_init(void)
{
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
return PICO_OK;
}
void core1_entry()
{
multicore_fifo_push_blocking(FLAG_VALUE);
uint32_t g = multicore_fifo_pop_blocking();
while (1)
{
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
int main()
{
int flag1,flag2;
flag1=0;
flag2=0;
stdio_init_all();
pico_led_init();
multicore_launch_core1(core1_entry);
uint32_t g = multicore_fifo_pop_blocking();
if (g != FLAG_VALUE){
printf("Hmm, that's not right on core 0!\n");
flag1=1;
}
else {
multicore_fifo_push_blocking(FLAG_VALUE);
printf("It's all gone well on core 0!");
flag2=1;
}
while (true)
{
printf("flag1=%d, flag2=%d!\n",flag1,flag2);
sleep_ms(1500);
}
}
主main函数的串口输出 :
如果把multicore_fifo_push_blocking注释一个,那么整个程序就会卡在multicore_fifo_pop_blocking()上了。
-
回复了主题帖:
【树莓派Pico 2 RP2350开发板】双核程序运行
秦天qintian0303 发表于 2025-3-28 12:21
双核需要分别下载吗?模式有什么不同?
不需要分别下载,RISC的主程序相当于一个函数而已。只烧写一次就行
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】双核程序运行
与TI的多核处理器芯片的开发方式不同,RP2350的多核开发,并不是为每个内核新建独立的一个工程,而是在一个工程中包含所有代码 ,通过SDK中的API来启动并支行另一个内核的程序。
tight_loop_contents 是一个在树莓派 Pico 的 SDK 中常用的宏,通常用于在程序中创建一个空的循环体,以防止程序直接退出,同时允许调试器暂停程序。
启动第二个核心的函数为multicore_launch_core1 ();
修改CMakeLists.txt文件,添加pico_multicore支持
如下所示:
源文件中,增加头文件:#include "pico/multicore.h"
先写一个在risc-v内核中运行的一个主函数。
这个函数类似于main函数,只是运行于另一个内核中。
例如,在另一个内核 中去翻转LED灯
void core1_entry()
{
pico_led_init();
while (1)
{
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
而真正的main函数中,用于周期输出 Hello
int main()
{
stdio_init_all();
multicore_launch_core1(core1_entry);
while (true)
{
printf("Hello, world!\n");
sleep_ms(1000);
}
}
可以看到,外设的初始化工作,都是在core1_entry函数中进行配置的,
main中进行串口输出,risc中进行LED闪烁。
这种方式与很多多核异构芯片的运行方式是差不多的,一个主核在启动后,动态加载另一个或多个内核的程序再分别单独进行。
内核控制的函数比较少,有4个,分别是:
void multicore_reset_core1 (void)
void multicore_launch_core1 (void(*entry)(void))
void multicore_launch_core1_with_stack (void(*entry)(void), uint32_t *stack_bottom, size_t stack_size_bytes)
void multicore_launch_core1_raw (void(*entry)(void), uint32_t *sp, uint32_t vector_table)
在没有核间通讯时,两个核心是单各自运行。两个内核之间的通讯,可以通过fifo、queue、中断等方式。
这里开发时,如果没有通讯与互锁机制,会出现外设的竞争,导致程序错乱。
- 2025-03-13
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
本帖最后由 jinyi7016 于 2025-3-13 11:29 编辑
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
- 2025-03-06
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】功耗测试
经过查看C SDK的文档,发现并没有相应进入低功耗模式的函数。只能是通过降低芯片的主频来达到降功耗的目的。
这里测试时,把LED关了,也把定时器、串口等外设关了,只是在while中有一个sleep的延时函数。
于是测试了50、100、150MHz下,在关闭定时器、IO情况下的电流。
如下图所示:
修改主频的代码如下:
#define PLL_SYS_KHZ (150 * 1000)
set_sys_clock_khz(PLL_SYS_KHZ, true);
clock_configure(
clk_peri,
0, // No glitchless mux
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS, // System PLL on AUX mux
PLL_SYS_KHZ * 1000, // Input frequency
PLL_SYS_KHZ * 1000 // Output (must be same as no divider)
);
需要另外注意的是,在使用VS code的扩展进行开发时,每次烧写程序,并不需要单独按下BOOT后上电,可以直接点VS Code的 RUN直接进行代码 的下载。
但如果把主频设置的过低的话,这里使用Run也可能无法烧写程序,这时,需要按下BOOT来操作烧写了。
RP2350看来是以高性能为特点的,低功耗并不是她的赛道。
-
回复了主题帖:
【树莓派Pico 2 RP2350开发板】环境搭建
御坂10032号 发表于 2025-3-6 12:00
这玩意每次下载太麻烦了, 哪个pico 插件每次还需要断电按着boot按键才行。 这都25年了也不整个reset
使用vs code 的扩展进行开发时,可以点扩展的run来下载,不用每次按boot 了。
-
回复了主题帖:
【获奖名单】英飞凌 CYW5591x 有奖活动
没注意,给过期了。
- 2025-02-26
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】环境搭建
本帖最后由 jinyi7016 于 2025-2-26 15:07 编辑
一、介绍
Pico 2 RP2350开发板已到货。还是老掉牙的Mico USB接口。
硬件比较简单,板上的资源也比较有限,虽然板子的元件密度并不高,但还是使用的0201的阻容元件。
二、python开发方式
最简单的开发方式就是用python ,直接烧写固件,Thonny连接开发板,编写python代码,下载运行,一气呵成。
python LED 闪烁代码例程如下:
# 导入必要的库
from machine import Pin
import time
# 定义LED连接的GPIO引脚
# 如果使用内置LED,使用GPIO 25
# 如果使用外接LED,可以替换为对应的GPIO引脚
led = Pin(25, Pin.OUT) # 内置LED连接到GPIO 25
# 定义闪烁的频率和次数
blink_count = 100 # 闪烁次数
delay = 0.5 # 每次闪烁的间隔时间(秒)
# 循环控制LED闪烁
for i in range(blink_count):
led.on() # 打开LED
time.sleep(delay) # 等待一段时间
led.off() # 关闭LED
time.sleep(delay) # 等待一段时间
print("LED闪烁完成!")
三、C开发方式
但要发挥出芯片的全部性能,还是要用C进行开发。
一般的C的开发都 是要linux系统下的,要安装各种依赖与工具链。
但最近推出了Raspberry Pi Pico的VS Code扩展。可以很方便的进行C的开发了。
使用的系统是win10,插件安装倒是快,但在新建工程后,要下载SDK,可能是国内网络的问题,下载总是断。
如果出现下载失败的问题,重新建一个工程,vs code会重新下载工具与SDK。
如果网络不好,实在下载不下来,可以找微雪的方案,直接下载SDK包,解压到系统中。
都下载完成后,会弹出一个新的工程窗口,这个窗口就是新建的pico2的工程了
如下,对默认的工程进行编译,成功生成了uf2文件。
烧写后,LED灯是闪了,但USB串口无法打开,提示拒绝访问,试了大约6、7个串口软件,有一个是可以打开并收到数据的。
要不就是可以打开串口,但无法收到数据。
还有一个问题,是我个人遇到的,但不具有通用性。就是我的电脑上安装了瑞萨原厂的编译工具链,导致我的vs code无论怎么切换,一直是用的瑞萨的工具链,最后编译总是出各种错,当我卸载后,就可以正常编译了。这里不清楚了瑞萨的问题,还是我电脑的问题,还是vs code的问题,还是扩展的问题了。反正卸载后正常了。
- 2025-02-19
-
回复了主题帖:
>>征集 | 晒电机控制痛点与难题,一起寻求最优解!
传统电机控制中,控制算法都比较复杂,需要大量的软件编程和调试,其实现方式,也是在MCU中进行软件算法实现。这就限于处理器的性能了,而且也要兼顾成本,高性能的MCU当然可以解决部分问题,但成本也会增加很多。
再加上软件算法的运行效率问题,受主频、外设与片上资源的限制,效率优化也是一个很漫长的过程。
现阶段对电机控制的精度要求、灵活性,动态响应的要求越来越高,尤其是电车汽车上电机控制的应用。传统的软件控制算法,尤其在动态性能方面,优化难度很大。开发的软件由于芯片资源的不同,往往换芯片后,要重新进行算法的优化。
所实现功能所需要的PCB面积也不小,MCU的外围电路、与控制芯片的各种接口电路,集成度很低。而且一旦出现问题,导致故障时,维护成本也比较高。
- 2025-02-11
-
回复了主题帖:
测评入围名单: 树莓派Pico 2 RP2350开发板
确认无误,可以参加测评