QuaX_Chow

个性签名:

github.com/Amanitaphalloide

  • 2024-12-15
  • 回复了主题帖: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

    内容一视频链接有误,正确网址为https://training.eeworld.com.cn/course/68853

  • 加入了学习《【Follow me第二季第3期】玩转EK-RA6M5开发板》,观看 【Follow me第二季第3期】玩转EK-RA6M5开发板

  • 加入了学习《FollowMe 第二季:3 - EK_RA6M5 开发板入门》,观看 EK-RA6M5 开发板入门

  • 上传了资料: 【Follow me第二季第3期】玩转EK-RA6M5资料包

  • 2024-11-21
  • 回复了主题帖: 今天下午两点直播STM32全球线上峰会,STM32N6重磅发布,快来直播间【抽开发板】啦!

    已报名

  • 2024-11-18
  • 发表了日志: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

  • 发表了主题帖: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

    本帖最后由 QuaX_Chow 于 2024-12-15 23:10 编辑 2024/11/18 这次给大家带来的是Follow Me第二季第3期任务的速通教学(又双鸽了很久   感谢主办方eeworld、得捷电子的支持。感谢我人生路上的每个人。 内容一:3-5分钟短视频 内容二:本篇 内容三:本次活动的资料包   开始前我们先将两根usb线分别连接开发板全速USB和DEBUG,再准备一台示波器   开发环境搭建 首先我们在github上下载瑞萨的fsp&e2 studio整合安装包 链接直达   下载完成后双击安装包     选择自定义安装     安装终端,省的看串口时切程序     默认勾选内容即可,点 Next      最下面那栏 Renesas AI 可以不勾选,节省点空间     选择接受协议     等待安装完成即可 安装完成后双击安装好的程序 选择工作空间,这里我就使用默认的workspace     弹出登录界面,登录自己的瑞萨账号:     安装完成!   接下来的部分操作基于教学直播和官方guider   入门任务 ----下载调试示例程序,Blink,按键----   官方为开发者提供的例程地址 下载好例程,解压至与workspace同级的文件夹方便查找   因为我们需要用到官方例程,所以需要将源工程导入进我们的workspace 工具栏第一项-导入-现有项目到工作空间中     根目录就是例程文件夹-_quickstart,单击该文件夹,归档文件不用选择。同时勾选下面的“将项目复制到工作空间中”:         通过按键切换blink LED的亮度、频率,共4x4种情况,我们需要进行以下修改:               点击工具栏的锤子进行编译下载,再点小虫子调试 在监视器表达式窗口中添加g_board_status,并可以将其设置为实时刷新,方便我们观察程序运行效果:     实际监控效果如下:     实际效果如下:     任务完成!   基础任务 ----quad-spi flash和octo-spi flash配置及读写速度测试----   示例代码中已经给我们进行了功能实现,直接测试即可:     结果如下,速度还是可以的: Reading from flash completed ------------------------------------------------- Operation/Flash Quad-SPI Octa-SPI ------------------------------------------------- Write 64311 37619 Read 6374 1044 -------------------------------------------------   我们看一下SPI的读写代码,以部分OSPI读取数据为例:   #ifdef READ_AS_SINGLE_BLOCK /* Start timer */ R_GPT_Start(g_memory_performance.p_ctrl); R_OSPI_XipEnter(g_ospi.p_ctrl); memcpy (p_dest, p_src, (data_size * 1024) / 4); R_OSPI_XipExit(g_ospi.p_ctrl); /* Stop timer */ R_GPT_Stop(g_memory_performance.p_ctrl); #endif R_GPT_StatusGet(g_memory_performance.p_ctrl, &status); R_GPT_Reset(g_memory_performance.p_ctrl); R_GPT_Close(g_memory_performance.p_ctrl); return (status.counter); }   以上代码用于测量从flash读数据所需的时间: 启动定时器开始计时,将 OSPI 控制器切换到 XIP模式,允许直接从外部存储器执行代码 使用 memcpy 函数将数据从源地址 p_src 复制到目标地址 p_dest,复制的数据大小为 (data_size * 1024) / 4 字节 再退出 XIP 模式,恢复 OSPI 的正常操作模式 最后,停止定时器结束计时。获取定时器的状态信息并存储在 status 结构体中,重置定时器以清除其计数值,返回定时器的计数值     整个程序还是相当复杂的,若想深入了解还需研究例程中QSPI和OSPI单独的工程。     ----DAC配置生成波形及性能测试----   先在配置界面使能DAC:     发现与ADC引脚冲突,失能ADC对应pin     在DAC界面属性找到对应函数     先将其中两个拖进 common_init.c     再修改例程LED的回调函数如下:   #include "math.h" #define M_PI 3.14159265358979323846 /********************************************************************************************************************** * Function Name: gpt_blue_callback * Description : Callback function for driver g_gpt_blue. * Argument : p_args * Return Value : . *********************************************************************************************************************/ void gpt_blue_callback(timer_callback_args_t * p_args) { /* Void the unused params */ FSP_PARAMETER_NOT_USED(p_args); uint16_t dacvalue = 0; static double w = 0.0; w += M_PI/90; if(w > 2*M_PI) { w = 0.0; } dacvalue = (sin(w) + 1) / 2 * 4095; R_DAC_Write(&g_dac0_ctrl, dacvalue); switch (s_blueled_flashing) { case ON:   FFT可见DAC输出效果可观,作为片上集成完全够用:       任务完成!   进阶任务 ----示例程序中新增命令打印信息----   两步即可 1、修改.c     static st_menu_fn_tbl_t s_menu_items[] = { {"HELLO Information" , hello_display_menu}, {"Kit Information" , kis_display_menu}, {"Web Server" , eth_emb_display_menu}, {"Network Name Lookup" , eth_www_display_menu}, {"Quad-SPI and Octo-SPI Speed Comparison" , ext_display_menu}, {"Cryptography and USB High speed (MSC)" , enc_display_menu}, {"Next Steps", ns_display_menu }, {"", NULL } };   2、头文件也需要修改:     效果如下:     任务完成!   扩展任务 ----设计一个类似信号发生器功能的例程---- ----通过命令或按键,设置DAC输出波形---- ----可通过flash存储历史波形等信息----   与基础任务类似,我将函数发生功能在回调函数中实现。 利用按键改变 g_board_status 结构体中成员值的效果,实现四种波形、四种频率的输出   分别为: 正弦波 方波 三角波 随机波 正弦波实现方法与基础任务类似方波则是通过计数的方式实现。 三角与方波类似,添加上升和下降的判断逻辑即可 随机波形则是使用到了C语言中随机数的生成,具体可以了解下 rand() 函数 回调函数代码如下:   #include "math.h" #include "stdlib.h" #define M_PI 3.14159265358979323846 static uint16_t wavemode = 0; /********************************************************************************************************************** * Function Name: gpt_blue_callback * Description : Callback function for driver g_gpt_blue. * Argument : p_args * Return Value : . *********************************************************************************************************************/ void gpt_blue_callback(timer_callback_args_t * p_args) { /* Void the unused params */ FSP_PARAMETER_NOT_USED(p_args); uint16_t dacvalue = 0; static uint16_t squareval = 0; static uint16_t trista = 0; static double w = 0.0; wavemode = g_board_status.led_intensity; if(g_board_status.led_intensity == 0 ) { w += M_PI/(60*(g_board_status.led_frequency+1)); if(w > 2*M_PI) { w = 0.0; } dacvalue = (sin(w) + 1) / 2 * 4095; } if(g_board_status.led_intensity == 1 ) { dacvalue = squareval*4095; w += 0.1*(g_board_status.led_frequency+1); if(w > 2*M_PI) { w = 0.0; squareval = !squareval; dacvalue = squareval*4095; } } if(g_board_status.led_intensity == 2 ) { if(trista == 0) { w += 0.1*(g_board_status.led_frequency+1); if(w>=4) trista = !trista; } else { w -= 0.1*(g_board_status.led_frequency+1); if(w<=0) trista = !trista; } dacvalue = (w / 4.5)*4095 ; } if(g_board_status.led_intensity == 3 ) { dacvalue = rand()%4095; }   而将历史波形写入flash也很简单。     回调函数中添加判断,若改变了输出波形,则将对应的波形代号写入flash:   static uint16_t flag_wavemode = 4; static uint16_t frq_wavemode = 4; /********************************************************************************************************************** * Function Name: gpt_blue_callback * Description : Callback function for driver g_gpt_blue. * Argument : p_args * Return Value : . *********************************************************************************************************************/ void gpt_blue_callback(timer_callback_args_t * p_args) { /* Void the unused params */ FSP_PARAMETER_NOT_USED(p_args); uint16_t dacvalue = 0; static uint16_t squareval = 0; static uint16_t trista = 0; static double w = 0.0; wavemode = g_board_status.led_intensity; if( flag_wavemode != wavemode | frq_wavemode != g_board_status.led_frequency ) { write_record_ospi(flag_wavemode,frq_wavemode); }   参考OSPI编写的写函数如下:   static void write_record_ospi(uint16_t param1, uint16_t param2) { fsp_err_t err; uint32_t test_var; /* Cast to required type */ uint8_t * p_dest = (uint8_t *)OSPI_DMA_ADDRESS; /* Define the data to be written (in this case, the two uint16_t parameters) */ uint8_t data_to_write[4]; // 2 uint16_t = 4 bytes data_to_write[0] = (uint8_t)(param1 & 0xFF); // Lower byte of param1 data_to_write[1] = (uint8_t)((param1 >> 8) & 0xFF); // Higher byte of param1 data_to_write[2] = (uint8_t)(param2 & 0xFF); // Lower byte of param2 data_to_write[3] = (uint8_t)((param2 >> 8) & 0xFF); // Higher byte of param2 /* Loop to write the data to Flash */ for (test_var = 0; test_var < OSPI_TEST_PAGE_SIZE / sizeof(data_to_write); test_var++) { /* Perform the actual OSPI write operation */ err = R_OSPI_Write(g_ospi.p_ctrl, s_page, p_dest, OSPI_TEST_PAGE_SIZE); if (FSP_SUCCESS != err) { __asm("bkpt"); } //ospi_test_wait_until_wip(); p_dest += OSPI_TEST_PAGE_SIZE; } /* Return some status or indication after writing (can be modified based on actual requirement) */ //return 0; // or other status as needed }   波形输出效果如下(GIF有点大要加载一会):       类信号发生器功能实现,任务完成!   对本活动的心得体会   最后还是感谢活动举办方EEWorld和得捷电子的支持   这块开发板的功能丰富,还有很多没用到的外设,如:以太网、QWIIC,甚至还有树莓派接口   值得研究   2024/12/15        

  • 2024-09-23
  • 回复了主题帖: 罗姆有奖直播 | 高输出功率激光二极管—助力激光雷达性能提升

    已报名参加

  • 2024-08-27
  • 回复了主题帖: >>征集 | 使用 MCU,哪些问题最令你头大?

    下载和调试接口不够统一,就比如最近用到的DAP:项目开源、成本较低、速度较快,但就是不能给某些芯片下载程序。有的厂家喜欢jtag,有的喜欢串口,有的喜欢自己设计专用下载器。做不同的项目就要备不同的下载器,切换也不够方便

  • 2024-08-22
  • 回复了主题帖: 运放电源接反的影响?

    电源压降这么厉害就应该检查一下负载,上电后电源异常优先查找短路。没底的话上电时用热成像看一下

  • 2024-08-21
  • 发表了主题帖: 【51篇】(7-1)C51单片机实现按键控制的MAX517四种波形输出并显示

    本帖最后由 QuaX_Chow 于 2024-8-21 22:12 编辑 声明及本系列注意事项优先阅读:🔗 工程源码及仿真文件入口在文末,如果没显示就是还在审核   任务要求:使用C51实现四按键控制MAX517分别产生方波、三角波、锯齿波和正弦波,波形通过Proteus内的示波器显示,在P2.0~P2.3接四个按键开关,分别对应与四种波形;时钟信号由,一开始无按键按下时无输出   想要实现以上功能,我们需要将任务拆分为以下几个部分: MAX517通信 中断按键判断     1.Proteus部分   波形显示使用的是虚拟仪器模式中的“OSCILLOSCOPE”四通道示波器:     搭建好的仿真电路如下:     如果在仿真时不小心把波形显示窗口关掉了,只需在仿真状态下点击菜单栏里的“调试”-“Digital Oscilloscope”,即可显示示波器界面     2.代码部分   (1)MAX517通信   在我们驱动MAX517之前,我们首先需要理清这颗芯片的时序 驱动MAX517需要使用两线串行接口,兼容IIC 见下图:     一条时钟线,一条数据线。声明如下:   sbit SCL = P1^0;//MAX517串行时钟 sbit SDA = P1^1;//MAX517串行数据   开始状态标志为时钟线高、数据线下降沿。结束状态标志为时钟线高、数据线上升沿。 在编程时我们就需要根据芯片时序,使用GPIO进行模拟。 以SC为示例编写函数:   void start(void)//起始条件子程序 { SDA= 1; SCL = 1; _nop_(); SDA =0; _nop_(); }   完整的传输过程如下图:     控制MAX517模拟输出需要根据上图步骤编写一个有着完整的:启动-发送地址-应答-命令-应答-数据-应答-结束,流程的函数:   void DACOut (uchar ch)//串行D/A转换子程序 { start();//发送启动信号 send(0x58);//发送地址字节 ack(); send(0x00);//发送命令字节 ack(); send(ch);//发送数据字节 ack(); stop();//结束一次转换 }   如果我们需要输出一个指定的电压,就只需要 DACOut(需要的值);  公式如下:   但是我们需要输出的是波形,而非稳定的电平,所以我们需要一直改变输出模拟量的值ch。 以输出正弦波为例,创建数组存储ch的值,使用在输出时仅需将元素递增:   uchar sindata[64]= { 0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1, 0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff, 0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3, 0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c, 0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e, 0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0, 0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e, 0x38,0x43,0x4e,0x5a,0x66,0x73};   方波、锯齿、三角波的实现思路类似,循环内递增、递减、延时即可,具体方法参见文末源码   (2)中断按键判断   要实现立刻切换输出波形的功能,我们需要使用到外部中断0,中断服务函数如下:   void intp0() interrupt 0 { if(P2_0 == 0) key = 0;//三角波 if(P2_1 == 0) key = 1;//方波 if(P2_2 == 0) key = 2;//正弦 if(P2_3 == 0) key = 3;//锯齿波 }       四种波形输出效果如下:       任务完成     2024/8/21 源码以及仿真文件 #本文首发于EEWORLD,版权归作者所有 补充内容 (2024-8-27 14:28): 勘误:任务要求部分:“时钟信号由,一开始无按键按下时无输出”改为“一开始无按键按下时无输出”

  • 2024-08-20
  • 上传了资料: C51单片机实现按键控制的MAX517四种波形输出并显示

  • 发表了日志: 【51篇】(1-1)片内RAM两字节的拆与拼

  • 2024-08-05
  • 回复了主题帖: 【大学生电子竞赛题目分析】——2024年C题《无线传输信号模拟系统》

    测评老师是不知道题目的,他们只会按照测评表上的要求进行测评。测量条件没满足直接不测,该项目完全没分。并且本次电赛设计赛题及测评的人极为不专业,甚致认为信号时延仅需调整初相位即可,忽略t趋近于+0时多径信号SM(t)应该为0

  • 2024-07-03
  • 发表了主题帖: 【51篇】(1-0)使用Keil5和Proteus的系列实验

    本帖最后由 QuaX_Chow 于 2024-7-3 21:56 编辑   新的一轮学习周期结束,有感而发,总结一下上个阶段的学习成果与心得。 虽是故知新说,但不想让炒了4个月的冷饭白炒,故开帖此系列👆   链接目录: (1-0)本篇:系列说明 (1-1)片内RAM两字节的拆与拼 (1-2)片内RAM单字节十进制值的百十个位拆分 (2-1)片内RAM单字节十进制值的百十个位拆分并显示 (3-1)C51单片机利用定时器输出PWM (4-1)C51单片机串行口扩展并行口 (4-2)C51单片机使用串口交换双机指定并口状态并使用LED显示 (5-1)C51单片机实现双按键控制八位数码管滚动十六进制数 (5-2)C51单片机实现有紧急时间的红绿灯控制 (6-1)C51单片机实现LCD1602两行滚动非等长含自定义字符 (7-1)C51单片机实现按键控制的MAX517四种波形输出并显示 (7-2)C51单片机实现按键控制的ADC0808八路模拟量测量并显示 (待续     1.软件说明   所有仿真使用的Proteus版本均为8.17,低版本大概率不兼容   所有代码部分使用的Keil版本均为5.39,低版本有概率不兼容   2.代码说明   所有上传的代码均进行过仿真验证,未进行实物验证 本人水平有限,不可能代码最简化且部分仿真会有小瑕疵,欢迎讨论   初始几个实验会使用汇编,后面均为C   2024/7/3     补充内容 (2024-8-21 22:14): “按键控制的MAX517四种波形输出并显示”已更新: https://bbs.eeworld.com.cn/thread-1291106-1-1.html

  • 发表了主题帖: 【51篇】(5-1)C51单片机实现双按键控制八位数码管滚动十六进制数

    本帖最后由 QuaX_Chow 于 2024-7-3 15:58 编辑 2024/5/27 新建帖子   声明及本系列注意事项优先阅读:🔗 工程源码及仿真文件入口在文末   任务要求:使用C51实现双按键控制八位数码管滚动十六进制数,反向滚动间隔时间为正向的两倍,一开始无按键按下时不显示   想要实现以上功能,我们需要将任务拆分为以下几个部分: ms级定时器 数码管扫描函数 中断按键判断 延时函数(用于数码管余辉)   1.Proteus部分   数字显示使用的是Proteus中的八段共阴数码管,型号为:7SEG-MPX-8-CC-BLUE:   搭建好的仿真电路如下。红框为基础电路,外部中断0与按键之间使用与门且拉高:   2.代码部分   阳极连接的是P0口,需要在扫描函数中将每个十六位进制数对应的字段码 字段码如下: smg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   而阴极连接单片机对应的片选代码如下: unsigned char code yang[8]={0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};   声明uint类型的direct变量用于判断方向。在main函数中实现数码管扫描的仿真效果更好。 void main() { unsigned char i; unsigned int k; init(); Timer0Init(); direct = 2;//初始无滚动方向 while(1) { while(direct == 0) { flag = 0; while(direct == 0) { for(i=0;i<8;i++) { k = flag+i; if( flag+i >= 16) k -= 16; choose = yang[i]; show = smg[k]; delay(1); } } } while(direct == 1) { flag = 16; while(direct == 1) { for(i=0;i<8;i++) { k = flag+i; if( flag+i < 0) k += 16; if( flag+i >= 16) k -= 16; choose = yang[i]; show = smg[k]; delay(1); } } } } }   参考中断表编写中断服务函数,外部中断0的中断号为0,定时器0为1:   外部中断0的中断函数中对按键进行了判断,仿真电路无需消抖: void change() interrupt 0// using 0 { // do{ // key(); // }while(j == 1); //中断函数,当按键按下时中断 // if(P3_2 == 0) // { if(P1_6 == 0) direct = 0; if(P1_7 == 0) direct = 1; // } }     定时器提供数码管刷新基准(flag),每当基准达到15则清零,反向滚动计数值为正向的两倍: void intp1() interrupt 1 { jm++; if(direct == 0) { if(jm == 12) { TF0 = 0; flag++; if(flag==16) flag = 0; jm = 0; } } if(direct == 1) { if(jm == 24) { TF0 = 0; flag--; if(flag==0) flag = 16; jm = 0; } } }     最终效果如下:     任务完成       2024/7/3 源码以及仿真文件 #本文首发于EEWORLD,版权归作者所有    

  • 发表了日志: 【51篇】(1-0)使用Keil5和Proteus的系列实验

  • 2024-05-27
  • 上传了资料: C51单片机实现双按键控制八位数码管滚动十六进制数

  • 2024-03-30
  • 发表了主题帖: 【得捷Follow me第4期】(补充)网络控制STM32从机、实现简易频率计功能

    本帖最后由 QuaX_Chow 于 2024-3-30 21:21 编辑 2024.3.30 本篇是Follow Me第四期任务提交的补充内容   分两个部分:网络控制STM32从机、实现简易频率计功能   1.网络控制从机   电脑上由网络调试助手使用TCP向W5500-EVB-Pico发送指令,再由W5500-EVB-Pico通过串口,向从机发送我们在从机设定好的指令,这样从机即可进行对应操作   框架示意图如下:   经查阅手册,从机主控F407的USART3为PB10和PB11:     连接即可:     对应在W5500-EVB-PICO上如下所示:     这里我们需要使用stlink给从机下载代码。 最终实物连接图如下:     功能实现代码如下:   from usocket import socket from machine import Pin, SPI, UART import network import time # 初始化UART uart = UART(0, baudrate=115200, bits=8, stop=1) # 初始化WIZNET5K以太网模块 def w5x00_init(): spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18)) nic = network.WIZNET5K(spi, Pin(17), Pin(20)) # spi, cs, reset引脚 nic.active(True) nic.ifconfig(('192.168.137.100', '255.255.255.0', '192.168.137.1', '8.8.8.8')) print('IP地址:', nic.ifconfig()) while not nic.isconnected(): time.sleep(1) # 服务器循环 def server_loop(): s = socket() s.bind(('192.168.137.100', 5050)) s.listen(5) conn, addr = s.accept() print("已连接到:", conn, "地址:", addr) print("服务器已开启") while True: data = conn.recv(2048) print("发送: ", data.decode('utf-8'), " 给从机") if data != b'NULL': uart.write(data) # 客户端循环 def client_loop(): s = socket() s.connect(('192.168.137.114', 5050)) print("循环客户端已连接!") while True: data = s.recv(2048) print(data.decode('utf-8')) if data != b'NULL': s.send(data) def main(): w5x00_init() while True: server_loop() if __name__ == "__main__": main()   通过输入1~4四个数字,即可控制对应led的状态:     2.实现简易频率计功能   模块:MCU与AK5522使用IIS通信,AK5522读取到阈值高电平,模块串口打印一次“1” 这里需要开启双核,一个核用于定时,一个计数   框架示意图如下:     W5500-EVB-Pico通过串口👇直接读取AK5522模块发送的数据     模块的部分原理图如下:     功能实现代码如下: from usocket import socket from machine import Pin, UART import time import _thread # 初始化UART1和UART0 uart1 = UART(1, baudrate=115200, bits=8, stop=1) uart0 = UART(0, baudrate=115200, bits=8, stop=1) # 初始化计数器 count = 0 # Core 0的线程函数,用于接收数据并计算1的数量 def receive_and_count(): global count while True: if uart1.any(): data = uart1.read(64) # 读取UART1接收到的数据 count += data.count(b'1') time.sleep(1) # 每秒计算一次1的数量 # Core 1的线程函数,用于打印1的数量 def print_count(): while True: uart0.write('FRE: {}\n'.format(count)) time.sleep(1) # 每秒打印一次计数结果 # 启动Core 0的线程 _thread.start_new_thread(receive_and_count, ()) # 在Core 1上运行打印1的数量的代码 print_count()   ,用补充1的F407开发板输出1KHz的PWM,串口助手显示如下:     可以看见开发板十分准确地每秒打印了当前频率   功能实现   (完)

  • 2024-02-25
  • 上传了资料: 【得捷Follow me第4期】玩转W5500-EVB-Pico 资料包

最近访客

< 1/2 >

统计信息

已有17人来访过

  • 芯积分:575
  • 好友:--
  • 主题:8
  • 回复:10

留言

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


现在还没有留言