<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックLPC11u24/301 Hard Fault in USB ROM Initialization</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11u24-301-Hard-Fault-in-USB-ROM-Initialization/m-p/545513#M13080</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by crawford on Sun Mar 13 11:52:00 MST 2016&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hey everyone,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm running into a very bizarre issue while trying to use the builtin USB stack on my LPC11u24/301. I'm seeing a hard fault somewhere within the hardware initialization call (USBD_API-&amp;gt;hw-&amp;gt;Init), but only when I call it without USB connected to my host. I've set a breakpoint on that line of code. If I have USB connected when I continue, the code runs fine and I see my CDC device enumerate on my host. I can plug and unplug the device all day long and everything runs perfectly! If I &lt;/SPAN&gt;&lt;I&gt;don't&lt;/I&gt;&lt;SPAN&gt; have USB connected, the processor hard faults somewhere in the initialization call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm not the best at debugging these things (closer to the worst), but from what I've gathered, the ROM appears to be jumping to whatever value I have set in USBD_API_INIT_PARAM_T.mem_size. Here is my declaration of usb_param:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
USBD_API_INIT_PARAM_T usb_param = {
.usb_reg_base = LPC_USB0_BASE,
.max_num_ep&amp;nbsp;&amp;nbsp; = USB_MAX_EP_NUM,
.mem_base&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = USB_STACK_MEM_BASE,
.mem_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = USB_STACK_MEM_SIZE,
};
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...where USB_STACK_MEM_SIZE is 0x800 in this particular example. I have set it to other values and watched the ROM attempt to jump to that particular value, so they must be related. USB_STACK_MEM_BASE is 0x20004000 in this case (USB memory). I have tried placing this in the main bank with no change in behavior. Now for the interesting bit: the stacked registers from my hard-fault handler:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
(gdb) print/x *stack
$1 = {R0 = 0x9b4, R1 = 0x9ec, R2 = 0x9b4, R3 = 0x10000000, R12 = 0xfffffe00, LR = 0x3ab, PC = 0x800, 
&amp;nbsp; xPSR = {b = {ISR = 0x0, _reserved0 = 0x0, T = 0x0, IT = 0x0, Q = 0x0, V = 0x0, C = 0x0, Z = 0x0, 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; N = 0x1}, w = 0x80000000}}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here we see that the ROM attempted to jump to 0x800 (the value of USB_STACK_MEM_SIZE). Looking at the disassembly, we see that the link register's value points to the instruction after the call to init (which we would expect):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* USB Initialization */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = USBD_API-&amp;gt;hw-&amp;gt;Init(&amp;amp;g_hUsb, &amp;amp;desc, &amp;amp;usb_param);
 39a:&amp;nbsp;&amp;nbsp; 4b11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [pc, #68]&amp;nbsp;&amp;nbsp; ; (3e0 &amp;lt;main+0xc4&amp;gt;)
 39c:&amp;nbsp;&amp;nbsp; 681b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #0]
 39e:&amp;nbsp;&amp;nbsp; 681b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #0]
 3a0:&amp;nbsp;&amp;nbsp; 685b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #4]
 3a2:&amp;nbsp;&amp;nbsp; aa05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r2, sp, #20
 3a4:&amp;nbsp;&amp;nbsp; 4669&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, sp
 3a6:&amp;nbsp;&amp;nbsp; 4813&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, [pc, #76]&amp;nbsp;&amp;nbsp; ; (3f4 &amp;lt;main+0xd8&amp;gt;)
 3a8:&amp;nbsp;&amp;nbsp; 4798&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret == LPC_OK) {
 3aa:&amp;nbsp;&amp;nbsp; 2800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, #0
 3ac:&amp;nbsp;&amp;nbsp; d113&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bne.n&amp;nbsp;&amp;nbsp; 3d6 &amp;lt;main+0xba&amp;gt;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Of course, in the process of reproducing this issue while writing up this post, one time I did see it successfully initialize &lt;/SPAN&gt;&lt;I&gt;without&lt;/I&gt;&lt;SPAN&gt; USB connected. I was able to plug and unplug a bunch and the device enumerated properly. That would indicate to me that there is either a race condition in the initialization or some uninitialized memory being referenced. So, given all of this, I am quite confused as to what is going wrong. Any tips or guidance would be greatly appreciated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-Alex&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:46:23 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:46:23Z</dc:date>
    <item>
      <title>LPC11u24/301 Hard Fault in USB ROM Initialization</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11u24-301-Hard-Fault-in-USB-ROM-Initialization/m-p/545513#M13080</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by crawford on Sun Mar 13 11:52:00 MST 2016&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hey everyone,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm running into a very bizarre issue while trying to use the builtin USB stack on my LPC11u24/301. I'm seeing a hard fault somewhere within the hardware initialization call (USBD_API-&amp;gt;hw-&amp;gt;Init), but only when I call it without USB connected to my host. I've set a breakpoint on that line of code. If I have USB connected when I continue, the code runs fine and I see my CDC device enumerate on my host. I can plug and unplug the device all day long and everything runs perfectly! If I &lt;/SPAN&gt;&lt;I&gt;don't&lt;/I&gt;&lt;SPAN&gt; have USB connected, the processor hard faults somewhere in the initialization call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm not the best at debugging these things (closer to the worst), but from what I've gathered, the ROM appears to be jumping to whatever value I have set in USBD_API_INIT_PARAM_T.mem_size. Here is my declaration of usb_param:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
USBD_API_INIT_PARAM_T usb_param = {
.usb_reg_base = LPC_USB0_BASE,
.max_num_ep&amp;nbsp;&amp;nbsp; = USB_MAX_EP_NUM,
.mem_base&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = USB_STACK_MEM_BASE,
.mem_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = USB_STACK_MEM_SIZE,
};
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...where USB_STACK_MEM_SIZE is 0x800 in this particular example. I have set it to other values and watched the ROM attempt to jump to that particular value, so they must be related. USB_STACK_MEM_BASE is 0x20004000 in this case (USB memory). I have tried placing this in the main bank with no change in behavior. Now for the interesting bit: the stacked registers from my hard-fault handler:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
(gdb) print/x *stack
$1 = {R0 = 0x9b4, R1 = 0x9ec, R2 = 0x9b4, R3 = 0x10000000, R12 = 0xfffffe00, LR = 0x3ab, PC = 0x800, 
&amp;nbsp; xPSR = {b = {ISR = 0x0, _reserved0 = 0x0, T = 0x0, IT = 0x0, Q = 0x0, V = 0x0, C = 0x0, Z = 0x0, 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; N = 0x1}, w = 0x80000000}}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here we see that the ROM attempted to jump to 0x800 (the value of USB_STACK_MEM_SIZE). Looking at the disassembly, we see that the link register's value points to the instruction after the call to init (which we would expect):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* USB Initialization */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = USBD_API-&amp;gt;hw-&amp;gt;Init(&amp;amp;g_hUsb, &amp;amp;desc, &amp;amp;usb_param);
 39a:&amp;nbsp;&amp;nbsp; 4b11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [pc, #68]&amp;nbsp;&amp;nbsp; ; (3e0 &amp;lt;main+0xc4&amp;gt;)
 39c:&amp;nbsp;&amp;nbsp; 681b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #0]
 39e:&amp;nbsp;&amp;nbsp; 681b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #0]
 3a0:&amp;nbsp;&amp;nbsp; 685b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3, #4]
 3a2:&amp;nbsp;&amp;nbsp; aa05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r2, sp, #20
 3a4:&amp;nbsp;&amp;nbsp; 4669&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, sp
 3a6:&amp;nbsp;&amp;nbsp; 4813&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, [pc, #76]&amp;nbsp;&amp;nbsp; ; (3f4 &amp;lt;main+0xd8&amp;gt;)
 3a8:&amp;nbsp;&amp;nbsp; 4798&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret == LPC_OK) {
 3aa:&amp;nbsp;&amp;nbsp; 2800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, #0
 3ac:&amp;nbsp;&amp;nbsp; d113&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bne.n&amp;nbsp;&amp;nbsp; 3d6 &amp;lt;main+0xba&amp;gt;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Of course, in the process of reproducing this issue while writing up this post, one time I did see it successfully initialize &lt;/SPAN&gt;&lt;I&gt;without&lt;/I&gt;&lt;SPAN&gt; USB connected. I was able to plug and unplug a bunch and the device enumerated properly. That would indicate to me that there is either a race condition in the initialization or some uninitialized memory being referenced. So, given all of this, I am quite confused as to what is going wrong. Any tips or guidance would be greatly appreciated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-Alex&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:46:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11u24-301-Hard-Fault-in-USB-ROM-Initialization/m-p/545513#M13080</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:46:23Z</dc:date>
    </item>
    <item>
      <title>Re: LPC11u24/301 Hard Fault in USB ROM Initialization</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11u24-301-Hard-Fault-in-USB-ROM-Initialization/m-p/545514#M13081</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;bump&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 19 Jun 2016 01:04:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11u24-301-Hard-Fault-in-USB-ROM-Initialization/m-p/545514#M13081</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-19T01:04:59Z</dc:date>
    </item>
  </channel>
</rss>

