datasheet

在STM32中将变量或代码设定在指定内存地址的方法

2019-05-24来源: eefocus关键字:STM32  变量  内存地址

各个编译器有自己不同的语法


对于arm_none_eabi_gcc:


// Sampling variables

#define ADC_SAMPLE_MAX_LEN 2000

__attribute__((section(".ram4"))) static volatile int16_t m_curr0_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_curr1_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_ph1_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_ph2_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_ph3_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_vzero_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile uint8_t m_status_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_curr_fir_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int16_t m_f_sw_samples[ADC_SAMPLE_MAX_LEN];

__attribute__((section(".ram4"))) static volatile int8_t m_phase_samples[ADC_SAMPLE_MAX_LEN];

在连接脚本中需声明该内存块


MEMORY

{

    flash : org = 0x08000000, len = 16k

    flash2 : org = 0x0800C000, len = 393216 - 16 /* NEW_APP_MAX_SIZE - CRC_INFO */

crcinfo : org = 0x0805FFF0, len = 8 /* CRC info */

    ram0  : org = 0x20000000, len = 128k    /* SRAM1 + SRAM2 */

    ram1  : org = 0x20000000, len = 112k    /* SRAM1 */

    ram2  : org = 0x2001C000, len = 16k     /* SRAM2 */

    ram3  : org = 0x00000000, len = 0

    ram4  : org = 0x10000000, len = 64k     /* CCM SRAM */

    ram5  : org = 0x40024000, len = 4k      /* BCKP SRAM */

    ram6  : org = 0x00000000, len = 0

    ram7  : org = 0x00000000, len = 0

}

并在连接脚本后面要有添加数据的操作


    .ram4 (NOLOAD) : ALIGN(4)

    {

        . = ALIGN(4);

        *(.ram4)

        *(.ram4.*)

        . = ALIGN(4);

        __ram4_free__ = .;

    } > ram4

针对IAR:


 

#if defined (CCMRAM)

#if defined (__ICCARM__)

#pragma location = ".ccmram"     //这里是针对IAR的语法

#elif defined (__CC_ARM) || defined(__GNUC__)

__attribute__( ( section ( "ccmram" ) ) )    //这里是针对GCC等编译器的语法

#endif

#endif

/**

  * @brief  It return the Vqd componets fed in input plus the feed forward

  *         action and store the last Vqd values in the internal variable.

  * @param  pHandle Feed forward  strutcture.

  * @param  Vqd Initial value of Vqd to be manipulated by FF .

  * @retval Volt_Components Vqd conditioned values.

  */

Volt_Components FF_VqdConditioning( FF_Handle_t * pHandle, Volt_Components Vqd )

{

  int32_t wtemp;

 

  pHandle->VqdPIout = Vqd;

 

  wtemp = ( int32_t )( Vqd.qV_Component1 ) + pHandle->Vqdff.qV_Component1;

 

  SATURATION_TO_S16( wtemp )

 

  Vqd.qV_Component1 = ( int16_t )wtemp;

 

  wtemp = ( int32_t )( Vqd.qV_Component2 ) + pHandle->Vqdff.qV_Component2;

 

  SATURATION_TO_S16( wtemp )

 

  Vqd.qV_Component2 = ( int16_t )wtemp;

 

  return ( Vqd );

}

上面的操作是将函数代码放到指定的存储区内。需要快速执行的代码或数据,可以放在SMT32的CCRAM区里。内核访问该存储区的速度比访问FLASH快很多。


关键字:STM32  变量  内存地址

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic462827.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 CAN使用
下一篇:使用gcc编译STM32遇到的问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

用于stm32Discovery的图像转代码取模小工具

最近拿着st的官方板子在开发图形界面,看了下代码是直接把整个像素32bit拷贝到控制器中Graphic RAM(就是一块SDRAM)中的,所以以往遇到的生成器都不能用,在内部则又是转换费时费力,占用内存所以针对stm32的discovery lcd显示写了个图像代码生成的程序,可以直接生成32bit的ARGB格式代码等后面发一个成熟点的版本,目前还是有些容易遇到的bug
发表于 2019-06-15
用于stm32Discovery的图像转代码取模小工具

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2019-06-15

STM32CubeMx之串行通信

前言我的板子是:STM32ZGT6配置1.打开STM32CubeMX新建工程,选择STM32ZGT62.配置外部高速时钟RCC设置,选择HSE(外部高速时钟)为Crystal/Ceramic Resonator(晶振/陶瓷谐振器),我的开发板外部时钟是25MHZ。 3.配置串行通信选择Asynchronous异步通信。  串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。 生成报告以及代码,编译程序(最好单独生成.c和.h文件)。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void
发表于 2019-06-15

stm32 不断进入串口中断的bug解决方法

在使用stm32的时候,发现usart会莫名的卡在串口中断里,然而串口初始化只配置了RXNE中断,打断点发现不断进入中断却没不是RXNE中断引起的,经过查找资料发现是ORE的问题,2篇博文解决方案如下:http://bbs.21ic.com/icview-160999-1-1.html及http://blog.csdn.net/origin333/article/details/49992383大致原因为开启了RXNE中断之后 ORE也开启了,但是使用USART_GetITStatus却无法读取到ORE的标志位(未使能ERR时),这样也无法消除中断申请,自然一直进入串口中断,如果要消除ORE需要
发表于 2019-06-15

STM32串口USART用法的进阶(HAL库版本)

句话是绑定DMA,来源数USART1,目的是数组,定义好的。第二句是打开空闲中断it.c里面找到void USART1_IRQHandler(void){ UsartReceive_IDLE(&huart1);//自己添加一个函数,这就是中断,搬完以后,空闲中断 自己完成它  HAL_UART_IRQHandler(&huart1);}void UsartReceive_IDLE(UART_HandleTypeDef *huart)  {      uint32_t temp;      if
发表于 2019-06-15

STM32CubeMX学习教程之五:PWM实现呼吸灯效果

软件:STM32CubeMX V4.25.0  System Workbench V2.4固件库版本:STM32Cube FW_F1 V1.6.1硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号 首先设置RCC和SYS,如下图 然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图设置PC7 管脚为TIM3_CH2, 即定时器TIM3的Channel2然后设置TIM3的Channel2为PWM Generation CH2 从上一篇博文我们知道TIM3是挂在APB1总线上的,看时钟树我们知道
发表于 2019-06-15
STM32CubeMX学习教程之五:PWM实现呼吸灯效果

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved