реклама на сайте
подробности

 
 
> Bootloader для MSP430, как написать бутлоадер для МСП430
asket
сообщение Oct 15 2007, 10:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



Я в этом деле новичок, недавно начал заниматься этой деятельностью, мне поручили написать Bootloader. Задача: имеется шина, будь это COM-порт или собственная шина, не важно какая, нужно по данной шине закачать с компьютера прошивку и залить его во флеш в целях ее обновления, вопрос: как это сделать это по умному? Кто и что посоветует? Может примерчик какой-нить.. К сожалению в отличии от других процев у MSP430 встроенных бутлоадеров я так понимаю нету. Компилятор IAR 3.42.

Заранее благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kurt
сообщение Oct 21 2011, 04:49
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 10:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016