安路SOC EF2M45(MCU+FPGA)点灯测试

📅 2026/8/21 21:42:22
安路SOC EF2M45(MCU+FPGA)点灯测试
文章目录前言基础说明FPGA项目MCU项目MCU调试后记前言之前搞了一块安路EF2M45的板子最近有时间拿来测试下。EF2M45这颗料是MCUFPGA架构的同类型的比较常见的还有AGM和高云的一些芯片。这种芯片相比独立的MCU加FPGA的方案来说集成度高一些并且MCU和FPGA间交互可以走内部总线或者直接内存交互使用起来相比通过外部总线通信来说会方便一些。本文示例下载https://pan.baidu.com/s/11YLcQMa5udpMpMPppjeyUA?pwd3yrt基础说明安路的这颗料的文档、demo以及SDK在下面仓库https://github.com/AnlogicInfo/EF2M45-SOC另外这颗料也有官方的开发板https://www.anlogic.com/product/xaizaiqi/abc/aabbc这颗SOC的内容在文档中有描述最核心的一些内容如下FPGA端的开发使用安路自家的软件TangDynasty但是对于EF2M45这颗料来说目前最新的软件TD_Release_2026.1_SP2有BUG添加MCU固件后编译时会报找不到固件使用较低版本TD_5.6.5_SP5_170155就没有问题。软件具体的安装使用可以参考下面文章。安路FPGA开发入门https://blog.csdn.net/Naisu_kun/article/details/145329807MCU端开发基于Keil目前Keil社区版对个人免费了https://www.keil.arm.com/mdk-community/https://www.keil.com/demo/eval/arm.htm申请License时需要一个PSN码说是注册了可以找到不过我并未找到用了网上的码可以申请下来42B2L-JM9GY-LHN8CFPGA项目在TD中新建项目然后添加PLL接着添加MCUGPIO_L0和GPIO_L1是默认的调试口无法修改接着添加ef2m45_test.v文件并设置为顶层文件该文件内容如下module ef2m45_test( clk, rst_n, hw_led, sw_led ); input clk; input rst_n; output reg hw_led; //FPGA drive led output sw_led; //MCU drive led //--------------------------------------- //sys_pll module //--------------------------------------- wire clk200; wire clk25; pll pll( .refclk (clk), .reset (~rst_n), .extlock (), .clk0_out(clk200), .clk1_out(clk25) ); //--------------------------------------- //MCU module //--------------------------------------- wire gpio_h0_out; wire gpio_h0_en ; // if gpio_h0_en 1b0, gpio_h0 is output; // if gpio_h0_en 1b1, gpio_h0 is input ; // the enable configured by Software assign sw_led gpio_h0_en ? 1bz : gpio_h0_out; mcu mcu( .ppm_clk (clk25), // MCU clk input .ppm_rstn (rst_n), // .gpio_h0_out (gpio_h0_out), // gp_h0 output port .gpio_h0_oe_n(gpio_h0_en), // tri enable .gpio_h0_in (sw_led) // gp_h0 input port ); //--------------------------------------- //hw_led blink //--------------------------------------- reg [31:0] hw_led_cnt; always (posedge clk25 or negedge rst_n) begin if(~rst_n) begin hw_led_cnt 32d0; hw_led 1b0; end else if (hw_led_cnt 12_500_000) begin hw_led_cnt 0; hw_led !hw_led; end else begin hw_led_cnt hw_led_cnt 1b1 ; end end endmodule接下来可以编译看看有没有语法错误等。没问题的话可以设置IO口set_pin_assignment { clk } { LOCATION P21; IOSTANDARD LVCMOS25; PULLTYPE PULLUP; } set_pin_assignment { hw_led } { LOCATION P27; IOSTANDARD LVCMOS25; DRIVESTRENGTH 8; PULLTYPE PULLUP; } set_pin_assignment { rst_n } { LOCATION P41; IOSTANDARD LVCMOS25; PULLTYPE PULLUP; } set_pin_assignment { sw_led } { LOCATION P26; IOSTANDARD LVCMOS25; DRIVESTRENGTH 8; PULLTYPE PULLUP; }接下来需要在准备MCU的固件这颗料开发时MCU的固件需要打包到比特流文件中一起进行下载FPAG启动时会把MCU固件加载到内存中添加完成后再编译就行。编译完成就可以下载到芯片中了MCU项目在Keil中新建CM3的项目项目建立后首先需要添加芯片的BSP包添加分散加载文件链接脚本脚本内容是需要根据存储分布进行调整的下面是本次测试用到的#! armclang -E --targetarm-arm-none-eabi -mcpucortex-m3 -xc -I.\ELF2_BSP #include .\ELF2_BSP\platform.h #if (RUN_ON_FLASH 0) LR_IRAM1 0x00000000 { ; load address execution address RO_IRAM1 0x00000000 { *.o (RESET, First) } INT_CALLBACK_TBL 0 { *(int_callback_area) } RO_IRAM2 0 { *(InRoot$$Sections) .ANY (RO) } RW_IRAM0 0x20000000 0x00008000 { ; RW data .ANY (RW ZI) } } ScatterAssert(ImageLimit(RO_IRAM2)0x00004000) #else LR_FLASH 0x10000000 0x00800000 { ; load region size_region ISR_VECTOR 0x20000000 { *.o (RESET, First) } INT_CALLBACK_TBL 0 { *(int_callback_area) } ER_FLASH 0x10000000ImageLength(ISR_VECTOR)ImageLength(INT_CALLBACK_TBL) 0x00800000 { ; load address execution address *(InRoot$$Sections) .ANY (RO) } CODE_IN_RAM ImageLimit(INT_CALLBACK_TBL) { cache.o(RO) qspi.o(RO) flash.o(RO) dma.o(RO) } DATA_IN_RAM ImageLimit(CODE_IN_RAM) { ; RW data .ANY (RW ZI) } } ScatterAssert(ImageLimit(DATA_IN_RAM)0x20008000) #endif添加编译后命令使编译时可以生成bin文件fromelf-c-v-a--outputP.asm Objects\%L fromelf--bin--outputP.bin Objects\%L本次测试用到的main.c文件代码如下#includestdint.h#includegpio.hvoiddelay_ms(uint32_tms){staticconstuint32_tdelay_ms_base16666;uint32_ttotalms*delay_ms_base;while(total--){__NOP();__NOP();__NOP();}}intmain(){GPIO_InitTypeDef testgpio_output;testgpio_output.dirgpio_Output;testgpio_output.debouncegpio_Deb;testgpio_output.valuegpio_High;HAL_GPIO_Init(gpio1_0,testgpio_output);for(;;){HAL_GPIO_WritePin(gpio1_0,gpio_Low);delay_ms(500);HAL_GPIO_WritePin(gpio1_0,gpio_High);delay_ms(500);}return0;}接下来可以正常编译程序了编译后得到的固件给到TD软件来生成比特流文件然后烧录到芯片中。需要注意的是有可能烧录后程序可能需要芯片复位后才会运行这个可能和FPAG中MCU的复位信号设置有关。MCU调试MCU调试需要进行一些设置首先需要取消调试前下载因为下载是通过TD软件进行的调试需要使用SW接口接着需要设置初始化文件SP 0x00000000; PC 0x00000004;设置好后就可以开始进行调试了后记这颗芯片的基础使用到不复杂不过我用的过程中算是碰到了一些问题有软件不适配的问题有程序不启动的问题总体还是花了一些时间的。MCUFPGA在一颗芯片上的方案有些场景下还是比较方便的。不过只是针对当前这颗芯片使用的整体的体验来说相比传统的独立的MCU和独立的FPGA的方案来说并没有太大的优势。考虑到开发的灵活性来说很多时候可能还是后者更好一些。安路的这颗料的BSP代码不是开源的只提供了.lib文件。而且文档这些都比较简单很多细节都东西都没有讲。另外BSP资料最近一次更新已经六七年了。综合这些来说这颗料很难成为同类方案首选的芯片。