首页 > 编程语言 >STM32【HAL库】使用外部SRAM程序

STM32【HAL库】使用外部SRAM程序

时间:2023-05-10 16:55:07浏览次数:37  
标签:HAL ReadWriteTim SRAM FSMC STM32 Init Handler HEAP



#include <board.h>

#ifdef BSP_USING_SRAM
#include <drv_common.h>
#include <rtthread.h>
#include <rtdevice.h>

#define DBG_TAG "drv_exsram"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define RAM_HEAP_EX_START           (0x68000000)
#define RAM_HEAP_EX_SIZE            (1024 * 1024)
#define RAM_HEAP_EX_END             (RAM_HEAP_EX_START + RAM_HEAP_EX_SIZE)

/* 注意:SRAM 句柄不能为局部变量 */
SRAM_HandleTypeDef SRAM_Handler;    // SRAM句柄

#ifdef RT_USING_MEMHEAP_AS_HEAP
static struct rt_memheap system_heap;
#endif


/**
  * @brief SRAM 初始化
  * @retval None
  */
static int system_sram_init(void)
{
	int result = RT_EOK;
	
    FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;

    /*----------------------------------------- 使能时钟 -----------------------------------------*/
    __HAL_RCC_GPIOD_CLK_ENABLE();           // 使能GPIOD时钟
    __HAL_RCC_GPIOE_CLK_ENABLE();           // 使能GPIOE时钟
    __HAL_RCC_GPIOF_CLK_ENABLE();           // 使能GPIOF时钟
    __HAL_RCC_GPIOG_CLK_ENABLE();           // 使能GPIOG时钟

    /*----------------------------------------- 配置 SRAM -----------------------------------------*/
    SRAM_Handler.Instance = FSMC_NORSRAM_DEVICE;
    SRAM_Handler.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
    SRAM_Handler.Init.NSBank = FSMC_NORSRAM_BANK3;                          // 使用NE3
    SRAM_Handler.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;       // 地址/数据线不复用
    SRAM_Handler.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;                   // SRAM
    SRAM_Handler.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;      // 16位数据宽度
    SRAM_Handler.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;     // 是否使能突发访问,仅对同步突发存储器有效,此处未用到
    SRAM_Handler.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;   // 等待信号的极性,仅在突发模式访问下有用
    SRAM_Handler.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;        // 存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
    SRAM_Handler.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;         // 存储器写使能
    SRAM_Handler.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;                // 等待使能位,此处未用到
    SRAM_Handler.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;            // 读写使用相同的时序
    SRAM_Handler.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;    // 是否使能同步传输模式下的等待信号,此处未用到
    SRAM_Handler.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;                // 禁止突发写

    /*----------------------------------------- FSMC 读写时序控制 -----------------------------------------*/
    FSMC_ReadWriteTim.AddressSetupTime = 0x00;          // 地址建立时间(ADDSET)为1个HCLK 1/72M = 13.8ns
    FSMC_ReadWriteTim.AddressHoldTime = 0x00;           // 地址保持时间(ADDHLD)模式A未用到
    FSMC_ReadWriteTim.DataSetupTime = 0x03;             // 数据保存时间为3个HCLK = 4*13.8 = 55ns
    FSMC_ReadWriteTim.BusTurnAroundDuration = 0X00;
    FSMC_ReadWriteTim.CLKDivision = 0X00;
    FSMC_ReadWriteTim.DataLatency = 0X00;
    FSMC_ReadWriteTim.AccessMode = FSMC_ACCESS_MODE_A;  // 模式A

    if (HAL_SRAM_Init(&SRAM_Handler, &FSMC_ReadWriteTim, &FSMC_ReadWriteTim) != HAL_OK)
	{
		LOG_E("SDRAM init failed!");
        result = -RT_ERROR;
	}
	else
    {
#ifdef RT_USING_MEMHEAP_AS_HEAP
        /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SDRAM is initialized to the heap */
		rt_memheap_init(&system_heap, "sdram", (void *)RAM_HEAP_EX_START, RAM_HEAP_EX_SIZE);
#else
        rt_system_heap_init((void *)RAM_HEAP_EX_START, (void *)RAM_HEAP_EX_END);
#endif
    }
	
	return result;
}

INIT_BOARD_EXPORT(system_sram_init);

#endif /* BSP_USING_SRAM */

标签:HAL,ReadWriteTim,SRAM,FSMC,STM32,Init,Handler,HEAP
From: https://www.cnblogs.com/jzcn/p/17388482.html

相关文章

  • STM32_7(ADC)
    ADCADC(Analog-DigitalConverter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间输入电压范围:0~3.3V,转换结果范围:0~409518个输入通道,可测量16个外部和2个内部信号源规则组和注入组......
  • fetchone()和fetchall()
    最近写小程序久违的用到了数据库,用fetch()返回数据库搜索的数据时却犯了个低级错误。我本来只是获取一条数据,调用了fetchall(),想将数据转化为列表,却发现列表里的数据仍是元组cursor.execute(sql)res=list(cursor.fetchall())print(res) 想了一会用元组解包还是没用,原来......
  • Nginx反代理Halo
    nginx的基本设置nginx基本结构...#全局块events{#events块...}http#http块{...#http全局块server#server块{...#server全局块location[PATTERN]#location块{......
  • Halcon模板匹配之形状匹配,缩放比匹配,相关性匹配
     是什么是模板匹配?模板就是一副已知的小图像,而模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标,确定其坐标位置 模板匹配的参数介绍:1.图像金字塔:Numberlever2.起始角度:AngleStart......
  • STM32单片机引脚要职能配置为输入或者输出模式,并不能像51一样准双向,那么如何进行但总
    如题随便找个端口举例对应的程序为 难道需要写之后立即初始化为输入?然后赶紧读?然后再赶紧初始化为输出?再往外写?是的,还真他妈就是这么傻逼的操作 ......
  • stm32 cubeide ST7920 12864点阵屏 U8G2移植
    准备工作【通用-移植u8g2准备工作】在cubeide中移植u8g2到STM32的准备工作源码获取和文件处理-不打鱼光晒网-博客园(cnblogs.com) 7920很老了,spi只能接受2.5M的时钟,实际上2M就大概率花屏了,使用硬件spi的话,由于分频系数选择的问题,配置为1M就行了,不然花屏7920的穿行模式仅......
  • java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/
    Java使用AES/CBC/PKCS7Padding加解密时会报错,因为原生JDK不支持。1.在jdk中的jre\lib\security修改java.security文件,替换security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider2./jdk/jre/lib/ext下添加jar包bcprov-jdk15on-1.58.jar ......
  • 基于stm32实现DS18B20温度检测仿真
    一、cubmax设置PA0作为DS18B20数据口 打开串口1,显示温度信息时钟树设置72MHZ。二、程序头文件/*USERCODEBEGINIncludes*/#include"DS18B20.h"#include"stdio.h"/*USERCODEENDIncludes*/串口重定向/*USERCODEBEGIN0*/intfputc(intch,FILE*f......
  • STM32_6(TIM)
    TIMTIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触......
  • HAL库___ADC的回调函数
    STM32CubeMx配置ADC转换完成的回调函数当使用DMA传输ADC数据时当传输完成后HAL库一般都会有回调函数。进入HAL_ADC_Start_DMA();底层可以找到传输完成后调用了ADC_DMAConvCplt; 定义过去可以看到: 最后调用了HAL_ADC_ConvCpltCallback(hadc);回调函数。ADC转换并打开中断在......