Easyelectronics.ru

Электроника для всех
Текущее время: 28 сен 2020, 05:15

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 25 май 2012, 17:19 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
Много написано об этом, но все равно - не прёт, зараза...
Работаю в IARe.
Имеется 2 проекта:
1) Бутлодер. Лежит на странице флеша 0, адрес 8000000. Принемае прошивку, запихивает её с адреса 8004000 на ура.
2) Собственно, прошивка.

stm32f4xx_flash.icf -- опции проекта.

define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08004000;
define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;

Даже простые програмки в духе мигания светодиодом не работают!!!
//свежепрошитый проект ПО в памяти
https://www.dropbox.com/s/c2eat4sgv6vw9 ... 0FLASH.jpg
//Он же, загруженный бутлодером.
https://www.dropbox.com/s/3d1db6om9svqd ... r%20V1.jpg



Код:
//Нheader;
u32 ApplicationAddress =   0x08004000 ;   //Начало нашего приложения
typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
int main(void)
{   
//принять по уарту, прошить флеш...
........................
JumpAddress =   (*(__IO uint32_t*)ApplicationAddress);
JumpAddress = JumpAddress & 0x2FFE0000;
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) != 0x2FFE0000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер)
    {
      JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);  //Адрес перехода из вектора Reset
      Jump_To_Application = (pFunction) JumpAddress;                 //Указатель на функцию перехода
      __set_MSP(*(__IO uint32_t*) ApplicationAddress);                //Устанавливаем SP приложения 
      Jump_To_Application();                                                       //Запускаем приложение
    }
}


Файл прошивки:

Код:
int main(void)
{   
  int    i;
int counter;
       SystemInit();
   GPIO__Init();
   USART__Init();
__set_PRIMASK(1);//отключить все прерывания
/* Set the Vector Table base location at 0x08010000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);    //перенести таблицу векторов прерываний по адресу
__set_PRIMASK(0);//включить все прерывания
while(1)
{   GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
   for(int j=0; j<10000; j++)      
   {   for(i=0; i<CCDsize; i++)   
      {   CCD[i]++;
         ADCvalues0[i]++;
         ADCvalues1[i]++;
      }
   }    
}

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 25 май 2012, 23:22 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
Вам нужно таблицу векторов прерываний приложения положить по адресу 0x08004000, указать в файле конфигурации линкера.
define symbol __ICFEDIT_intvec_start__ = __ICFEDIT_region_ROM_start__;

Цитата:
/* Set the Vector Table base location at 0x08010000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); //перенести таблицу векторов прерываний по адресу

(Какое-то противоречие, на мой взгляд, в этих строчках ) Я так понимаю, этим вы пишете адрес новой таблицы прерываний в VTOR. В приложении в этом нет необходимости - VTOR уже должен быть сконфигурирован в бутлоадере.

Строка
VTOR = 0x80004000;
д.б. в бутлоадере.


Объясните, пожалуйста, зачем вы это делаете (может я что-то упускаю):
Цитата:
JumpAddress = JumpAddress & 0x2FFE0000;
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) != 0x2FFE0000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 26 май 2012, 15:07 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
tugo писал(а):
Вам нужно таблицу векторов прерываний приложения положить по адресу 0x08004000, указать в файле конфигурации линкера.
define symbol __ICFEDIT_intvec_start__ = __ICFEDIT_region_ROM_start__;

Пробавал и такой вариант. Скомпилил прогу с настройками
Код:
*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08004000;
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = __ICFEDIT_region_ROM_start__;

Программа весело мигает светодиодом, первая страница [0x08000000-0x08003999] флеша - очищается в первой строке кода.
https://www.dropbox.com/s/c2eat4sgv6vw9 ... 0FLASH.jpg
https://www.dropbox.com/s/mw11zsc90exn9 ... 000mem.jpg

Цитата:
Строка
VTOR = 0x80004000;
д.б. в бутлоадере.


Изиенил бутлодер до:
Код:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);   //VTOR = 0x80004000, проверено дебагером
   
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) // =0x20000000, проверено дебагером
       {
         JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);  //=0x08004CFD
         Jump_To_Application = (pFunction) JumpAddress;                 //=0x08004CFD
         __set_MSP(*(__IO uint32_t*) ApplicationAddress);               
//=Sat May 26, 2012 13:04:34: The stack pointer for stack 'CSTACK' (currently 0x2001AD38) is outside the stack range (0x200046F8 to 0x20004AF8)

      
         Jump_To_Application();                                                       //Запускаем приложение
       }
       while(1);

Цитата:
Объясните, пожалуйста, зачем вы это делаете (может я что-то упускаю):
Цитата:
JumpAddress = JumpAddress & 0x2FFE0000;
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) != 0x2FFE0000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер)

Гарантированный вход в IF)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 26 май 2012, 23:11 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
Нашел интересный косяк - оснавная программа, после перезагрузки контроллера (отключение питания) - не запускается!!!
Настройки файла линкера:
Код:
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08004000;
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = __ICFEDIT_region_ROM_start__;

define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__    = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 27 май 2012, 23:38 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
ThE_BuZz писал(а):
Нашел интересный косяк - оснавная программа, после перезагрузки контроллера (отключение питания) - не запускается!!!

Это нормально, таблица векторов прерываний и сама программа лежат по адресу 80004000. Только контроллер об этом не знает. После включения питания он прыгает на адрес 80000004 - а там черти что.

Программа будет нормально работать вместе с бутлоадером, который будет лежать по адресу 80000000, и передаст управление основной программе лежащей по адресу 80004000
ThE_BuZz писал(а):
Настройки файла линкера:

Вроде все нормально.

Почему с 80000000 адреса одни нули - для меня загадка, не знаю. Может дело в защите памяти, которая есть в STM32, она есть даже на чтение. Я с STM32 не работал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 10:54 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 207
Откуда: Чебоксары
На сколько я знаю адрес по которому вы совершаете прыжок в основное ПО должен быть нечетным, вот так делал я:
Код:
void (*Enter_Point)(void);        //Псевдофункция начала программы
Enter_Point = (void(*)(void))(EP_Adress+1);
Enter_Point();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 13:00 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
Цитата:
Почему с 80000000 адреса одни нули - для меня загадка, не знаю. Может дело в защите памяти, которая есть в STM32, она есть даже на чтение. Я с STM32 не работал.

Это я ради интереса первую страницу флеша очистел, чтобы убедиться, что по адресу 8000000 ничего нужного не осталось.

Цитата:
void (*Enter_Point)(void); //Псевдофункция начала программы
Enter_Point = (void(*)(void))(EP_Adress+1);
Enter_Point();


На сколько это понимаю я, стекпоинтер нужно переместить на адрес, лежащий в Reset - 8004004, потом МК перейдёт к выполнению основной программы, так?

У меня STM32F417 -- 32 бита.

Ссылка на скрин дебагера https://www.dropbox.com/s/kyjkos302me9683/debuger.jpg


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 14:33 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 207
Откуда: Чебоксары
из STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual (PM0056):
Цитата:
For BX and BLX, bit[0] of Rm must be 1 for correct execution but a branch occurs to the
target address created by changing bit[0] to 0


Для корректного перехода по адресу последний бит должен быть 1. Об этом кстати вскользь упоминали и на семинаре.

Код:
u8 FW_GO(u32 EP_Adress){
  void (*Enter_Point)(void);        // Псевдофункция
  if((EP_Adress<FW_start_adrs)|(EP_Adress>FW_end_adrs)){
    return FW_GO_ERROR;
  }
  else{
    Enter_Point = (void(*)(void))(EP_Adress+1);
   Enter_Point();
  }
  return FW_GO_NOERROR;
}

А при чем здесь SP? Адрес который вы кладете в PC должен в последнем бите иметь 1.


Последний раз редактировалось Exeland 28 май 2012, 18:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 15:40 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
Итак, по адресу 08004000 у меня лежит [10 1d 00 20 c5 47 00 08], т.е. я должен перейти PC на 80047С5 - это и есть начало программы

Код:
__set_PRIMASK(0);//включить все прерывания
void (*Enter_Point)(void);        //Псевдофункция начала программы
/*
Значения дебагера:
R0=0x08004001
PC=0x0800081C
Enter_Point = (void(*)(void))(ApplicationAddress+1);//переходит на адрес 0x08004000
Enter_Point();


Далее дизассемблер -
0x08004004 0x080047C5 STMDAEQ R0, {R0, R2, R6-R10, LR}
Переход на адрес 0x00000000, после множества комманд подряд улетает за края памяти.

Теперь вопрос по таблице векторов. Это нормально? Так и должно быть?
https://www.dropbox.com/s/ayhqoc0wbe4sl ... 0table.jpg


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 207
Откуда: Чебоксары
Попробуйте запустить основной код забиванием в лоб адреса основного кода (без единицы в конце)при старте в PC, до инициализации периферии. Если не заведется -значит либо у вас вектора выровнены не верно в загруженной прошивке, либо прошивка собрана не верно (при сборке указали не ту область).

Прыжок, кстати, я делаю не на Reset_Handler а в начало основной прошивки. По-моему вначале как раз и висит обновление SP.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 17:22 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 207
Откуда: Чебоксары
Цитата:
Я так понимаю, этим вы пишете адрес новой таблицы прерываний в VTOR. В приложении в этом нет необходимости - VTOR уже должен быть сконфигурирован в бутлоадере.

По вашему бутлоадер должен завязывать расположение векторов прерывания? А если я хочу в начало запихнуть какие-либо данные, а вектора в другое место положу, мне придется опять переписывать вектора? По-моему расположение векторов нужно указывать до иницилизации прерываний, но не в бутлоадере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 18:26 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5893
Откуда: Москва/Саратов
Exeland писал(а):
Код:
  void (*Enter_Point)(void);        //Ïñåâäîôóíêöèÿ ïåðåõîäà íà íà÷àëî ïðîãðàììû
Íàäî ïðè êîïèðîâàíèè êîäà ïåðåêëþ÷èòü íà ðóññêóþ ðàñêëàäêó, òîãäà ðóññêèå áóêâû áóäåò âèäíî íîðìàëüíî!

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 19:02 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Exeland писал(а):
Цитата:
Я так понимаю, этим вы пишете адрес новой таблицы прерываний в VTOR. В приложении в этом нет необходимости - VTOR уже должен быть сконфигурирован в бутлоадере.

По вашему бутлоадер должен завязывать расположение векторов прерывания? А если я хочу в начало запихнуть какие-либо данные, а вектора в другое место положу, мне придется опять переписывать вектора? По-моему расположение векторов нужно указывать до иницилизации прерываний, но не в бутлоадере.


По уму бутлоадер должен сделать после себя "как было". А было при старте процессора так - указатель на вершину стека загружен с нулевого адреса, таблица прерываний опять же на нулевой адрес выставлена. Соответственно, при старте программа может ожидать тех же условий. По крайней мере в стандартных стартапах CodeSourcery ожидается, что стек будет аппаратно проинициализирован.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 19:05 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
И вдогонку - я использую DFU-бутлоадер из стандартных примеров. Там вызов приложения выполняется так:


Код:
#define ApplicationAddress 0x08003000

         /* Test if user code is programmed starting from address 0x8003000 */
         if (((*(__IO uint32_t*) ApplicationAddress) & 0x2FFE0000)
               == 0x20000000)
               { /* Jump to user application */

            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
            Jump_To_Application = (pFunction) JumpAddress;
            /* Initialize user application's Stack Pointer */
            __set_MSP(*(__IO uint32_t*) ApplicationAddress);
            Jump_To_Application();
         }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 28 май 2012, 23:18 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
Exeland писал(а):
Цитата:
Я так понимаю, этим вы пишете адрес новой таблицы прерываний в VTOR. В приложении в этом нет необходимости - VTOR уже должен быть сконфигурирован в бутлоадере.

По вашему бутлоадер должен завязывать расположение векторов прерывания?

В принципе, это не обязательно, но я так делаю, т.к. не хочу расположение векторов прописывать в основной программе. В таком случае, если я заливаю свою программу в с 0 адреса (если не использую бутлоадер) или 0x1000 (если использую) - все что мне нужно, поправить одно значение в файле линкера.
define symbol __ICFEDIT_region_ROM_start__ = 0x.........

Exeland писал(а):
А если я хочу в начало запихнуть какие-либо данные, а вектора в другое место положу, мне придется опять переписывать вектора?

Значит пишу за Cortex-M3 oт NXP, с STM32 не работал.
Вот что в мануале на ядро процессора пишут:
Цитата:
]5.9.1. Vector Table and Reset
The vector table at location 0 provides the vector table at reset. It must contain at least four values:
stack top address
reset routine location
NMI ISR location
Hard Fault ISR location.

Незачем хранить данные именно в начале. Если посмотреть на карту секторов в памяти процессоров от lpc13xx до lpc17xx, видно, что можно хранить данные, например, в любом секторе с 1 по 9-й.

ThE_BuZz писал(а):
Теперь вопрос по таблице векторов. Это нормально? Так и должно быть?

Выглядит нормально.


Вложения:
sectors.jpg
sectors.jpg [ 221.49 Кб | Просмотров: 11431 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 IAP UART bootloader. Нужна помощ!
СообщениеДобавлено: 30 май 2012, 15:27 
Только пришел

Зарегистрирован: 25 май 2012, 16:56
Сообщения: 6
Всем спасибо за помощ!!!
Итого- оболочка - IAR, камень - STM32F417
Бутлоадер:
Код:
int main(void)
{   


   while(1)
   {
   
        int i=0;
      while(i<4)
      {   
         u1State = USART1->SR;   // Чтение SR сбрасывает флаг RXN
         if(u1State & USART_SR_RXNE)
         {   
            u8_START_Recieved[i] = USART1->DR;    // Чтение DR сбрасывает флаги.
            i++;
         }
      }

      if((u8_START_Recieved[0]==u8_WR[0]) &&
         (u8_START_Recieved[1]==u8_WR[1]) &&
         (u8_START_Recieved[2]==u8_WR[2]) &&
         (u8_START_Recieved[3]==u8_WR[3]))
      {
            Whaite_WR();
      }
      
      
         WriteFlash((uint32_t)0x08004000,(uint32_t)0x08020000);
         Send_OK();

         USART_Cmd(USART2,DISABLE);
         USART_DeInit(USART2);
         USART_ITConfig(USART2,USART_IT_TC,DISABLE);
         USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
         __disable_irq ();
         
u32 ProgramStart = (u32)(*((u32*)0x08004004)); //переход на начало программы, выдирается из RESET
void (*Enter_Point)(void);        //Псевдофункция начала программы
Enter_Point = (void(*)(void))(ProgramStart);//(0x080047C5);
Enter_Point();
   
      }
}
   


Основная программа:опции линкера, правим файлик до:
Код:
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08004000;
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = __ICFEDIT_region_ROM_start__;
define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__    = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };


Непосредственно в проге:
Код:
int main(void)
{   
int    i;
int counter;
//WriteFlash();//можно почистить первую страницу флешь и убедиться, что все работает с нужного адреса 0x08004000

       SystemInit();
   //SystemCoreClockUpdate();
   __set_PRIMASK(1); //disable all system interrupts
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
   GPIO__Init();
   USART__Init();
   __set_PRIMASK(0); //enable all system
/*
while(1)
{   
 
   for(int j=0; j<10000; j++)      
   {   
   }    
   GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
}
*/   
//Далее идёт тело основной программы.   
   


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB