Mercurial > lcfOS
comparison python/stm32.py @ 256:225f444019b1
Added build and flash menu option
author | Windel Bouwman |
---|---|
date | Sun, 04 Aug 2013 18:32:04 +0200 |
parents | 7416c923a02a |
children | b2f94b4951f1 |
comparison
equal
deleted
inserted
replaced
255:7416c923a02a | 256:225f444019b1 |
---|---|
1 import time | 1 import time |
2 import logging | |
2 from devices import Device, registerDevice, STLinkException, Interface | 3 from devices import Device, registerDevice, STLinkException, Interface |
3 import stlink | 4 import stlink |
4 | 5 |
5 # F4 specifics: | 6 # F4 specifics: |
6 STM32_FLASH_BASE = 0x08000000 | 7 STM32_FLASH_BASE = 0x08000000 |
98 self.eraseFlashSector(sector) | 99 self.eraseFlashSector(sector) |
99 # program pages: | 100 # program pages: |
100 self.unlockFlashIf() | 101 self.unlockFlashIf() |
101 self.writeFlashCrPsiz(2) # writes are 32 bits aligned | 102 self.writeFlashCrPsiz(2) # writes are 32 bits aligned |
102 self.setFlashCrPg() | 103 self.setFlashCrPg() |
103 self.logger.info('writing {0} bytes'.format(len(content)), end='') | 104 self.logger.info('writing {0} bytes'.format(len(content))) |
104 offset = 0 | 105 offset = 0 |
105 t1 = time.time() | 106 t1 = time.time() |
106 while offset < len(content): | 107 while offset < len(content): |
107 size = len(content) - offset | 108 size = len(content) - offset |
108 if size > 0x8000: | 109 if size > 0x8000: |
111 while len(chunk) % 4 != 0: | 112 while len(chunk) % 4 != 0: |
112 chunk = chunk + bytes([0]) | 113 chunk = chunk + bytes([0]) |
113 # Use simple mem32 writes: | 114 # Use simple mem32 writes: |
114 self.iface.write_mem32(address + offset, chunk) | 115 self.iface.write_mem32(address + offset, chunk) |
115 offset += size | 116 offset += size |
116 print('.', end='', flush=True) | 117 self.logger.info('.') |
117 t2 = time.time() | 118 t2 = time.time() |
118 print('Done!') | 119 self.logger.info('Done!') |
119 print('Speed: {0} bytes/second'.format(len(content)/(t2-t1))) | 120 self.logger.info('Speed: {0} bytes/second'.format(len(content)/(t2-t1))) |
120 self.lockFlash() | 121 self.lockFlash() |
121 # verfify program: | 122 # verfify program: |
122 self.verifyFlash(address, content) | 123 self.verifyFlash(address, content) |
123 def eraseFlashSector(self, sector): | 124 def eraseFlashSector(self, sector): |
124 self.waitFlashBusy() | 125 self.waitFlashBusy() |
133 self.setFlashCrMer() | 134 self.setFlashCrMer() |
134 self.setFlashCrStart() | 135 self.setFlashCrStart() |
135 self.waitFlashBusy() | 136 self.waitFlashBusy() |
136 self.clearFlashCrMer() | 137 self.clearFlashCrMer() |
137 self.lockFlash() | 138 self.lockFlash() |
139 | |
138 def verifyFlash(self, address, content): | 140 def verifyFlash(self, address, content): |
139 device_content = self.readFlash(address, len(content)) | 141 device_content = self.readFlash(address, len(content)) |
140 ok = content == device_content | 142 ok = content == device_content |
141 print('Verify:', ok) | 143 self.logger.info('Verify: {}'.format(ok)) |
144 | |
142 def readFlash(self, address, size): | 145 def readFlash(self, address, size): |
143 print('Reading {1} bytes from 0x{0:X}'.format(address, size), end='') | 146 self.logger.info('Reading {1} bytes from 0x{0:X}'.format(address, size)) |
144 offset = 0 | 147 offset = 0 |
145 tmp_size = 0x1800 | 148 tmp_size = 0x1800 |
146 t1 = time.time() | 149 t1 = time.time() |
147 image = bytes() | 150 image = bytes() |
148 while offset < size: | 151 while offset < size: |
157 | 160 |
158 mem = self.iface.read_mem32(address + offset, aligned_size) | 161 mem = self.iface.read_mem32(address + offset, aligned_size) |
159 image += mem[:tmp_size] | 162 image += mem[:tmp_size] |
160 | 163 |
161 # indicate progress: | 164 # indicate progress: |
162 print('.', end='', flush=True) | 165 self.logger.info('.') |
163 | 166 |
164 # increase for next piece: | 167 # increase for next piece: |
165 offset += tmp_size | 168 offset += tmp_size |
166 t2 = time.time() | 169 t2 = time.time() |
167 assert size == len(image) | 170 assert size == len(image) |
168 print('Done!') | 171 self.logger.info('Done!') |
169 print('Speed: {0} bytes/second'.format(size/(t2-t1))) | 172 self.logger.info('Speed: {0} bytes/second'.format(size/(t2-t1))) |
170 return image | 173 return image |
171 | 174 |
172 def waitFlashBusy(self): | 175 def waitFlashBusy(self): |
173 """ block until flash operation completes. """ | 176 """ block until flash operation completes. """ |
174 while self.isFlashBusy(): | 177 while self.isFlashBusy(): |