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 |
Mark Harris