zsy-s

  • 2025-01-14
  • 发表了主题帖: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- 中断

    本帖最后由 zsy-s 于 2025-1-14 22:27 编辑 异常     类型分为中断,异常,系统调用。     中断在任何时候都可以发生,与cpu运行的指令无关,是异步的。     异常分为 指令访问异常和数据访问异常。可以更改cpu的运行模式,属于同步异常。     系统调用,属于逻辑上主动触发的异常。   返回地址     中断:当前没执行的指令或者下一条指令     异常:触发异常的指令     系统调用:下一条指令   中断     中断分类有 处理器间中断 定时器中断 外设中断 调试中断。 中断处理过程     由cpu保存上下文,跳转到中断处理函数,恢复中断上下文,返回中断现场的下一条指令执行。 中断委派 中断优先级     m模式优先级高于s模式,多个s模式的优先级由PLIC管理。   PLIC     主要用来管理外部中断。支持7级中断优先级 中断寄存器     使能寄存器:用于关闭或者开启中断源     待定寄存器     中断优先级阈值寄存器:用于屏幕中断     请求/完成寄存器:用于判断中断源 和 中断完成标记         

  • 2025-01-09
  • 加入了学习《【Follow me第二季第1期】全部任务演示》,观看 全部任务演示2.0

  • 2025-01-08
  • 发表了主题帖: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- 链接

    本帖最后由 zsy-s 于 2025-1-8 22:59 编辑  概念 链接就是使用把多个二进制文件放到同一个二进制文件中,这中间会使用到链接脚本,多数会有特定的脚本,其表达了二进制程序的地址布局。 入口点: entry(symbol) 基本格式 section {     section-cmd     section-cmd     ... } 链接文件中包括两种地址:加载地址 虚拟地址。 加载地址:加载时候段所在的地址。一般程序存储再rom,此时rom中的地址成为加载地址,LMA 虚拟地址:运行时,段所在的地址,也叫运行地址 ,程序加载到ram中,ram中段所在的地址 成为虚拟地址,VMA。 链接地址:编译和链接时候使用的地址,不太懂,实际运行的物理地址。 、 符号的使用 我们可以再链接脚本中定义一个符号,并对他赋值他的地址。   内置函数 absolute(exp): 返回绝对值,用于再段定义中给符号赋绝对值。 addr(section):返回虚拟地址 align(align):返回下一个与align对其的地址 sizeof(section): 返回一个段的大小。 include():导入其他的链接脚本   加载重定位 链接地址与运行地址可不相同,不相同的时候会涉及到位置无关的指令和位置相关的指令。 重定位: 通过修改返回地址为链接地址,当函数返回时,就会跳转到链接地址处继续运行。 链接重定位:需要重定位的变量再编译时候地址默认都是0x0,再链接阶段最终生成二进制文件时候具有全局内存分布结构时候,由连接器给这些符号分配地址。                  

  • 2025-01-07
  • 发表了主题帖: 【Follow me第二季第3期】任务汇总

    本帖最后由 zsy-s 于 2025-1-10 22:00 编辑 本期活动地址:Follow me第二季第3期!与得捷一起解锁开发板超能力! 本期主板:EK-RA6M5,EK-RA6M5 评估套件可通过灵活配置软件包 (FSP) 和 e2 studio IDE,帮助用户对RA6M5 MCU 群组的特性进行无缝评估,并对嵌入系统应用程序进行开发。用户可利用丰富的板载功能以及自选的热门生态系统插件来将丰富创意变为现实。 本期任务如下: 入门任务:搭建环境,下载调试示例程序,Blink,按键; 基础任务:quad-spi flash和octo-spi flash配置及读写速度测试;DAC配置生成波形及性能测试; 进阶任务:示例程序中新增命令打印信息; 扩展任务:设计一个类似信号发生器功能的例程。可在示例程序上修改。通过命令或按键,设置DAC输出波形,可通过flash存储历史波形等信息。 硬件 1.EK-RA6M5开发板1块 2.Windows电脑, 3.MicroUSB数据线两根 4 示波器   软件 e2 studio ch340驱动程序, MobaXterm串口显示工具, jflash(烧录软件)     发表帖子如下 入门任务贴(搭建环境,下载调试示例程序,Blink,按键): 【Follow me第二季第3期】ek-ra6m5 开箱 - DigiKey得捷技术专区 - 电子工程世界-论坛 【Follow me第二季第3期】ek-ra6m5 板子认识 - DigiKey得捷技术专区 - 电子工程世界-论坛 【Follow me第二季第3期】ek-ra6m5 编译环境 - DigiKey得捷技术专区 - 电子工程世界-论坛 【Follow me第二季第3期】ek-ra6m5 led 和按钮的接口使用 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图     基础任务(quad-spi flash和octo-spi flash配置及读写速度测试;DAC配置生成波形及性能测试) 【Follow me第二季第3期】spi flash测试 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图   扩展任务(设计一个类似信号发生器功能的例程。可在示例程序上修改。通过命令或按键,设置DAC输出波形) Follow me 第二季第3期 :DAC配置生成波形及性能测试 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图     Follow me 第二季第3期 新增命令 - DigiKey得捷技术专区 - 电子工程世界-论坛   任务提交贴,包含视频和可编译代码 信号发生器 【Follow me第二季第3期】信号生成器 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图 任务总结 此次任务的主要目标是对EK-RA6M5开发板进行深入的测评,以了解其在实际开发中的性能和易用性。这款开发板由瑞萨官方开发,集成度较高,适用于各种嵌入式开发场景。通过此次测评,学到了很多东西。要衷心感谢eeworld为我们提供了这次宝贵的测评机会。通过此次测评,我们不仅加深了对EK-RA6M5开发板的理解,还结识了许多志同道合的开发者。在未来的开发过程中,我们将继续努力学习和进步,为嵌入式开发领域做出更多的贡献。 视频 [localvideo]1be021bb016cd1725a948e8e36cb9880[/localvideo] 代码

  • 发表了主题帖: 【Follow me第二季第4期】任务汇总

    本帖最后由 zsy-s 于 2025-1-10 22:22 编辑 本期活动地址:Follow me第二季第4期!与得捷一起解锁开发板超能力! 本期主板:Arduino® Nano RP2040 Connect,Arduino® Nano RP2040 Connect搭载功能丰富的Raspberry Pi RP2040微控制器,将其融入到Nano尺寸封装中。充分利用双核32位Arm® Cortex®-M0+处理器,通过U-blox® Nina W102模块实现蓝牙和WiFi连接,集速度计、陀螺仪、RGB LED和麦克风于一体,是物联网应用的不错选择。 本期任务如下: 必做任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!; 必做任务二:学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据; 必做任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。 选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小; 选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。 硬件 1 Arduino® Nano RP2040 Connect开发板 2 Micro USB数据线 软件 arduino   以下是任务完成的活动帖子汇总 板子了解 【Follow me第二季第4期】板子介绍 - DigiKey得捷技术专区 - 电子工程世界-论坛 必做任务一(搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld) 【Follow me第二季第4期】点亮led/串口输出 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图   必做任务二(学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据) 【Follow me第二季第4期】任务2: IMU传感器 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图   必做任务三(学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形) 【Follow me第二季第4期】任务2:PDM麦克风的学习 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图      自选任务,点亮tft 【Follow me第二季第4期】点亮0.96tft - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图   任务提交贴,包含视频和可编译代码: 【Follow me第二季第4期】一些联网获取的信息展示屏 - DigiKey得捷技术专区 - 电子工程世界-论坛 流程图   视频 [localvideo]de87a3e4286dcc27dff6c7ff1ae14188[/localvideo]   代码 任务总结 在实际开发中,Arduino Nano RP2040 Connect其小巧的尺寸和丰富的接口使得项目部署更加灵活,简单易开发。无论是简单的传感器数据采集,还是复杂的物联网系统构建,这款开发板都能轻松胜任。要特别感谢eewlord提供的机会,让我有机会深入体验并测评Arduino Nano RP2040 Connect。这次学到了很多,希望下次还有机会参加eeworld的活动。

  • 加入了学习《【Follow me】第二季第四期任务汇总》,观看 任务汇总提交

  • 2024-12-24
  • 发表了主题帖: 【Follow me第二季第4期】一些联网获取的信息展示屏

    本帖最后由 zsy-s 于 2024-12-24 21:31 编辑 备忘     比较好的官方讲解:Installing a Board Package in the IDE 2 | Arduino Documentation     字体使用:Using Fonts | Adafruit GFX Graphics Library | Adafruit Learning System     在线创建字体: truetype2gfx - Converting fonts from TrueType to Adafruit GFX     解码汉字正确的网址:UTF-8编码转换器-ME2在线工具 背景 有一个tft0.96的屏幕,可以从网络获取一些信息,用于展示。 学习了几天汉字的显示,无奈水平不够,资料不多,不能显示汉字出来,所以遇到汉字的地方,做个判断,转换为英文显示。 程序结构   代码 开启无线网卡 if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } Serial.println(fv); // attempt to connect to Wifi network: status = WiFi.begin(ssid, pass); while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: // wait 10 seconds for connection: delay(1000); } Serial.println("Connected to wifi"); printWifiStatus(); 连接wifi,准备使用获取天气信息接口 // if you get a connection, report back via serial: if (client.connect(server, port)) { Serial.print("connected to server "); client.print("GET /v3/weather/weatherInfo?key=1682d31d8732a44f929068e6083c49ed&city=210200&extensions=all HTTP/1.1\r\n"); client.println("Host: restapi.amap.com"); client.println("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); client.println("Connection: close"); client.print("Upgrade-Insecure-Requests: 1\r\n"); client.println(); Serial.println("send data to server over!!"); } 初始化tft屏幕 tft.initR(INITR_MINI160x80_PLUGIN); tft.setRotation(1); tft.fillScreen(ConvertRGB(0x7F,0xFF,0xD4)); tft.fillRect(80,0,10,20,ST77XX_YELLOW); 获取 信息,并解析需要的信息 while (client.available()) { dataWeb[posi] = client.read(); posi++; } Serial.write(dataWeb); updateTm = strstr(dataWeb,"reporttime")+13; date1 = strstr(updateTm,"date")+7; week1 = strstr(date1,"week")+7; dayweather = strstr(week1,"dayweather")+13; temp1 = strstr(dayweather,"daytemp")+10; temp2 = strstr(temp1,"nighttemp")+12; buff = strchr(updateTm,'"'); buff[0] = 0; buff = strchr(date1,'"'); buff[0] = 0; buff = strchr(week1,'"'); buff[0] = 0; buff = strchr(dayweather,'"'); buff[0] = 0; buff = strchr(temp1,'"'); buff[0] = 0; buff = strchr(temp2,'"'); buff[0] = 0; Serial.println(); Serial.print("updateTm:"); Serial.println(updateTm); Serial.print("date1:"); Serial.println(date1); Serial.print("week1:"); Serial.println(week1); Serial.print("dayweather:"); Serial.println(dayweather); Serial.println(dayweather[0],HEX); Serial.println(dayweather[1],HEX); Serial.println(dayweather[2],HEX); Serial.print("temp1:"); Serial.println(temp1); Serial.print("temp2:"); Serial.println(temp2); if(dayweather[0] == 0xe6){ dayweather = "sunshine"; }else if(dayweather[0] == 0xe5){ dayweather = "too cloudy"; }else{ dayweather = "Snowbound"; } 展示信息到tft屏幕 tft.setFont(&songti5pt7b); tft.setTextWrap(true); tft.setCursor(10, 30); tft.setTextColor(ST77XX_BLACK); tft.setTextSize(2); Serial.println("\r\n***************************************************************"); writeText(0,"updateTm",updateTm); writeText(13,"date",date1); writeText(26,"week",week1); writeText(39,"dayweather",dayweather); writeText(52,"daytemp",temp1); writeText(65,"nighttemp",temp2); delay(6000000);   疑难杂症     看了几篇备忘的字体汉字博文,不会用,生成的字体显示不出汉字,都是空字符,难搞。     这个问题,待后期继续研究研究。     github上有个台湾省的人,弄了个繁体字的,教程还挺繁琐,感觉靠谱。 效果图 [localvideo]06ea1312150b00bbfbe9cba0a0c588df[/localvideo]     代码    结语 2040 Nano的紧凑设计使其特别适合用于空间有限的嵌入式项目。这一点对于物联网应用、便携式设备、教育领域等都是一个很大的优势。尽管体积小巧,但它依然提供了强大的功能和出色的性能,是一款性价比极高的开发工具。再次感谢EEWorld平台,让我们有机会深入体验这款出色的开发工具,并与更多开发者一起交流与学习。EEWorld的平台让我们得以接触到更多的优质硬件和工具,是广大开发者不可或缺的宝贵资源。  

  • 2024-12-15
  • 发表了主题帖: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- 汇编伪指令 速读

    本帖最后由 zsy-s 于 2024-12-15 22:15 编辑 # 伪指令 仅在汇编器启动时候有用,汇编结束,伪指令就没用了。 主要实现的如下功能:         符号定义,数据定义和对齐,汇编控制,汇编宏,段描述。         对齐: .aligh 数据定义伪指令: .byte , .hword, .short, .long, .int, .quad, .equ, .ascii, .string 逻辑相关伪指令:如 .global 段定义相关伪指令:  .section         标志一个段的开始,结束语另一个段的开始或者文件结尾 。         .pushsection .popsection:中间代码插入到指定段中。 宏相关伪指令:         .macro  mlabal  para1 para2         code body         .endm         放置汇编代码重复性代码太多。         其中字符串的宏,不好理解: * 可以使用‘\()’来告知汇编器,宏的参数什么时候结束,例如,代码中‘\base\()’,后面加了 ‘\()’,因此汇编器就知道字母e做参数的最后一个字符。因为base作为参数,所以base不一定最后就是字母e,所以汇编器如何判断字符串后面有个e呢??

  • 回复了主题帖: Follow me 第二季第3期 新增命令

    Jacktang 发表于 2024-12-15 09:55 红框里面的代码是想表达什么呢 表达,我新增的指令命令

  • 2024-12-14
  • 发表了主题帖: Follow me 第二季第3期 新增命令

    本文的主题是在现成的实例代理中增加一个指令。 基于的示例为ospi例程 原始的命令如下:  通过输入数字,配置spi的接口模式  增加一条命令帮忙提示信息   增加针对命令4的处理逻辑:   效果如下:  

  • 2024-12-13
  • 加入了学习《Follow me 第二季第3期成果视频》,观看 成果展示

  • 2024-12-10
  • 回复了主题帖: 盒子主控HDMI IN方案 LT8619C HDMI转RGB888/666/BT656/BT601/LVDS

    学习学习,画个板子,看看

  • 2024-12-08
  • 发表了主题帖: 【Follow me第二季第3期】信号生成器

    本帖最后由 zsy-s 于 2024-12-8 21:08 编辑 背景     用于产生一些常见的波形,通过按钮切换信号的波形。 设计框架 内部实现了三种波形。通过按钮1 实现波形的切换,同时三种波形刚好对应三个led ,会亮起相应的led,提醒当时的波形。      代码 写代码得到一个周期的值 int inx = 0; while(inx <= 4096){ APP_PRINT("%d ",(int)(4096*sin(PI*inx/2048))); inx++; if(!(inx%500)){ APP_PRINT("\r\n inx [%d] \r\n ",inx); R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS); } } 展示图形如下   开启中断,由于尽可以使用一个led,开启一个中断服务函数就够用了。 相关的配置前文写过,开启代码如下 leds = g_bsp_leds; 开启中断 err = R_ICU_ExternalIrqOpen(&g_external_irq1_ctrl, &g_external_irq1_cfg); err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg); 使能中断 err = R_ICU_ExternalIrqEnable(&g_external_irq1_ctrl); err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl); 三种波形,三角波,sin波,方波,实现函数如下 uint16_t ledstats = 0; uint16_t vval = 0; int vdrec = 0; static void sinbo() { if(4096 <= vval){ vval = 0; }else{ vval++; } APP_PRINT("DAC_SetVoltage [%d] [%d]\r\n",vval,sinval[vval]); // DAC_SetVoltage((float)vval); R_DAC_Write(&g_dac_ctrl, sinval[vval]); } static void sanjiaobo() { if(4096 < vval){ vdrec = 0; } if(!vval){ vdrec = 1; } if(vdrec){ vval++; } if(!vdrec){ vval--; } APP_PRINT("DAC_SetVoltage [%d] [%d]\r\n",vval,sinval[vval]); // DAC_SetVoltage((float)vval); R_DAC_Write(&g_dac_ctrl, vval); } static void fangbo() { if(4096 < vval){ vval = 0; }else{ vval++; } if(vval <2048){ R_DAC_Write(&g_dac_ctrl, 0); }else{ R_DAC_Write(&g_dac_ctrl, 4095); } } 时间中断函数里,实现切换波形 void gpt_test_isr(timer_callback_args_t *p_args) { (void)p_args; //APP_PRINT("\r\n ** Agpt_test_isr ** \r\n"); if(ledstats & 0x1){ sanjiaobo(); }else if(ledstats & 0x2){ fangbo(); }else{ sinbo(); } } 按钮中断函数实现led的点亮 void irq_btn_callback0(external_irq_callback_args_t *p_args) { (void)p_args; APP_PRINT("** this is btn0 ** \r\n"); if(!(ledstats & 7)){ ledstats = 1; }else{ ledstats <<= 1; } APP_PRINT("** this is btn0 [%x]** \r\n",ledstats); R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[1], !!(ledstats & 2)); R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[0], !!(ledstats & 1)); R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[2], !!(ledstats & 4)); } 效果 [localvideo]f0f9e5e8620a98da14ddc8376148d1cc[/localvideo] 代码 结论 从开始时候第一次用e2工具的新奇,到现在初步能够笨手笨脚的配置stack和参数,是一个巨大的进步。少了畏惧心理,配置一下参数,就能直接应用开发,基本不用看手册,看看接口说明,就能上手开发。越来越像纯应用开发了。 感谢eeworld和得捷联手举办的活动,使许许多多的开发者,能够低成本且动力十足的学习到一些东西,飞快的成长,拿玩游戏的时间用来学习,成就很足。希望活动越来越多,得多多参加。

  • 发表了主题帖: Follow me 第二季第3期 :DAC配置生成波形及性能测试

    本帖最后由 zsy-s 于 2024-12-8 13:59 编辑 备忘:Follow me第二季第3期!与得捷一起解锁开发板超能力! 什么是 dac dac全称叫做数模转换器,它由英语Digital to Analog converter简化而成。与其相对的还有反过来的ADC,即将模拟信号转换成数字信号。 性能指标:             分辨率是模拟输出电压可被分离的等级数,n位DA分辨率一般为1/2^n。位数越高,分辨率越高。             转换速度用来描述数字量变化引起模拟量变换的转换时间,具有的指标:建立时间和转换速率。  A/D转换一般步骤:取样、保持、量化、编码 硬件       ra5m6芯片提供了两个12位分辨率的dac控制器。 配置 查看pinlist可以看出,只有两个引脚接到了dac控制器上,如下图   dac属性配置 增加一个gpt定时器,用来产生中断,输出一个模拟信号,最终生成波形信号 配置如下     代码 开启定时器中断 R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg); R_GPT_Start(&g_timer0_ctrl); 定时器的中断 void gpt_test_isr(timer_callback_args_t *p_args) { (void)p_args; APP_PRINT("\r\n ** Agpt_test_isr ** \r\n"); } 启动dac 转换 R_DAC_Start (&g_dac_ctrl); 根据电压值计算转换值,实现输出相应的电压,此函数在定时器里调用,实现定时的调节输出电压。 static void DAC_SetVoltage(float voltage) { uint16_t dac_data; dac_data = (uint16_t)(4096*((voltage)/33)); APP_PRINT("DAC_SetVoltage dac_data[%d]\r\n",dac_data); R_DAC_Write(&g_dac_ctrl, dac_data); }   效果   [localvideo]80a0a6c7820c8bcee1e8348ba8903224[/localvideo]  

  • 2024-12-07
  • 加入了学习《【Follow me第二季第3期】扩展任务---EK_RA6M5函数信号发生器》,观看 【Follow me第二季第3期】扩展任务---EK_RA6M5函数信号发生器

  • 发表了主题帖: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- 指令集

    本帖最后由 zsy-s 于 2024-12-7 18:24 编辑 基础知识 指令集与处理器架构深度绑定,决定了cpu的实现方式,由纯粹的二进制构成。 二进制的指令,人们是无法阅读和理解的, 所以就出现了汇编指令。 指令集的不同,相应的汇编指令也随着改变,汇编指令是机器指令的翻译 本机的重点是处理器指令集,risc-v使用了精简指令集。   指令集的组成 以下是官方提=手册上的提供的指令集:   本书基于得指令集是rv64imafdcsu 指令集的格式如下   指令集的分成6类: 作用 类型 用于寄存器-寄存器算术操作 R 类型指令 寄存器与立即数的算数或加载指令 I 型指令  存储指令 S 型指令 条件跳转指令 B 类型指令 长立即数操作指令 U 型指令 无条件跳转 J 型指令   加载和存储指令 数据的移动方向都是从右边到左边。 加载指令 l{d|w|h|b}{u} rd , offset(rs1) 格式: (从lsb到msb)load + dest +width+ src base + offset 。 解释:从以base为基地址偏移offset处的地址数据,加载width宽度数据到 dest 寄存器里去。   存储指令 s{d|w|h|b} rs2,offset(rs1)   移位指令 移位操作主要由逻辑左移sll,算术右移srl 逻辑右移sra,算术和逻辑的区别是是否考虑符号位。 算术移位,符号位有意义,所以,右移时候最高位按照符号位补位。 在我们实际c语言环境下,右移和左移基本都是逻辑移位。 微操作指令 与and ,或or,  非not, 异或xor 异或相同为0 不同是1,堪称逻辑运算利器,就是难用一点,我写代码时候偶尔用,容易逻辑错误。   算术运算指令  仅有 加add, 减sub   比较指令 有符号寄存器和寄存器比较指令         slt 无符号存器和寄存器比较指令            sltu 有符号寄存器和立即数比较指令       slti  无符号寄存器和立即数比较指令       sltiu   跳转指令 jal   跳转并赋值下一条返回指令到链接寄存器中 beq   相等跳转 bne    不相等跳转   csr指令 此指令用于控制系统提供的控制和状态寄存器 寻址 寻址包括长距离寻址和短距离寻址,长距离寻址按照4k位锚点寻址,短距寻址可以在4k范围内任意寻址。   不懂的点 pic(position independent code)位置无关代码,一般用于共享库中,因为使用的时候使用相对地址,所以整个系统运行时可以只有一份副本。 编译时候需要开启此特性,不太理解设计的原理是什么,如何去查看他。   伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。没有对应得操作码,不会生成真正的机器指令。只用于汇编过程中为汇编程序提供汇编信息。 关于伪指令,还是不理解。

  • 2024-12-05
  • 发表了主题帖: 【Follow me第二季第4期】点亮0.96tft

    本帖最后由 zsy-s 于 2024-12-6 13:53 编辑 备忘 库的库,依赖包的路径 C:\Users\[Name]\Documents\Arduino\libraries C:\Users\[Name]\AppData\Local\Arduino15\packages\arduino\hardware\mbed_nano\4.2.1 C:\Users\[Name]\\AppData\Local\Arduino15\libraries 硬件介绍 使用的0.96寸的tft屏幕,驱动使用st7735,手册如下   名词解释 copi  cipo:   A Resolution to Redefine SPI Signal Names – OSHWA   引脚使用 spi的依赖使用arduino提供的spi。 tft屏幕驱动使用 Adafruit_ST7735_and_ST7789_Library 开源代码 引脚连接: #define TFT_CS 10 #define TFT_RST 8 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 9 spi引脚使用 // SPI #define PIN_SPI_MISO (12u) #define PIN_SPI_MOSI (11u) #define PIN_SPI_SCK (13u) #define PIN_SPI_SS (10u) 连接完线路,编译,烧录到nano中,即可点亮 效果如下 [localvideo]84cf79c586e4d133ceecd3a6b4ad9290[/localvideo]   代码:    

  • 2024-12-04
  • 回复了主题帖: 【Follow me第二季第4期】任务2:PDM麦克风的学习

    lijinlei 发表于 2024-12-4 12:32 大佬,你的串口数据是用什么工具采集的啊? 我是菜鸟,我看论坛的各位都是大佬,我一会传上去

  • 发表了主题帖: 【Follow me第二季第4期】任务2:PDM麦克风的学习

    本帖最后由 zsy-s 于 2024-12-4 17:23 编辑 # 硬件 麦克风使用的型号:MP34DT06JTR 手册 lr引脚的定义 # 知识点学习 高保真音频:44khz 数字音频信号PDM代表脉冲密度调制(Pulse Density Modulation)。以非常高的频率采集音频信号,也被称为:Oversampled 1-bit Audio。PDM是一种调制形式,用于表示数字域中的模拟信号。 采样时许: sck是采样频率,在每个上升沿或者下降沿采集一位音频数据。 对于右声道来说,上升沿启动右声道数据,最多tren时间后,右声道数据有效,下降沿后延迟trdis时间后,数据可以变化,这样保证了下降沿采集音频数据时,数据能保证有效。 ## 数据的使用 PDM信号无法直接驱动DA进行声音播放,PDM信号要变为声音信号还需要进行下采样,经过一次低通滤波和抽样,然后成为PCM信号。 pdm是快速对音频进行调制的一种协议,通过密度来表示音频的模拟信号的幅度。密集的1标志正幅度,密集的0标识负幅度,平均交替的01标识 0幅度。如下如所示。 # 代码 包含官方的pdm头文件。 #include 配置pdm 并启动pdm数据采集。 ```c static const int frequency = 16000; static const char channels = 1; PDM.onReceive(onPDMdata);   if (!PDM.begin(channels, frequency)) {     Serial.println("Failed to start PDM!");     while (1);   } ``` 回调读取数据并设置可读数据长度。 ```c void onPDMdata() {   // Query the number of available bytes   int bytesAvailable = PDM.available();   // Read into the sample buffer   PDM.read(sampleBuffer, bytesAvailable);   // 16-bit, 2 bytes per sample   samplesRead = bytesAvailable / 2; } ``` 打印采集到pdm数据 ```c   if (samplesRead) {     for (int i = 0; i < samplesRead; i++) {       if(channels == 2) {         Serial.print("L:");         Serial.print(sampleBuffer);         Serial.print(" R:");         i++;       }       Serial.println(sampleBuffer);     }     samplesRead = 0;   } ``` # 效果 # 结论 pdm转换声音的逻辑,不太熟悉,学习到了,在更新一下 串口工具

  • 2024-12-02
  • 回复了主题帖: STM32全球线上峰会,STM32N6重磅发布啦!

     

最近访客

< 1/2 >

统计信息

已有42人来访过

  • 芯积分:146
  • 好友:--
  • 主题:33
  • 回复:15

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言