首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用微控制器编写点阵iCE40超级程序

如何用微控制器编写点阵iCE40超级程序
EN

Stack Overflow用户
提问于 2019-09-10 19:53:22
回答 2查看 1.5K关注 0票数 1

我试图用iCE40单片机编写一个stm32F4超级FPGA程序,并试图弄清楚如何将配置文件加载到微控制器上,以便通过SPI将配置文件发送给FPGA进行编程。应用程序说明说,这是可以做到的,并有一些伪代码,但它似乎是用于计算机,而不是微控制器。微型和FPGA都在我设计的PCB上,它们之间有一个SPI通道。这将在编程之后使用,只用于两者之间的通信。

配置文件是一个.bin文件或.hex文件,我不知道如何将其中一个文件加载到stm32并将其发送到stm32。我试图这样做,因为我希望不需要购买一个编程电缆,并包括闪存在我的PCB存储程序,因为我已经需要SPI通信之间的微型和FPGA之间的应用,我希望使事情更容易对我自己,可能做了相反的…

下面是我编写的发送文件的函数。我知道我需要以某种方式打开这个文件并把它传过去。所有其他的时间来源于FPGA的编程行会。

代码语言:javascript
运行
复制
static void FPGA_Programming(void){

    char FPGA_TimeOut = 0; // Error timeout
    uint8_t dummyBits[7]; 
    for(char i = 0; i < 7; i++){ // loads dummy bits to be transmitted
        dummyBits[i] = 0b01010101;
    }
    /* Write FPGA config pin and SS to low for at least 200 ns to reset and start FPGA
     * in SPI Slave Configuration
     */
    HAL_GPIO_WritePin(FPGA_Config_GPIO_Port, FPGA_Config_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(FPGA_SS_GPIO_Port,FPGA_SS_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(FPGA_Config_GPIO_Port, FPGA_Config_Pin, GPIO_PIN_SET); // Set high to turn on FPGA THIS PIN SHOULD STAY HIGH!
    HAL_Delay(2); // Wait for FPGA to clear sys memory
    // SEND FPGA CONFIG FILE 
    while(!HAL_GPIO_ReadPin(FPGA_CDone_GPIO_Port, FPGA_CDone_Pin)){ // wait for CDone to go high when config is done and successfull 
        HAL_Delay(1);
        if (FPGA_TimeOut == 5) { // if 5 milliseconds have passed and CDone has not gone low
            // send to debug FPGA ERROR Programming
            break;
        }
        FPGA_TimeOut++;
    }
    HAL_SPI_Transmit(&hspi1, dummyBits, 7, 10 ); // wait for FPGA to start

}

任何帮助加载文件和打开它与微将是一个很大的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-19 07:38:12

ice40映像需要包含在stm32F4映像中。至少有两种可能性。

  • 正如另一个答案所建议的那样。让链接器做这件事。GCC链接器可以包含任意二进制数据,有几种方法对此进行了概述here。这需要使用objcopy或对链接器脚本进行修改。
  • 创建一个小实用程序将二进制ice40映像转换为C数据对象,如下所示(警告,代码没有经过很好的测试): # int main( void ){ int i=0,c;printf(“# \nconst uint8_t ice40 image[]= {\n”);while (c =getchar() != EOF ) printf( "%#2.2x%s",c,(++i & 15)?“:",\n );printf(”}“;\n#define ICE40IMAGE_LEN %d“,i );返回0;} 二进制ice40映像被转换为一个头文件: ./bin2uint8_t < ice40image.bin > ice40image.h

ice40image.h包含在您的stm32F4程序中。我更喜欢这种方法,它有助于以后的改进,例如压缩FPGA图像(它的长运行时间通常为0x00)。在我看来,在项目iceStorm中,一个非常好的实用程序是“icecmpr”,参见https://github.com/cliffordwolf/icestorm/tree/master/icecompr

票数 2
EN

Stack Overflow用户

发布于 2019-09-11 08:38:32

如果使用GCC和binutils作为编译器/链接器系统,则可以使用objcopy从任何二进制文件生成可链接模块。然后,可以将其链接到控制器的只读数据空间,并从程序中访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57877398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档