初级会员

- 积分
- 149
- 金钱
- 149
- 注册时间
- 2017-7-12
- 在线时间
- 34 小时
|
5金钱
板子是阿波罗F429,看了原子哥的sdram教程,使用cubemx配置了FMC,然后操作SDRAM是失败的,看了FMC的寄存器值,和原子哥例程是一样的,不知道是什么原因导致的失败,求助各路大神,这是main函数,- int main(void)
- {
- /* USER CODE BEGIN 1 */
- int ts;
- /* USER CODE END 1 */
-
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_USART1_UART_Init();
- MX_GPIO_Init();
- MX_FMC_Init();
- /* USER CODE BEGIN 2 */
- sdram_InitSequent(&hsdram1);
-
- //刷新频率计数器(以SDCLK频率计数),计算方法:
- //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
- //我们使用的SDRAM刷新周期为64ms,SDCLK=180/2=90Mhz,行数为8192(2^13).
- //所以,COUNT=64*1000*90/8192-20=683
- HAL_SDRAM_ProgramRefreshRate(&hsdram1, 683);
- HAL_Delay(20);
- fsmc_sdram_test();
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- HAL_Delay(20);
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码 sdram的测试代码
- //SDRAM内存测试
- void fsmc_sdram_test(void)
- {
- uint32_t i=0;
- uint32_t temp=0;
- uint32_t sval=0; //在地址0读到的数据
- //每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节
- for(i=0;i<32*1024*1024;i+=16*1024)
- {
- *(volatile uint32_t*)(Bank5_SDRAM_ADDR+i)=temp;
- temp++;
- }
- //依次读出之前写入的数据,进行校验
- for(i=0;i<32*1024*1024;i+=16*1024)
- {
- temp=*(volatile uint32_t*)(Bank5_SDRAM_ADDR+i);
- if(i==0)sval=temp;
- else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.
- printf("SDRAM Capacity:%dKB\r\n",(uint16_t)(temp-sval+1)*16);//打印SDRAM容量
- }
- }
复制代码
sdram初始化函数
- void sdram_InitSequent(SDRAM_HandleTypeDef *hsdram)
- {
- uint32_t temp;
-
- sdram_send_cmd(hsdram->Init.SDBank, FMC_SDRAM_CMD_CLK_ENABLE, 1, 0);
- HAL_Delay(1);
- sdram_send_cmd(hsdram->Init.SDBank, FMC_SDRAM_CMD_PALL, 1, 0);
- sdram_send_cmd(hsdram->Init.SDBank, FMC_SDRAM_CMD_AUTOREFRESH_MODE, 8, 0);
-
- temp = (uint32_t) SDRAM_BURST_LENGTH_1 | //设置突发长度:1(可以是1/2/4/8)
- SDRAM_ADDR_MODE_SEQUENTIAL | //设置突发类型:连续(可以是连续/交错)
- SDRAM_CAS_LATENCY_3 | //设置CAS值:3(可以是2/3)
- SDRAM_WRITE_MODE_SINGLE; //设置突发写模式:1,单点访问
-
- sdram_send_cmd(hsdram->Init.SDBank, FMC_SDRAM_CMD_LOAD_MODE, 1, temp);
- }
复制代码
FMC初始化,这部分是cubemx生成的
|
最佳答案
查看完整内容[请看2#楼]
问题已经找到,是这个函数的实现出了问题,但是很奇怪的是仿真读出来寄存器的值又和原子哥的例程读出来的值是一样的,这里原因就不得而知了,这也是我一直觉得自己参数的设置没有问题的主要依据。。
总结:自己太粗心,寄存器参数的使用居然用了另一个结构体的参数。。。。
|