Mark Harris
/
SIEMENS_DLFEEDER_LOOP
Loop based controller for dual lane siemens siplace feeder.
IAP_LPC11U.cpp@1:4d3738338cf1, 2017-02-04 (annotated)
- Committer:
- Issus
- Date:
- Sat Feb 04 01:27:29 2017 +0000
- Revision:
- 1:4d3738338cf1
Minimum on time for cover tape pickup. Added IAP for getting mcu serial number and future eeprom use. Moved defs to .h file.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Issus | 1:4d3738338cf1 | 1 | #if defined(TARGET_LPC11UXX) | defined(TARGET_LPC11U6X) |
Issus | 1:4d3738338cf1 | 2 | |
Issus | 1:4d3738338cf1 | 3 | #include "IAP_LPC11U.h" |
Issus | 1:4d3738338cf1 | 4 | |
Issus | 1:4d3738338cf1 | 5 | namespace |
Issus | 1:4d3738338cf1 | 6 | { |
Issus | 1:4d3738338cf1 | 7 | //This data must be global so it is not read from the stack |
Issus | 1:4d3738338cf1 | 8 | unsigned int m_Command[5], m_Result[5]; |
Issus | 1:4d3738338cf1 | 9 | typedef void (*IAP)(unsigned int [], unsigned int []); |
Issus | 1:4d3738338cf1 | 10 | const IAP IAP_Entry = (IAP)0x1FFF1FF1; |
Issus | 1:4d3738338cf1 | 11 | } |
Issus | 1:4d3738338cf1 | 12 | |
Issus | 1:4d3738338cf1 | 13 | static inline void _iap_CriticalEntry() |
Issus | 1:4d3738338cf1 | 14 | { |
Issus | 1:4d3738338cf1 | 15 | //Disable interrupts |
Issus | 1:4d3738338cf1 | 16 | __disable_irq(); |
Issus | 1:4d3738338cf1 | 17 | |
Issus | 1:4d3738338cf1 | 18 | //Safely perform IAP entry |
Issus | 1:4d3738338cf1 | 19 | IAP_Entry(m_Command, m_Result); |
Issus | 1:4d3738338cf1 | 20 | |
Issus | 1:4d3738338cf1 | 21 | //Enable interrupts |
Issus | 1:4d3738338cf1 | 22 | __enable_irq(); |
Issus | 1:4d3738338cf1 | 23 | } |
Issus | 1:4d3738338cf1 | 24 | |
Issus | 1:4d3738338cf1 | 25 | IapReturnCode IAP_PrepareSectors(unsigned int sector_start, unsigned int sector_end) |
Issus | 1:4d3738338cf1 | 26 | { |
Issus | 1:4d3738338cf1 | 27 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 28 | m_Command[0] = 50; |
Issus | 1:4d3738338cf1 | 29 | m_Command[1] = sector_start; //The start of the sector to be prepared |
Issus | 1:4d3738338cf1 | 30 | m_Command[2] = sector_end; //The end of the sector to be prepared |
Issus | 1:4d3738338cf1 | 31 | |
Issus | 1:4d3738338cf1 | 32 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 33 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 34 | |
Issus | 1:4d3738338cf1 | 35 | //Extract the result code |
Issus | 1:4d3738338cf1 | 36 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 37 | |
Issus | 1:4d3738338cf1 | 38 | //Return the result code |
Issus | 1:4d3738338cf1 | 39 | return ret; |
Issus | 1:4d3738338cf1 | 40 | } |
Issus | 1:4d3738338cf1 | 41 | |
Issus | 1:4d3738338cf1 | 42 | IapReturnCode IAP_CopyRAMToFlash(void* ram_address, void* flash_address, unsigned int length) |
Issus | 1:4d3738338cf1 | 43 | { |
Issus | 1:4d3738338cf1 | 44 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 45 | m_Command[0] = 51; |
Issus | 1:4d3738338cf1 | 46 | m_Command[1] = (unsigned int)flash_address; //Flash address where the contents are to be copied (it should be within 256bytes boundary) |
Issus | 1:4d3738338cf1 | 47 | m_Command[2] = (unsigned int)ram_address; //RAM address to be copied (it should be in word boundary) |
Issus | 1:4d3738338cf1 | 48 | m_Command[3] = length; //Number of data to be copied in bytes: 256, 512, 1024, or 4096 |
Issus | 1:4d3738338cf1 | 49 | m_Command[4] = SystemCoreClock / 1000; |
Issus | 1:4d3738338cf1 | 50 | |
Issus | 1:4d3738338cf1 | 51 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 52 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 53 | |
Issus | 1:4d3738338cf1 | 54 | //Extract the result code |
Issus | 1:4d3738338cf1 | 55 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 56 | |
Issus | 1:4d3738338cf1 | 57 | //Return the result code |
Issus | 1:4d3738338cf1 | 58 | return ret; |
Issus | 1:4d3738338cf1 | 59 | } |
Issus | 1:4d3738338cf1 | 60 | |
Issus | 1:4d3738338cf1 | 61 | IapReturnCode IAP_EraseSectors(unsigned int sector_start, unsigned int sector_end) |
Issus | 1:4d3738338cf1 | 62 | { |
Issus | 1:4d3738338cf1 | 63 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 64 | m_Command[0] = 52; |
Issus | 1:4d3738338cf1 | 65 | m_Command[1] = sector_start; //The start of the sector to be erased |
Issus | 1:4d3738338cf1 | 66 | m_Command[2] = sector_end; //The end of the sector to be erased |
Issus | 1:4d3738338cf1 | 67 | m_Command[3] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz |
Issus | 1:4d3738338cf1 | 68 | |
Issus | 1:4d3738338cf1 | 69 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 70 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 71 | |
Issus | 1:4d3738338cf1 | 72 | //Extract the result code |
Issus | 1:4d3738338cf1 | 73 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 74 | |
Issus | 1:4d3738338cf1 | 75 | //Return the result code |
Issus | 1:4d3738338cf1 | 76 | return ret; |
Issus | 1:4d3738338cf1 | 77 | } |
Issus | 1:4d3738338cf1 | 78 | |
Issus | 1:4d3738338cf1 | 79 | IapReturnCode IAP_BlankCheckSectors(unsigned int sector_start, unsigned int sector_end) |
Issus | 1:4d3738338cf1 | 80 | { |
Issus | 1:4d3738338cf1 | 81 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 82 | m_Command[0] = 53; |
Issus | 1:4d3738338cf1 | 83 | m_Command[1] = sector_start; //The start of the sector to be checked |
Issus | 1:4d3738338cf1 | 84 | m_Command[2] = sector_end; //The end of the sector to be checked |
Issus | 1:4d3738338cf1 | 85 | |
Issus | 1:4d3738338cf1 | 86 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 87 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 88 | |
Issus | 1:4d3738338cf1 | 89 | //Extract the result code |
Issus | 1:4d3738338cf1 | 90 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 91 | |
Issus | 1:4d3738338cf1 | 92 | //Return the result code |
Issus | 1:4d3738338cf1 | 93 | return ret; |
Issus | 1:4d3738338cf1 | 94 | } |
Issus | 1:4d3738338cf1 | 95 | |
Issus | 1:4d3738338cf1 | 96 | unsigned int IAP_ReadPartID() |
Issus | 1:4d3738338cf1 | 97 | { |
Issus | 1:4d3738338cf1 | 98 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 99 | m_Command[0] = 54; |
Issus | 1:4d3738338cf1 | 100 | |
Issus | 1:4d3738338cf1 | 101 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 102 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 103 | |
Issus | 1:4d3738338cf1 | 104 | //Extract the part ID |
Issus | 1:4d3738338cf1 | 105 | unsigned int ret = m_Result[1]; |
Issus | 1:4d3738338cf1 | 106 | |
Issus | 1:4d3738338cf1 | 107 | //Return the part ID |
Issus | 1:4d3738338cf1 | 108 | return ret; |
Issus | 1:4d3738338cf1 | 109 | } |
Issus | 1:4d3738338cf1 | 110 | |
Issus | 1:4d3738338cf1 | 111 | unsigned short IAP_ReadBootCodeVersion() |
Issus | 1:4d3738338cf1 | 112 | { |
Issus | 1:4d3738338cf1 | 113 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 114 | m_Command[0] = 55; |
Issus | 1:4d3738338cf1 | 115 | |
Issus | 1:4d3738338cf1 | 116 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 117 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 118 | |
Issus | 1:4d3738338cf1 | 119 | //Extract the boot code version |
Issus | 1:4d3738338cf1 | 120 | unsigned int ret = (unsigned short)m_Result[1]; |
Issus | 1:4d3738338cf1 | 121 | |
Issus | 1:4d3738338cf1 | 122 | //Return the boot code version |
Issus | 1:4d3738338cf1 | 123 | return ret; |
Issus | 1:4d3738338cf1 | 124 | } |
Issus | 1:4d3738338cf1 | 125 | |
Issus | 1:4d3738338cf1 | 126 | IapReturnCode IAP_Compare(void* address1, void* address2, unsigned int bytes) |
Issus | 1:4d3738338cf1 | 127 | { |
Issus | 1:4d3738338cf1 | 128 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 129 | m_Command[0] = 56; |
Issus | 1:4d3738338cf1 | 130 | m_Command[1] = (unsigned int)address1; //Starting flash or RAM address of data bytes to be compared. This address should be a word boundary. |
Issus | 1:4d3738338cf1 | 131 | m_Command[2] = (unsigned int)address2; //Starting flash or RAM address of data bytes to be compared. This address should be a word boundary. |
Issus | 1:4d3738338cf1 | 132 | m_Command[3] = bytes; //Number of bytes to be compared; should be a multiple of 4. |
Issus | 1:4d3738338cf1 | 133 | |
Issus | 1:4d3738338cf1 | 134 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 135 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 136 | |
Issus | 1:4d3738338cf1 | 137 | //Extract the result code |
Issus | 1:4d3738338cf1 | 138 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 139 | |
Issus | 1:4d3738338cf1 | 140 | //Return the result code |
Issus | 1:4d3738338cf1 | 141 | return ret; |
Issus | 1:4d3738338cf1 | 142 | } |
Issus | 1:4d3738338cf1 | 143 | |
Issus | 1:4d3738338cf1 | 144 | /* This function resets some microcontroller peripherals to reset |
Issus | 1:4d3738338cf1 | 145 | * hardware configuration to ensure that the USB In-System Programming module |
Issus | 1:4d3738338cf1 | 146 | * will work properly. It is normally called from reset and assumes some reset |
Issus | 1:4d3738338cf1 | 147 | * configuration settings for the MCU. |
Issus | 1:4d3738338cf1 | 148 | * Some of the peripheral configurations may be redundant in your specific |
Issus | 1:4d3738338cf1 | 149 | * project. |
Issus | 1:4d3738338cf1 | 150 | */ |
Issus | 1:4d3738338cf1 | 151 | void IAP_ReinvokeISP() |
Issus | 1:4d3738338cf1 | 152 | { |
Issus | 1:4d3738338cf1 | 153 | //Make sure USB clock is turned on before calling ISP |
Issus | 1:4d3738338cf1 | 154 | //LPC_SYSCON->SYSAHBCLKCTRL |= 0x04000; |
Issus | 1:4d3738338cf1 | 155 | |
Issus | 1:4d3738338cf1 | 156 | //Make sure 32-bit Timer 1 is turned on before calling ISP |
Issus | 1:4d3738338cf1 | 157 | //LPC_SYSCON->SYSAHBCLKCTRL |= 0x00400; |
Issus | 1:4d3738338cf1 | 158 | |
Issus | 1:4d3738338cf1 | 159 | //Make sure GPIO clock is turned on before calling ISP |
Issus | 1:4d3738338cf1 | 160 | LPC_SYSCON->SYSAHBCLKCTRL |= 0x00040; |
Issus | 1:4d3738338cf1 | 161 | |
Issus | 1:4d3738338cf1 | 162 | //Make sure IO configuration clock is turned on before calling ISP |
Issus | 1:4d3738338cf1 | 163 | //LPC_SYSCON->SYSAHBCLKCTRL |= 0x10000; |
Issus | 1:4d3738338cf1 | 164 | |
Issus | 1:4d3738338cf1 | 165 | #if defined(TARGET_LPC11U6X) |
Issus | 1:4d3738338cf1 | 166 | //Set the vector table offset to address 0 |
Issus | 1:4d3738338cf1 | 167 | SCB->VTOR = 0; |
Issus | 1:4d3738338cf1 | 168 | #endif |
Issus | 1:4d3738338cf1 | 169 | |
Issus | 1:4d3738338cf1 | 170 | //Make sure AHB clock divider is 1:1 |
Issus | 1:4d3738338cf1 | 171 | LPC_SYSCON->SYSAHBCLKDIV = 1; |
Issus | 1:4d3738338cf1 | 172 | |
Issus | 1:4d3738338cf1 | 173 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 174 | m_Command[0] = 57; |
Issus | 1:4d3738338cf1 | 175 | |
Issus | 1:4d3738338cf1 | 176 | //Initialize the storage state machine |
Issus | 1:4d3738338cf1 | 177 | //*((unsigned int*)(0x10000054)) = 0x0; |
Issus | 1:4d3738338cf1 | 178 | |
Issus | 1:4d3738338cf1 | 179 | //Set stack pointer to ROM value (reset default) |
Issus | 1:4d3738338cf1 | 180 | //This must be the last piece of code executed before calling ISP, |
Issus | 1:4d3738338cf1 | 181 | //because most C expressions and function returns will fail after the stack pointer is changed. |
Issus | 1:4d3738338cf1 | 182 | //__set_MSP(*((unsigned int*)0x00000000)); |
Issus | 1:4d3738338cf1 | 183 | |
Issus | 1:4d3738338cf1 | 184 | //Invoke IAP call... |
Issus | 1:4d3738338cf1 | 185 | IAP_Entry(m_Command, m_Result); |
Issus | 1:4d3738338cf1 | 186 | |
Issus | 1:4d3738338cf1 | 187 | //Shouldn't return |
Issus | 1:4d3738338cf1 | 188 | } |
Issus | 1:4d3738338cf1 | 189 | |
Issus | 1:4d3738338cf1 | 190 | UID IAP_ReadUID() |
Issus | 1:4d3738338cf1 | 191 | { |
Issus | 1:4d3738338cf1 | 192 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 193 | m_Command[0] = 58; |
Issus | 1:4d3738338cf1 | 194 | |
Issus | 1:4d3738338cf1 | 195 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 196 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 197 | |
Issus | 1:4d3738338cf1 | 198 | //Extract the UID |
Issus | 1:4d3738338cf1 | 199 | UID ret = { |
Issus | 1:4d3738338cf1 | 200 | m_Result[1], |
Issus | 1:4d3738338cf1 | 201 | m_Result[2], |
Issus | 1:4d3738338cf1 | 202 | m_Result[3], |
Issus | 1:4d3738338cf1 | 203 | m_Result[4] |
Issus | 1:4d3738338cf1 | 204 | }; |
Issus | 1:4d3738338cf1 | 205 | |
Issus | 1:4d3738338cf1 | 206 | //Return the UID |
Issus | 1:4d3738338cf1 | 207 | return ret; |
Issus | 1:4d3738338cf1 | 208 | } |
Issus | 1:4d3738338cf1 | 209 | |
Issus | 1:4d3738338cf1 | 210 | IapReturnCode IAP_ErasePage(unsigned int page_start, unsigned int page_end) |
Issus | 1:4d3738338cf1 | 211 | { |
Issus | 1:4d3738338cf1 | 212 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 213 | m_Command[0] = 59; |
Issus | 1:4d3738338cf1 | 214 | m_Command[1] = page_start; //The start of the page to be erased |
Issus | 1:4d3738338cf1 | 215 | m_Command[2] = page_end; //The end of the page to be erased |
Issus | 1:4d3738338cf1 | 216 | m_Command[3] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz |
Issus | 1:4d3738338cf1 | 217 | |
Issus | 1:4d3738338cf1 | 218 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 219 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 220 | |
Issus | 1:4d3738338cf1 | 221 | //Extract the result code |
Issus | 1:4d3738338cf1 | 222 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 223 | |
Issus | 1:4d3738338cf1 | 224 | //Return the result code |
Issus | 1:4d3738338cf1 | 225 | return ret; |
Issus | 1:4d3738338cf1 | 226 | } |
Issus | 1:4d3738338cf1 | 227 | |
Issus | 1:4d3738338cf1 | 228 | IapReturnCode IAP_WriteEEPROM(unsigned int ee_address, char* buffer, unsigned int length) |
Issus | 1:4d3738338cf1 | 229 | { |
Issus | 1:4d3738338cf1 | 230 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 231 | m_Command[0] = 61; |
Issus | 1:4d3738338cf1 | 232 | m_Command[1] = ee_address; //EEPROM address (byte, half-word or word aligned) |
Issus | 1:4d3738338cf1 | 233 | m_Command[2] = (unsigned int)buffer; //RAM address (byte, half-word or word aligned) |
Issus | 1:4d3738338cf1 | 234 | m_Command[3] = length; //Number of bytes to be written (byte, half-word writes are ok) |
Issus | 1:4d3738338cf1 | 235 | m_Command[4] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz |
Issus | 1:4d3738338cf1 | 236 | |
Issus | 1:4d3738338cf1 | 237 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 238 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 239 | |
Issus | 1:4d3738338cf1 | 240 | //Extract the result code |
Issus | 1:4d3738338cf1 | 241 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 242 | |
Issus | 1:4d3738338cf1 | 243 | //Return the result code |
Issus | 1:4d3738338cf1 | 244 | return ret; |
Issus | 1:4d3738338cf1 | 245 | } |
Issus | 1:4d3738338cf1 | 246 | |
Issus | 1:4d3738338cf1 | 247 | IapReturnCode IAP_ReadEEPROM(unsigned int ee_address, char* buffer, unsigned int length) |
Issus | 1:4d3738338cf1 | 248 | { |
Issus | 1:4d3738338cf1 | 249 | //Prepare the command array |
Issus | 1:4d3738338cf1 | 250 | m_Command[0] = 62; |
Issus | 1:4d3738338cf1 | 251 | m_Command[1] = ee_address; //EEPROM address (byte, half-word or word aligned) |
Issus | 1:4d3738338cf1 | 252 | m_Command[2] = (unsigned int)buffer; //RAM address (byte, half-word or word aligned) |
Issus | 1:4d3738338cf1 | 253 | m_Command[3] = length; //Number of bytes to be read (byte, half-word reads are ok) |
Issus | 1:4d3738338cf1 | 254 | m_Command[4] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz |
Issus | 1:4d3738338cf1 | 255 | |
Issus | 1:4d3738338cf1 | 256 | //Invoke critical IAP call... |
Issus | 1:4d3738338cf1 | 257 | _iap_CriticalEntry(); |
Issus | 1:4d3738338cf1 | 258 | |
Issus | 1:4d3738338cf1 | 259 | //Extract the result code |
Issus | 1:4d3738338cf1 | 260 | IapReturnCode ret = (IapReturnCode)m_Result[0]; |
Issus | 1:4d3738338cf1 | 261 | |
Issus | 1:4d3738338cf1 | 262 | //Return the result code |
Issus | 1:4d3738338cf1 | 263 | return ret; |
Issus | 1:4d3738338cf1 | 264 | } |
Issus | 1:4d3738338cf1 | 265 | |
Issus | 1:4d3738338cf1 | 266 | #endif |