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

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

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

推荐阅读

第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《I2S BUS》。若对I2S通讯协议不了解,可先阅读《I2S BUS》文档的内容学习。关于音频编译码器WM8978,请参考其规格书《WM8978_v4.5》来了解。38.1 I2S简介Inter-IC Sount Bus(I2S)是飞利浦半导体公司(现为恩智浦半导体公司)针对数字音频设备之间的音频数据传输而制定的一种总线标准。在飞利浦公司的I2S标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。38.1.1 数字音频技术现实生活中的声音是通过一定介质传播
发表于 2019-09-19
第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

第50章 读写内部FLASH—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。50.1 STM32的内部FLASH简介在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行,见图 501。图 501 STM32的内部框架图除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候,也能对自身的内部FLASH进行读写
发表于 2019-09-19
第50章 读写内部FLASH—零死角玩转STM32-F429系列

第49章 在SRAM中调试代码—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、《Cortex-M3权威指南》、《Cortex-M4 Technical Reference Manual》(跟M3大部分是相同的,读英文不习惯可先参考《Cortex-M3权威指南》)。学习本章时,配合《STM32F4xx 中文参考手册》"存储器和总线结构"及"嵌入式FLASH接口"章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。49.1 在RAM中调试代码一般情况下,我们在MDK中编写工程应用后,调试时都是把程序下载到芯片的内部FLASH运行测试的,代码的CODE及RW-data的内容被写入
发表于 2019-09-19
第49章 在SRAM中调试代码—零死角玩转STM32-F429系列

第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429

本章参考资料:MDK的帮助手册《ARM Development Tools》,点击MDK界面的"help->uVision Help"菜单可打开该文件。关于ELF文件格式,参考配套资料里的《ELF文件格式》文件。在本章中讲解了非常多的文件类型,学习时请跟着教程的节奏,打开实际工程中的文件来了解。相信您已经非常熟练地使用MDK创建应用程序了,平时使用MDK编写源代码,然后编译生成机器码,再把机器码下载到STM32芯片上运行,但是这个编译、下载的过程MDK究竟做了什么工作?它编译后生成的各种文件又有什么作用?本章节将对这些过程进行讲解,了解编译及下载过程有助于理解芯片的工作原理,这些知识对制作IAP
发表于 2019-09-19
第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429

第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的OV5640摄像头参数可查阅《ov5640datasheet》配套资料获知。STM32F4芯片具有浮点运算单元,适合对图像信息使用DSP进行基本的图像处理,其处理速度比传统的8、16位机快得多,而且它还具有与摄像头通讯的专用DCMI接口,所以使用它驱动摄像头采集图像信息并进行基本的加工处理非常适合。本章讲解如何使用二维码识别库进行二维码的识别。47.1 二维码简介二维码,又称二维条码或二维条形码,二维条码是用某种特定的几何图形按一定规律在平面(二维方向
发表于 2019-09-19
第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

本章参考数据:《STM32F4xx参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于MPU6050的参考资料:《MPU-60X0寄存器》、《MPU6050数据手册》以及官方驱动《motion_driver_6.12》。本章讲解的内容跨领域的知识较多,若您感兴趣,请自行查阅各方面的资料,对比学习。44.1 姿态检测1.    基本认识在飞行器中,飞行姿态是非常重要的参数,见图 441,以飞机自身的中心建立坐标系,当飞机绕坐标轴旋转的时候,会分别影响偏航角、横滚角及俯仰角。图 441 表示飞机姿态的偏航角、横滚角及俯仰角假如我们知道飞机
发表于 2019-09-19
第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

小广播

何立民专栏

单片机及嵌入式宝典

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

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