Hi there,
I am trying to write a code for the LPC11u24 to send data via USB, as a USBhid report, and also include a routine to update the firmware via software, using the reinvoke_ISP function. However, I am experiencing some sort of conflict between the IAP reinvoke_ISP function and the USBHID lib.
I am using the code from https://developer.mbed.org/questions/3237/Can-mbed-jump-to-ISP-rom-like-the-autois/, posted by Neil. The IAP part works fine without instantiating the USBHID object: the MCU enumerates as a MSD after 10 seconds. However, when I include the line below, the device does not appear as a MSD.
USBHID hid(output_report_length, input_report_length, vendor_id, product_id, product_release);
The code below is kind of the "first step" of what I am trying to do, but I can't get it to work. Has anyone else had this problem?
Thanks,
Rafael
main.cpp
#include "mbed.h"
#include "USBHID.h"
using namespace std;
// using a led
DigitalOut myled(P0_9);
USBHID hid(8,8); // If I comment this line, the code works fine
//This data must be global so it is not read from the stack
unsigned int m_Command[5], m_Result[5];
typedef void (*IAP)(unsigned int [], unsigned int []);
const IAP IAP_Entry = (IAP)0x1FFF1FF1;
/* This function resets some microcontroller peripherals to reset
* hardware configuration to ensure that the USB In-System Programming module
* will work properly. It is normally called from reset and assumes some reset
* configuration settings for the MCU.
* Some of the peripheral configurations may be redundant in your specific
* project.
*/
void IAP_ReinvokeISP()
{
//Make sure USB clock is turned on before calling ISP
LPC_SYSCON->SYSAHBCLKCTRL |= 0x04000;
//Make sure 32-bit Timer 1 is turned on before calling ISP
LPC_SYSCON->SYSAHBCLKCTRL |= 0x00400;
//Make sure GPIO clock is turned on before calling ISP
LPC_SYSCON->SYSAHBCLKCTRL |= 0x00040;
//Make sure IO configuration clock is turned on before calling ISP
LPC_SYSCON->SYSAHBCLKCTRL |= 0x10000;
//Make sure AHB clock divider is 1:1
LPC_SYSCON->SYSAHBCLKDIV = 1;
//Prepare the command array
m_Command[0] = 57;
//Initialize the storage state machine
*((unsigned int *)(0x10000054)) = 0x0;
//Set stack pointer to ROM value (reset default)
//This must be the last piece of code executed before calling ISP,
//because most C expressions and function returns will fail after the stack pointer is changed.
__set_MSP(*((unsigned int *)0x00000000));
//Invoke IAP call...
IAP_Entry(m_Command, m_Result);
//Shouldn't return
while(1);
}
int main(){
for (int i = 0; i < 10; i++) {
myled = !myled;
wait(0.5);
}
IAP_ReinvokeISP();
}
Hi there,
I am trying to write a code for the LPC11u24 to send data via USB, as a USBhid report, and also include a routine to update the firmware via software, using the reinvoke_ISP function. However, I am experiencing some sort of conflict between the IAP reinvoke_ISP function and the USBHID lib.
I am using the code from https://developer.mbed.org/questions/3237/Can-mbed-jump-to-ISP-rom-like-the-autois/, posted by Neil. The IAP part works fine without instantiating the USBHID object: the MCU enumerates as a MSD after 10 seconds. However, when I include the line below, the device does not appear as a MSD. USBHID hid(output_report_length, input_report_length, vendor_id, product_id, product_release);
The code below is kind of the "first step" of what I am trying to do, but I can't get it to work. Has anyone else had this problem?
Thanks, Rafael
main.cpp