wstcllx

  • 2025-03-31
  • 发表了主题帖: 【AG32VH407开发板】CPLD项目文件更新一些问题

    在程序一直使用过程,可能经常涉及到目录或者文件变更。我们会让你为通过Prepare之后是可以的,实际上,有很多是没有修改的。要手动修改。 这里列了以下几点。 1、这个alta_sim.v文件不会修改目录,其他.V也是主要修改引脚定义部分。   2、platformio 里面board_logic.device = AGRV2KL100,修改后,logic的example_board.proj不会修改。Supra打开还是64.只能通过手动或者删除自动重新生成。   3、PrepareLOGIC 是不是可以再加一个Compile LOGIC ,自动打开Supra编译。这样应该使用方便些。

  • 发表了主题帖: 【AG32VH407开发板】example_cpldRxDma移植

    本帖最后由 wstcllx 于 2025-3-31 16:49 编辑 1、复制参考样例,用VS打开。感觉platformio有个BUG,目录里面们没有platformio.ini文件却不能用。       对比发现是.vscode 里面两个json文件目录基本没更新。   删除目录,重新打开才行。编译,ok了   2、将board = agrv2k_303改为agrv2k_103,logic_device = AGRV2KL64   对。ve的引脚定义进行修改。  UART0_UARTRXD PIN_43 UART0_UARTTXD PIN_42 #GPIO4_1 PIN_39 # LED1 #GPIO4_2 PIN_38 # LED2 #GPIO4_3 PIN_37 # LED3 #GPIO4_4 PIN_36 # LED4 由于CPLD程序和逻辑都不用管,所以只需要打开Supra编译一次重新映射的引脚就好了。   编译成功, Upload LOGIC +Upload即可。    

  • 2025-03-20
  • 发表了主题帖: 【AG32VH407开发板】UartTx例程移植

    第一步,拷贝出example过程到自己的目录下(备份及解除只读)。   第二部打开工程,platformio.ini增加两行,name和dir,表示生产的逻辑目录logic和逻辑程序主程序的文件名analog_ip.v。        第三步,VE文件修改引脚映射。platform IO 哪里prepare LOGIC,生成逻辑程序     第四步,打开目录下的项目,记得一定要13.0的quartus。 quartus 18试过不行。   第5步,用tcl工具run一下。(不run好像编译出来的没有逻辑单元使用,即空程序)     第六步,移植代码 module analog_ip ( output tri0 TEST_LED, output tri0 UART_TX, input sys_clock, input bus_clock, input resetn, input stop, input [1:0] mem_ahb_htrans, input mem_ahb_hready, input mem_ahb_hwrite, input [31:0] mem_ahb_haddr, input [2:0] mem_ahb_hsize, input [2:0] mem_ahb_hburst, input [31:0] mem_ahb_hwdata, output tri1 mem_ahb_hreadyout, output tri0 mem_ahb_hresp, output tri0 [31:0] mem_ahb_hrdata, output tri0 slave_ahb_hsel, output tri1 slave_ahb_hready, input slave_ahb_hreadyout, output tri0 [1:0] slave_ahb_htrans, output tri0 [2:0] slave_ahb_hsize, output tri0 [2:0] slave_ahb_hburst, output tri0 slave_ahb_hwrite, output tri0 [31:0] slave_ahb_haddr, output tri0 [31:0] slave_ahb_hwdata, input slave_ahb_hresp, input [31:0] slave_ahb_hrdata, output tri0 [3:0] ext_dma_DMACBREQ, output tri0 [3:0] ext_dma_DMACLBREQ, output tri0 [3:0] ext_dma_DMACSREQ, output tri0 [3:0] ext_dma_DMACLSREQ, input [3:0] ext_dma_DMACCLR, input [3:0] ext_dma_DMACTC, output tri0 [3:0] local_int ); //assign mem_ahb_hreadyout = 1'b1; //assign slave_ahb_hready = 1'b1; parameter ADDR_BITS = 16; //����ʹ�õ��ĵ�ַλ�� parameter DATA_BITS = 32; //����ʹ�õ�������λ�� //�������ahbתapb����apb���ź��� wire apb_psel; wire apb_penable; wire apb_pwrite; wire [ADDR_BITS-1:0] apb_paddr; wire [DATA_BITS-1:0] apb_pwdata; wire [3:0] apb_pstrb; wire [2:0] apb_pprot; wire apb_pready = 1'b1; wire apb_pslverr = 1'b0; wire [DATA_BITS-1:0] apb_prdata; //apb��clockʹ��bus_clock��Ҳ����ʹ������clock�� //�����������豸�������о���apb_clock��ʱ��Ƶ�ʡ� assign apb_clock = bus_clock; //���ahb2apbģ�顣 //������#(ADDR_BITS, DATA_BITS) ����дahb2apb��Ӧ�ĺ���ֵ�� ahb2apb #(ADDR_BITS, DATA_BITS) ahb2apb_inst( .reset (!resetn ), .ahb_clock (sys_clock ), .ahb_hmastlock(1'b0 ), .ahb_htrans (mem_ahb_htrans ), .ahb_hsel (1'b1 ), .ahb_hready (mem_ahb_hready ), .ahb_hwrite (mem_ahb_hwrite ), .ahb_haddr (mem_ahb_haddr[ADDR_BITS-1:0]), .ahb_hsize (mem_ahb_hsize ), .ahb_hburst (mem_ahb_hburst ), .ahb_hprot (4'b0011 ), .ahb_hwdata (mem_ahb_hwdata ), .ahb_hrdata (mem_ahb_hrdata ), .ahb_hreadyout(mem_ahb_hreadyout ), .ahb_hresp (mem_ahb_hresp ), .apb_clock (apb_clock ), .apb_psel (apb_psel ), .apb_penable (apb_penable ), .apb_pwrite (apb_pwrite ), .apb_paddr (apb_paddr ), .apb_pwdata (apb_pwdata ), .apb_pstrb (apb_pstrb ), .apb_pprot (apb_pprot ), .apb_pready (apb_pready ), .apb_pslverr (apb_pslverr ), .apb_prdata (apb_prdata ) ); //��������֣�һ����mcu��ahb���ź�(mem_ahb_xxxx)��һ����ahbתapb֮�����źţ�apb_xxxx) //�������£�����ֱ��ʹ��apb_xxxx�źţ���ѭAPBЭ�鼴�ɡ� parameter UART_ADDR = 'h6000; //��Ӧmcu����0x60006000, cpld�н�������ƫ�� //����cpld��Ҫ�Ҷ������裬���Դ������ķֶ�����ֲ�ͬ�豸��ʹ�á�Ƭѡ���ĸ�� parameter ADDR_UART_DATA = 'h00; //д�ļĴ��� parameter ADDR_UART_STAT = 'h04; //��ļĴ���������λΪbusyλ�������ڶ�λΪtcλ�� //�����õ�led��cpld�в���debug��ֻ�ܿ�led���������ж����������� reg TestLedCtrl = 1; //assign TEST_LED = TestLedCtrl; reg uart_start; //�Ƿ����� reg uart_reset; //�Ƿ�reset reg[7:0] uart_write; //mcuд�������ߣ�����Ҫͨ�����ڷ��������ݣ���32λ��ȡĩ8λ wire tx_busy; //�Ƿ����ڷ����� wire tx_complete; //�Ƿ��������� wire uart_tx_line; //����uart���ݣ�Ҫ������tx�ź��ߣ�����VE�ﶨ���� PIN_17 reg [31:0] prdata; //mcu��������� //�ϱߵ�tx_busy��tx_complete�Ƿ��ظ�mcu��״̬�� //��Щ���ǰ��Լ��������壬��mcu����ʵ����Ϣ�������ɡ� assign UART_TX = uart_tx_line; wire apb_data_phase = apb_psel && apb_penable; //����apb_penable��������apb_psel��Ϊ1 assign apb_prdata = prdata; // ��APB���������ͨ�����ڷ��ͳ�ȥ always @ (posedge apb_clock or negedge resetn) begin if (!resetn) //��ʼ begin uart_reset <= 0; uart_start <= 0; end //mcu��д������ //mcu����C���ԣ�*((int *)0x60006000) = value; else if (apb_data_phase && apb_pwrite && apb_paddr == UART_ADDR + ADDR_UART_DATA) //�յ�mcuд��������� begin //TestLedCtrl <= 0; //led���ԣ���Ϊled�� uart_write <= apb_pwdata[7:0]; //ֻ����8λ��uart_write��·�����uart_txģ�飬��uart_txģ����������ʱ�����ⷢ�� uart_start <= 1; uart_reset <= 1; end //mcu�Ķ������Ӧ //mcu����C���ԣ�int value = *((int *)0x60006004); else if (apb_data_phase && !apb_pwrite && apb_paddr == UART_ADDR + ADDR_UART_STAT) //�յ�mcu��ȡstate�Ĵ����UART��״̬ͨ��APB���ػ�ȥ begin prdata <= {30'b0, tx_complete, tx_busy}; //����λΪbusyλ�������ڶ�λΪtcλ����30λ��Ч //if (uart_txComplete == 1) TestLedCtrl <= 1; //led���� end else begin uart_start <= 0; end end //������uart����ģ�� //����ģ���ڵ�ʵ���߼����Ǹ�״̬���� // ��һ��byte���͹��̲��ֳ�5���׶Σ�׼��������������ݣ�7��bit��������1��bit�������� // ����������start�ź�������� // Ȼ������clock�ļ��������״̬�����ղ����ʼ���ÿ��bitҪ���ѵ�clock���������������¸�bit...�� // ��������2��bit����stopλ���������͹��̽����� //������ͺ���busy״̬λ����1��ȫ���������ɺ�״̬λ���û�0 uart_tx uart_tx_ins ( .reset_n (uart_reset), .clk (apb_clock), .start (uart_start), .registor (uart_write), .uart_tx (uart_tx_line), .uart_tc (tx_complete), .uart_busy (tx_busy) ); RUN_LED led_module( .clk_100M(apb_clock), .rset_n(uart_reset), .LED(TEST_LED) ); endmodule module uart_tx( input wire reset_n, input wire clk, input wire start, input wire [7:0] registor, output wire uart_tx, output reg uart_tc, output reg uart_busy ); reg uart_tx_value; reg started; reg [2:0] uart_state; reg [15:0] clkcounter; reg [4:0] txdatabitcounter; reg [3:0] Delaycycle; //State Parameters parameter UARTSTATE_WAIT = 0; parameter UARTSTATE_START = 1; parameter UARTSTATE_DATA = 2; parameter UARTSTATE_STOP = 3; parameter UARTSTATE_LASTBIT = 4; parameter UARTBAUDRATE = 868; //100Mhz clk 115200. 即:100M频率下115200的波特率,每个bit要维持的clk数是868个 parameter UARTSTOPLEN = 1736; //868*2 停止位要维持的clk个数 //tri-state buffer for sda and scl assign uart_tx = uart_tx_value; always @ (posedge clk or negedge reset_n) begin if (!reset_n) begin started <= 0; Delaycycle <= 0; end else if(start && !started) begin started <= 1; Delaycycle <= 0; end else if (Delaycycle < 10) begin Delaycycle <= Delaycycle + 1'b1; end else begin if(!uart_busy) begin started <= 0; end end end //capture incomming data on SDA line always@(posedge clk or negedge reset_n) begin if( !reset_n ) //initializes data out to high impedence begin uart_state <= UARTSTATE_WAIT; uart_tx_value <= 1; clkcounter <= 0; uart_busy <= 0; uart_tc <= 0; end else begin if(started | start) begin case( uart_state ) UARTSTATE_WAIT: begin uart_state <= UARTSTATE_START; uart_tx_value <= 0; uart_busy <= 1; clkcounter <= 0; end UARTSTATE_START: begin uart_busy <= 1; if(clkcounter < UARTBAUDRATE) begin clkcounter <= clkcounter + 1'b1; end else begin clkcounter <= 0; uart_state <= UARTSTATE_DATA; txdatabitcounter <= 1; uart_tx_value <= registor[0]; end end UARTSTATE_DATA: begin if(clkcounter < UARTBAUDRATE) begin clkcounter <= clkcounter + 1'b1; end else begin clkcounter <= 0; if(txdatabitcounter > 7) begin uart_tx_value <= 1; uart_state <= UARTSTATE_LASTBIT; end else begin uart_tx_value <= registor[txdatabitcounter]; txdatabitcounter <= txdatabitcounter + 1'b1; end end end UARTSTATE_LASTBIT: begin if(clkcounter < UARTBAUDRATE) begin clkcounter <= clkcounter + 1'b1; end else begin uart_state <= UARTSTATE_STOP; clkcounter <= 0; uart_tx_value <= 1; end end UARTSTATE_STOP: begin if(clkcounter < UARTSTOPLEN) begin clkcounter <= clkcounter + 1'b1; if(clkcounter == (UARTSTOPLEN-2)) begin uart_busy <= 0; uart_tc <= 1; end end else begin uart_state <= UARTSTATE_WAIT; end end default: begin uart_busy <= 0; end endcase end else begin uart_state <= UARTSTATE_WAIT; uart_busy <= 0; uart_tx_value <= 1; end end end endmodule module RUN_LED( input clk_100M, input rset_n, output LED ); reg ledreg=1'd0; reg[25:0] clknum; reg[25:0] ledclknum=26'd0; parameter ledclk_50hz = 25'd25000000; always @(posedge clk_100M ,negedge rset_n ) if(!rset_n) begin ledclknum <=26'd0; ledreg <=1'd0; end else begin ledclknum = ledclknum+1'd1; if(ledclknum > ledclk_50hz ) begin ledreg <= ~ledreg ; ledclknum <=26'd0; end end assign LED=ledreg; endmodule 第7步 ,quartus编译一遍,编译完成看到使用逻辑225,然后用Surpra工具打开目录下的项目,Compile一下。此时固件生成完成。       第8步,回到Vscode,UpLoad Logic就能看到闪灯了。然后将Uart Tx的代码移植如下 #include "example.h" void Button_isr(void) { if (button_isr_cb) { button_isr_cb(); } UTIL_IdleMs(400); // to debounce GPIO_ClearInt(BUT_GPIO, BUT_GPIO_BITS); } void MTIMER_isr(void) { GPIO_Toggle(EXT_GPIO, EXT_GPIO_BITS); INT_SetMtime(0); } void TestMtimer(int ms) { clint_isr[IRQ_M_TIMER] = MTIMER_isr; INT_SetMtime(0); INT_SetMtimeCmp(SYS_GetSysClkFreq() / 1000 * ms); INT_EnableIntTimer(); while (1); } #define RD_STATE_BUSY 0x01 #define RD_STATE_TC 0x02 typedef struct { __IO uint32_t DAT; // 0x00 要写的数据 __IO uint32_t STA; // 0x04 读取的状态 } UARTOWN_TypeDef; #define UART ((UARTOWN_TypeDef *) 0x60006000) //cpld中该“外设”的地址 int main(void) { // This will init clock and uart on the board board_init(); // The default isr table is plic_isr. The default entries in the table are peripheral name based like CAN0_isr() or // GPIO0_isr(), and can be re-assigned. plic_isr[BUT_GPIO_IRQ] = Button_isr; // Any interrupt priority needs to be greater than MIN_IRQ_PRIORITY to be effective INT_SetIRQThreshold(MIN_IRQ_PRIORITY); // Enable interrupt from BUT_GPIO INT_EnableIRQ(BUT_GPIO_IRQ, PLIC_MAX_PRIORITY); // TestMtimer(500); // TestAnalog(); // TestCan(); // TestCrc(); // TestFcb(); // TestGpTimer(); // TestGpTimerPwm(); // TestI2c(); // TestRTC(); // TestSpi(); // TestSystem(); // TestTimer(); // TestWdog(); // TestUart(); // TestFlash(); volatile int regState = 0; while(1) { for (int i = 1; i < 255; i++) { while((UART->STA) & RD_STATE_BUSY); UART->DAT = i; //发送一个字节 while(!((UART->STA) & RD_STATE_TC)); //等待发送完成 UTIL_IdleUs(100e3); } } TestGpio(); } 编译,下载,打开下载器的串口,有信号=成功   附件是整体工程。收1积分辛苦费 参考文档。        

  • 2025-03-11
  • 回复了主题帖: 【AG32VH407开发板】下载DAP-LINK固件后无法恢复问题

    秦天qintian0303 发表于 2025-3-5 12:19 有的程序下载之后需要复位才能开始运行   其实是要Upload LOGIC。

  • 2025-03-05
  • 发表了主题帖: 【AG32VH407开发板】下载DAP-LINK固件后无法恢复问题

    本帖最后由 wstcllx 于 2025-3-5 12:07 编辑 本来想试试如何用Downloadler下载,随便选了个升级固件。下载后还原发现原来的闪灯程序无法闪灯了,不知道是什么BUG导致。求助原因。 复现方法如下、 如附件《AG32 MCU下载器升级Ver41》官方的方法,BOOT0拉高后,按下复位,打开   下载ver43固件下去    下载成功,重新拉高  BOOT0,按下复位,下载生成好的闪灯example固件,下载成功。但程序运行异常,灯不闪了。  

  • 2025-02-25
  • 发表了主题帖: 【AG32VH407开发板】Debug报错

    本帖最后由 wstcllx 于 2025-2-25 15:43 编辑 荣幸得到AG32VH407开发板的试用机会,资料很多,照着入门步骤1234, 1、使用入门介绍了各个开发板。但是本次使用板是没有介绍的。 2、环境搭建很详细也很简单。这里点赞。 进行到第三步,Upload不成功。原因还没找出来。   这两处已经修改,没看到文档说要该那个地方。     继续摸索更新吧。 改回103,居然可以了。但芯片上确实印着407,很奇怪。        

  • 2025-02-14
  • 回复了主题帖: 测评入围名单: 国产芯AGM 新品 AG32VH407(MCU+FPGA+64Mbit PSRAM)

    个人信息无误,确认可以完成测评分享计划

最近访客

< 1/2 >

统计信息

已有18人来访过

  • 芯积分:56
  • 好友:--
  • 主题:7
  • 回复:9

留言

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


现在还没有留言