ESP_Sprite wrote:
...........it's RAM, so if any, you do not have pages as such,........
...
简介:
本工程主要演示psram的初始化以及读写操作
注意事项:
psram进行读写操作软件应用层面需要做原子保护
...
Code: Select all
//32KBytes for each page, totally 128 pages, that is 4MBytes.
cache_sram_mmu_set( 0, 0, 0x3f800000, 0, 32, 128 );
without an comment
have a nice sunday
Code: Select all
/* Timer group-hardware timer example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include "esp_types.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "psram.h"
#define TEST_DATA_LEN 1024
#define PSRAM_START_ADR (0x3F800000) //0x3F800000 is psram start address
#define mutex_t xSemaphoreHandle
mutex_t psram_mem_mutex = NULL;
uint8_t inRam0[TEST_DATA_LEN] = {0};
uint8_t inRam1[TEST_DATA_LEN] = {0};
int mutex_init(mutex_t *pxMutex);
void mutex_lock(mutex_t *pxMutex);
void mutex_unlock(mutex_t *pxMutex);
/** Create a new mutex
* @param mutex pointer to the mutex to create
* @return 0: successed;1:failed;
*/
int mutex_init(mutex_t *pxMutex)
{
int xReturn = -1;
*pxMutex = xSemaphoreCreateMutex();
if (*pxMutex != NULL) {
xReturn = 0;
}
return xReturn;
}
/** Lock a mutex
* @param mutex the mutex to lock
*/
void mutex_lock(mutex_t *pxMutex)
{
while (xSemaphoreTake(*pxMutex, portMAX_DELAY) != pdPASS);
}
/** Unlock a mutex
* @param mutex the mutex to unlock
*/
void mutex_unlock(mutex_t *pxMutex)
{
xSemaphoreGive(*pxMutex);
}
/**
* @brief Memcpy with a cache, atomic protected, speaking, reading and writing
*/
void psram_cache_memcpy(uint8_t *dst, uint8_t *src, uint16_t len)
{
if(psram_mem_mutex == NULL)
{
mutex_init(&psram_mem_mutex);
}
mutex_lock(&psram_mem_mutex);
memcpy(dst, src, len);
mutex_unlock(&psram_mem_mutex);
}
/**
* @brief Memset with a cache, atomic protected, speaking, reading and writing
*/
void psram_cache_memset(uint8_t *addr, uint8_t c, uint32_t len)
{
if(psram_mem_mutex == NULL)
{
mutex_init(&psram_mem_mutex);
}
mutex_lock(&psram_mem_mutex);
memset(addr, c, len);
mutex_unlock(&psram_mem_mutex);
}
/**
* @brief Print multiple bytes
*/
void printfByteS(uint8_t *indata, uint16_t len)
{
int i = 0;
for(; i < len ; i++)
{
printf("%02X", indata[i]);
}
printf("\n");
}
/**
* @brief psram test task
*/
void psram_test_task()
{
uint8_t *psram_buf_ptr = (uint8_t*) PSRAM_START_ADR;
printf("*****************psram demo start*****************\n");
psram_enable(PSRAM_CACHE_F40M_S40M);
psram_cache_memset(psram_buf_ptr, 0x00, TEST_DATA_LEN); //clear zero
memset(inRam0, 0x5A, TEST_DATA_LEN);
memset(inRam1, 0xA5, TEST_DATA_LEN);
printf("1.write psram data\n");
psram_cache_memcpy(psram_buf_ptr, inRam0, TEST_DATA_LEN);
printf("2.read psram data (expect 0x5A)\n");
printfByteS(psram_buf_ptr, TEST_DATA_LEN);
printf("3.write psram data\n");
psram_cache_memcpy(psram_buf_ptr, inRam1, TEST_DATA_LEN);
printf("4.read psram data (expect 0xA5)\n");
printfByteS(psram_buf_ptr, TEST_DATA_LEN);
printf("*****************psram demo end******************\n");
while(1)
{
vTaskDelay(100);
}
}
/**
* @brief In this test
*/
void app_main()
{
xTaskCreate(psram_test_task, "psram_test_task", 1024 * 5, NULL, 5, NULL);
}
Code: Select all
#ifndef _PSRAM_H
#define _PSRAM_H
#include "soc/spi_reg.h"
#include "esp_err.h"
#define PSRAM_READ 0x03
#define PSRAM_FAST_READ 0x0B
#define PSRAM_FAST_READ_QUAD 0xEB
#define PSRAM_WRITE 0x02
#define PSRAM_QUAD_WRITE 0x38
#define PSRAM_ENTER_QMODE 0x35
#define PSRAM_EXIT_QMODE 0xF5
#define PSRAM_RESET_EN 0x66
#define PSRAM_RESET 0x99
#define PSRAM_SET_BURST_LEN 0xC0
#define PSRAM_DEVICE_ID 0x9F
typedef enum {
PSRAM_SPI_1 = 0x1,
PSRAM_SPI_2,
PSRAM_SPI_3,
PSRAM_SPI_MAX ,
} psram_spi_num_t;
typedef enum {
PSRAM_CACHE_F80M_S40M = 0,//DO NOT USE FOR NOW
PSRAM_CACHE_F40M_S40M, //SUPPORTED
PSRAM_CACHE_F80M_S80M, //DO NOT USE FOR NOW
PSRAM_CACHE_MAX,
} psram_cache_mode_t;
esp_err_t psram_enable(psram_cache_mode_t mode);
#endif
2017 March 28.
- 28_marz.jpg (16.54 KiB) Viewed 11448 times