|
Bootloader для MSP430, как написать бутлоадер для МСП430 |
|
|
|
 |
Ответов
|
Oct 21 2011, 04:49
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31

|
Мои пять копеек. Вариант, если в устройстве есть внешняя память (в моем случае AT45DB или FRAM33). Посредством основной программы по существующему протоколу связи заливаем образ прошивки во внешнюю память (с проверкой версии прошивки, аппаратуры, контрольных сумм и пр.). Затем передаем управление ассемблерной процедуре, которая копирует себя в ОЗУ и затем оттуда быстро и тупо копирует образ из внешней памяти во FLASH. Исходник для msp430f2x и at45db: CODE #include <msp430.h> #include "hardware_config.h" #include "fwupdate.h"
// Forward declarations of segments. RSEG CSTACK:DATA:NOROOT RSEG DATA16_I:DATA:NOROOT MODULE FW_UPDATE_ROUTINES PUBLIC fw_at45_update
WD_EXT_STB MACRO xor.b #(1<<PIN_WD_STROBE), &WD_EXT_PORT ENDM
AT45_ENABLE MACRO bic.b #(1<<PIN_AT45_CS), &AT45_CS_PORT ENDM
AT45_DISABLE MACRO bis.b #(1<<PIN_AT45_CS), &AT45_CS_PORT ENDM
SPI_WRITE MACRO N mov.b N, r12 call r8 ENDM
RSEG CODE fw_at45_update dint nop mov.w #(WDTPW|WDTHOLD), &WDTCTL ftg_w_ready bit #BUSY, &FCTL3 jnz ftg_w_ready
mov #SFE(CSTACK), sp
// copy to RAM mov.w #FW_INIT, r12 mov.w #SFE(DATA16_I), r14 push.w r14 copy_2_ram: mov.w @r12+, 0(r14) incd.w r14 cmp.w #FW_UPDATE_END, r12 jnc copy_2_ram ret
FW_INIT WD_EXT_STB
// Init DCO mov.b &CALBC1_12MHZ,&BCSCTL1 // Set DCO to 12MHz clr.b &BCSCTL2 // MCLK = SMCLK = DCOCLK mov.b &CALDCO_12MHZ,&DCOCTL
mov.w #(FWKEY|FSSEL_1|FN5), &FCTL2 // Flash clock = MCLK/35 ~ 360kHz
// configure SPI module mov.b #(UCSSEL_2|UCSWRST), &UCB1CTL1 // SMCLK mov.b #(UCMST|UCSYNC|UCMSB|UCCKPL), &UCB1CTL0 // 3-pin, 8-bit SPI master mov.b #1, &UCB1BR0 mov.b #0, &UCB1BR1 bic.b #(1<<2), &P5DIR bis.b #((1<<1)|(1<<3)), &P5DIR bis.b #((1<<1)|(1<<2)|(1<<3)), &P5SEL // P5.1,2,3 option select bic.b #UCSWRST, &UCB1CTL1 // Initialize USCI state machine
// configure AT45DB AT45_DISABLE mov #(SFE(DATA16_I) + (spi_wr-FW_INIT)), R8 // R8 = &spi_write
// wait for ready at45db wait_at45db AT45_ENABLE SPI_WRITE #0x57 SPI_WRITE #0x00 AT45_DISABLE bit.b #(1<<7), r12 jnc wait_at45db
// erase main memory mov.w #3, r12 // erase cycles count meras_loop mov.w #(FWKEY | MERAS), &FCTL1 // Set Mass Erase bit mov.w #(FWKEY), &FCTL3 // Clear Lock bit mov.w #0xFFFF, &fw_at45_update // write stuff byte to flash meras_wait bit #BUSY, &FCTL3 jnz meras_wait dec.w r12 jnz meras_loop
WD_EXT_STB
// at45db start read AT45_ENABLE SPI_WRITE #0xE8 // Continues Array Read(Legacy Command) SPI_WRITE #0x00 // upper part of page address SPI_WRITE #0x04 // lower part of page address and MSB of int.page adr. mov.b #0, R12 call r8 // LSB byte of internal page address call r8 // perform 4 dummy writes call r8 // in order to initiate DataFlash call r8 // address pointers call r8 // --
mov.w #FW_FIRST_ADDR, r14 mov.w #FWKEY,&FCTL3 // Clear LOCK
prg_blocks WD_EXT_STB mov.w #(FWKEY|BLKWRT|WRT),&FCTL1 // Enable block write prg_bytes SPI_WRITE #0x00 // Read byte from dataflash mov.b r12, 0(r14) // Write location prg_wait bit #WAIT, &FCTL3 // Test WAIT jz prg_wait // Loop while WAIT=0 inc.w r14 // Point to next byte jz prg_finish bit.b #0x3F, r14 // end of block (addr % 0x40) == 0 jne prg_bytes mov.w #(FWKEY|WRT), &FCTL1 // Set BLKWRT=0 prg_busy bit #BUSY, &FCTL3 jnz prg_busy jmp prg_blocks prg_finish mov.w #(FWKEY|WRT), &FCTL1 // Set BLKWRT=0 prg_finb bit #BUSY, &FCTL3 jnz prg_finb mov.w #FWKEY, &FCTL1 // Clear WRT bit mov.w #(FWKEY|LOCK), &FCTL3 // Set Lock Bit AT45_DISABLE
mov.w #0, &WDTCTL // RESET!
spi_wr bit.b #UCB1TXIFG, &UC1IFG jnc spi_wr mov.b r12, &UCB1TXBUF ?w_txend: bit.b #UCB1RXIFG, &UC1IFG jnc ?w_txend mov.b &UCB1RXBUF, r12 ret FW_UPDATE_END
ENDMOD END
|
|
|
|
Сообщений в этой теме
asket Bootloader для MSP430 Oct 15 2007, 10:09 VAI ЦитатаК сожалению в отличии от других процев у MSP... Oct 15 2007, 10:36 asket Цитата(VAI @ Oct 15 2007, 14:36) Плохо по... Oct 15 2007, 11:12 rezident asket, вы сначала разберитесь как внутрипрограммно... Oct 15 2007, 12:11 asket Цитата(rezident @ Oct 15 2007, 16:11) ask... Oct 15 2007, 12:50 VAI Нашел на http://tech.groups.yahoo.com/group/msp430... Oct 15 2007, 13:21 asket Цитата(VAI @ Oct 15 2007, 17:21) Нашел на... Oct 15 2007, 13:56  rezident Цитата(asket @ Oct 15 2007, 19:56) И еще ... Oct 15 2007, 18:40   asket Цитата(rezident @ Oct 15 2007, 22:40) Дык... Oct 19 2007, 08:10    asket Неужели останусь без ответа и привета? Oct 19 2007, 14:56    gotty Цитата(asket @ Oct 19 2007, 11:10) Окей, ... Oct 22 2007, 06:19     asket Еще такой вопрос по поводу сегментации флеш-памяти... Oct 23 2007, 13:27      gotty Цитата(asket @ Oct 23 2007, 16:27) Еще та... Oct 23 2007, 14:16       asket Цитата(gotty @ Oct 23 2007, 18:16) Можно ... Oct 23 2007, 15:48        NoName Цитата(asket @ Oct 23 2007, 17:48) Это мн... Nov 1 2007, 13:39 SSerge Узнать размер именно функции нельзя.
Но можно указ... Oct 19 2007, 19:16 CAHTA_1939 я тут в msp430x1xx_user_guide прочитал что флеш па... Oct 29 2007, 20:36 rezident Цитата(CAHTA_1939 @ Oct 30 2007, 01:36) я... Oct 29 2007, 20:53 АДИКМ Если Вам надо быстрое блочное программирование, то... Oct 30 2007, 13:13 KARLSON Здравствуйте. Собрался писать загрузчик. Т.к. в MS... Oct 5 2011, 07:31 rezident Цитата(KARLSON @ Oct 5 2011, 12:31) - чт... Oct 5 2011, 17:26 KARLSON При двух проектах, ведь будет две функции main();
... Oct 10 2011, 05:20 Сергей Борщ QUOTE (KARLSON @ Oct 10 2011, 08:20) А пр... Oct 10 2011, 06:57 KARLSON И так. Создаю пример.
Вопрос: правильно ли прописа... Oct 10 2011, 11:34 rezident Цитата(KARLSON @ Oct 10 2011, 16:34) И та... Oct 10 2011, 19:44  Сергей Борщ QUOTE (rezident @ Oct 10 2011, 22:44) Boo... Oct 11 2011, 06:12   rezident Цитата(Сергей Борщ @ Oct 11 2011, 11:12) ... Oct 11 2011, 15:08    Сергей Борщ QUOTE (rezident @ Oct 11 2011, 18:08) В в... Oct 11 2011, 17:32     rezident Цитата(Сергей Борщ @ Oct 11 2011, 22:32) ... Oct 11 2011, 17:59      Сергей Борщ QUOTE (rezident @ Oct 11 2011, 20:59) Дык... Oct 11 2011, 22:32 rezident Нет, Сергей, как сделать "перемещаемые" ... Oct 11 2011, 23:16 Сергей Борщ QUOTE (rezident @ Oct 12 2011, 02:16) Нет... Oct 12 2011, 06:14 KARLSON А что делает запись ((void(*)() )0x2200)();?
Если ... Oct 12 2011, 12:42 Сергей Борщ QUOTE (KARLSON @ Oct 12 2011, 15:42) А чт... Oct 12 2011, 13:07 KARLSON Захотел я сделать прошивку с переходами между прил... Oct 13 2011, 06:35 Сергей Борщ QUOTE (KARLSON @ Oct 13 2011, 09:35) Кста... Oct 13 2011, 15:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|