国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

������gӭ���������зf���¿Ƽ����޹�˾��
�Z��
��(d��ng)ǰλ�ã���� >> Ʒ������ >> ST/�ⷨ >> KEIL�h(hu��n)�������׌���a�� RAM���\(y��n)��

KEIL�h(hu��n)�������׌���a�� RAM���\(y��n)��

�P(gu��n)�I�֣�KEILNucleoSTM32 ���ߣ� ��Դ: �l(f��)���r�g��2019-01-03  �g�[��54

ǰ��
��(j��ng)����������ʹ��KEIL�r��Ҫ�����ֻ���ȫ��������a�ŵ�RAM���\(y��n)�еĆ��}���F(xi��n)���係�Y(ji��)�ڱ����С�ͨ�^STM32F411Nucleo��һ�����Ӂ���B�׷N׌������RAM���\(y��n)�еķ�����

�҂��ȏ�ToggleLED����(sh��)��Flash�Ј�(zh��)�������_ʼ��������ToggleLED����(sh��)�������{(di��o)����r����main����(sh��)��while��1�����{(di��o)��ToggleLED��

void ToggleLED(void)
{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); /* Insert a 100ms delay */
HAL_Delay(100);
}

int main(void)
{ …… /*##-3- Toggle PA05 IO in an infinite loop ######*/
while (1) { ToggleLED(); }
}

���g�h(hu��n)����Linker������Ҋ�ˆD��
Flash��ʼ��ַ��0x08000000
RAM��ʼ��ַ��0x20000000

1

���g���map�ļ����Կ�����ToggleLED�Լ������{(di��o)�õ���HAL_GPIO_TogglePin��HAL_Delay����(sh��)�ĵ�ַ����FLASH�С�

2
�����D(zhu��n)LED�ij���ŵ�SRAM�Ј�(zh��)��
����һ��ͨ�^#pragma arm section code = “RAMCODE ”��#pragma arm section������Example1���a��
�@�N��ʽ������ͬ�r����������(sh��)�ŵ�ָ����section�����w�������£�
1. �޸�.sct�ļ����Զ��xһ������RAMCODE��section������RW_IRAM1��(zh��)�Ѕ^(q��)������ַ����0x20000000~0x20020000��

LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
} RW_IRAM1 0x20000000 0x00020000 { ; RW data
*.o(RAMCODE)
.ANY (+RW +ZI)
}
}

2. �ڹ�����ʹ��ǰ���޸ĵ�.sct�ļ�

3

3.��#pragma arm section code = “RAMCODE” �_�^����#pragma arm section�Y(ji��)β����������Ҫ�ŵ�RAMCODE section�ĺ���(sh��)�����M(j��n)�������g�r�����g�����Ԅӌ��@Щ����(sh��)�ŵ�RAMCODE����0x20000000�_ʼ�ą^(q��)����

#pragma arm section code = "RAMCODE"
void ToggleLED(void)
{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); /* Insert a 100ms delay */
HAL_Delay(100);
}

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{ /* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->ODR ^= GPIO_Pin;
}

uint32_t HAL_GetTick(void)
{ return tick;
}

void HAL_Delay(__IO uint32_t Delay)
{ uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
#pragma arm section

4.��map�ļ�����Կ����@�Ă�����(sh��)���ѽ�(j��ng)���ŵ���SRAM����

4

��������ͨ�^__attribute__((section(“name ”)))
��KEIL�п���ͨ�^__attribute__((at(address)))�ķ�ʽ��׃���ŵ�ָ����λ�á�
ͨ�^__attribute__((section(“name ”)))�ķ�ʽ��׃�����ߺ���(sh��)�ŵ�ָ����λ����

�����҂����������ͨ�^�@�N��ʽ������ŵ�SRAM�Ј�(zh��)�С�
1.ͬ�����҂���Ҫ�޸�.sct�ļ����Զ��xһ������RAMCODE��section�����ڹ����x�(xi��ng)��linker��������x���x�õ�.sct�ļ�����Ҋ����һ�еĵ�1��2����

LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
*.o(RAMCODE)
.ANY (+RW +ZI)
}
}

2.����Ҫ�ŵ�RAM�еĺ���(sh��)ǰ����__attribute__((section("RAMCODE")))•��ԓ����(sh��)����RAMCODE section����ע�⣬ԓ����(sh��)���{(di��o)�õ������к���(sh��)ҲҪ�ŵ�RAMCODE section����

__attribute__((section("RAMCODE")))
void ToggleLED(void)
{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); /* Insert a 100ms delay */
HAL_Delay(100);
}

__attribute__((section("RAMCODE")))
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{ /* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->ODR ^= GPIO_Pin;
}

__attribute__((section("RAMCODE")))
__weak uint32_t HAL_GetTick(void)
{ return uwTick; }

__attribute__((section("RAMCODE")))
__weak void HAL_Delay(__IO uint32_t Delay)
{ uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{ }
}

3.�ľ��g���map�ļ����Կ�����ToggleLED�Լ����{(di��o)�õ������к���(sh��)��������RAM����

00

���������Ը��w����һ��Ҳ�����f�����ͬ�r�÷���һ�ͷ�������ͬһ������(sh��)�Ĉ�(zh��)�Ѕ^(q��)�������f������K�����õ��Ƿ�������߀��ͨ�^�����ᵽ�Ĵ��a���f����
�޸�.sct�ļ�����SRAM�֞�ɂ���(zh��)�Ѕ^(q��)RW_IRAM1��RW_IRAM2��Section RAMCODE1��RAMCODE2�քeλ��0x20000000�_ʼ����0x20010000�_ʼ�ăɂ�64KB�ą^(q��)��

LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}

RW_IRAM1 0x20000000 0x00010000 { ; RW data
*.o(RAMCODE1)
.ANY (+RW +ZI)
}

RW_IRAM2 0x20010000 0x00010000 {
*.o(RAMCODE2) }
}

2.�ڴ��a��, HAL_GetTick��������#pragma���������(n��i)��•������RAMCODE1 section��ͬ�r����__attribute__( ( section ( "RAMCODE2" ) ) ) �������RAMCODE2��section��(n��i)��

#pragma arm section code = "RAMCODE1"
void ToggleLED(void)
{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
/* Insert a 100ms delay */
HAL_Delay(100); }

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{ /* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->ODR ^= GPIO_Pin;
}

__attribute__( ( section ( "RAMCODE2" ) ) )
uint32_t HAL_GetTick(void)
{ return tick; }

void HAL_Delay(__IO uint32_t Delay)
{ uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay) { }
}
#pragma arm section

3.���g��ɺ����҂�����map�ļ���HAL_GetTick���ŵ����Ă�section��

5

��map����Կ�������KHAL_GetTick��������RAMCODE2 section�С�

**��Ό���������ŵ�SRAM�Ј�(zh��)��
ǰ���B�ˌ�һ�����������ŵ�ָ����ַ��(zh��)�еķ����������Ҫ�ŵ�ָ����ַ�ij�����^�����҂�߀���Ԍ��@Щ��Ҫ�ŵ�ָ����ַ�ij����зŵ�һ����ׂ�C�ļ��У�Ȼ����.sct�ļ��Ќ��@ЩC�ļ����ɵ�Ŀ��(bi��o)�ļ��ŵ�ָ����ַ��
���@��҂����Lԇ����������ŵ�SRAM�Ј�(zh��)������(f��)λ������FLASH���ӣ�֮�󌢏�SRAM��(zh��)�����еij����������Ǿ��w�IJ��E��
1.���Д����������Д�̎������ŵ�SRAM��
�½�һ��startup_stm32f411xe_ram.s�ļ����ŵ�0x20000000�_ʼ��λ�ã���.sct�ļ����޸ģ���ע���@�����½���������ֱ�ӌ�ԭ�����ļ��ŵ�SRAM�У���ʲô������ҿ���˼��һ�¡���startup_stm32f411xe_ram.s�ﶨ�x�µ�SECTION������RESET_ram��߀���������޸ģ�Ո���Յ������a�����ں����.sct�Ќ���RESET_ram�@��section�ŵ�SRAM�_ʼ��λ���ϣ�Ҋ��3������

Vector Table Mapped to Address 0 at Reset
AREA RESET_ram, DATA, READONLY
EXPORT __Vectors_ram
EXPORT __Vectors_End_ram
EXPORT __Vectors_Size_ram
__Vectors_ram DCD 0 ; Top of Stack
DCD 0 ; Reset Handler
DCD NMI_Handler ; NMI Handler
……

2.��SystemInit�Ќ��Д���������ƫ�Ƶ�ַ�O(sh��)�Þ�0x20000000��ʹ��VECT_TAB_SRAM��

#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

3.�޸�.sct�ļ������\(y��n)�Еr��Ҫ������Ŀ��(bi��o)�ļ����ŵ�SRAM��(zh��)�Ѕ^(q��)�С��@���Д���������ͬ�ӵăɷ���һ����0x08000000�_ʼ��λ�ã�һ����0x20000000�_ʼ��λ����

LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
*.o (RESET_ram, +First)
startup_stm32f411xe_ram.o(+RO)
main.o(+RO +RW)
stm32f4xx_it.o(+RO +RW)
stm32f4xx_hal.o(+RO +RW)
stm32f4xx_hal_gpio.o(+RO +RW)
stm32f4xx_hal_rcc.o(+RO +RW)
stm32f4xx_hal_cortex.o(+RO +RW)
.ANY (+RW +ZI)
}
}

4. ���g��ɺ�����map�ļ����߸�ۙ�{(di��o)ԇ�ĽY(ji��)�������Կ�����ϵ�y(t��ng)��(f��)λ�Ժ�����main����(sh��)�_ʼ�����еij�����RAM���\(y��n)������
�����������ij��������õ�ARM�׌ӵĎ���������.sct�ļ��м���*armlib*(+RO)�팢�����õ��Ď��ļ��ŵ�SRAM�С�

STM32/STM8 �ⷨ�댧(d��o)�w/ST/STM

��݋��admin  ����޸ĕr�g��2019-01-03

“(li��n)ϵ��ʽ

0755-82591179

���棺0755-82591176

�]�䣺vicky@yingtexin.net

��ַ�����������A�^(q��)���νֵ����δ��973�f�����S��(chu��ng)�I(y��)�@A��2��A08

Copyright © 2014-2023 �f���¿Ƽ����޹�˾ All Rights Reserved.  ��ICP��14043402̖-4

深圳市市场监督管理局企业主体身份公示