<?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のトピックRe: sett_pll invokes HardFault Handler</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562605#M16522</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wellsk on Thu Nov 21 09:40:00 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I've used this with LPCOpen and it seems to work fine. Maybe the pointer value for ROM is wrong?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the LPCOpen code for reference (not only ROM API structures and defines are included here). I'll apologize in advance for any syntax or cut/paste errors, but I hope it helps...&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

/**
 * @brief LPC8xx Power ROM APIs - set_pll mode options
 */
#define CPU_FREQ_EQU&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define CPU_FREQ_LTE&amp;nbsp;&amp;nbsp;&amp;nbsp; 1
#define CPU_FREQ_GTE&amp;nbsp;&amp;nbsp;&amp;nbsp; 2
#define CPU_FREQ_APPROX 3

/**
 * @brief LPC8xx Power ROM APIs - set_pll response0 options
 */
#define PLL_CMD_SUCCESS&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define PLL_INVALID_FREQ&amp;nbsp;&amp;nbsp; 1
#define PLL_INVALID_MODE&amp;nbsp;&amp;nbsp; 2
#define PLL_FREQ_NOT_FOUND 3
#define PLL_NOT_LOCKED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4

/**
 * @brief LPC8xx Power ROM APIs - set_power mode options
 */
#define PWR_DEFAULT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define PWR_CPU_PERFORMANCE 1
#define PWR_EFFICIENCY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2
#define PWR_LOW_CURRENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3

/**
 * @brief LPC8xx Power ROM APIs - set_power response0 options
 */
#define PWR_CMD_SUCCESS&amp;nbsp; 0
#define PWR_INVALID_FREQ 1
#define PWR_INVALID_MODE 2

/**
 * @brief LPC8XX Power ROM API structure
 */
typedef struct PWRD_API {
void (*set_pll)(uint32_t cmd[], uint32_t resp[]);/*!&amp;lt; Set PLL function */
void (*set_power)(uint32_t cmd[], uint32_t resp[]);/*!&amp;lt; Set power function */
} PWRD_API_T;

/**
 * @brief LPC8XX High level ROM API structure
 */
typedef struct ROM_API {
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; unused[3];
const PWRD_API_T&amp;nbsp; *pPWRD;/*!&amp;lt; Power profiles API function table */
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev1;
const I2CD_API_T&amp;nbsp; *pI2CD;/*!&amp;lt; I2C driver routines functions table */
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev3;
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev4;
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev5;
const UARTD_API_T *pUARTD;/*!&amp;lt; UART driver routines function table */
} ROM_API_T;

#define ROM_DRIVER_BASE (0x1FFF1FF8UL)

#define LPC_PWRD_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((PWRD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pPWRD))
#define LPC_I2CD_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((I2CD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pI2CD))
#define LPC_UART_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((UARTD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pUARTD))

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And here is how the code is used:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
/* Setup system clocking */
#define USE_ROM_API
#define LPC8XX_USE_XTAL_OSC
void SystemSetupClocking(void)
{
#if defined (USE_ROM_API)
uint32_t cmd[4], resp[2];
#endif

#if (LPC8XX_USE_XTAL_OSC == 1)
/* EXT oscillator &amp;lt; 15MHz */
Chip_Clock_SetPLLBypass(false, false);

/* Turn on the SYSOSC by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_SYSOSC_PD);

/* Select the PLL input to the external oscillator */
Chip_Clock_SetSystemPLLSource(SYSCTL_PLLCLKSRC_SYSOSC);

#else
/* Turn on the IRC by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_IRC_PD);

/* Select the PLL input in the IRC */
Chip_Clock_SetSystemPLLSource(SYSCTL_PLLCLKSRC_IRC);
#endif /* (LPC8XX_USE_XTAL_OSC == 1) */

/* Setup FLASH access to 2 clocks (up to 30MHz) */
Chip_FMC_SetFLASHAccess(FLASHTIM_30MHZ_CPU);

#if defined (USE_ROM_API)
#if (LPC8XX_USE_XTAL_OSC == 1)
/* Use ROM API for setting up PLL */
cmd[0] = Chip_Clock_GetMainOscRate() / 1000; /* in KHz */
#else
cmd[0] = Chip_Clock_GetIntOscRate() / 1000; /* in KHz */
#endif
cmd[1] = 24000000 / 1000; /* 24MHz system clock rate */
cmd[2] = CPU_FREQ_EQU;
cmd[3] = 24000000 / 10000;
LPC_PWRD_API-&amp;gt;set_pll(cmd, resp);

/* Dead loop on fail */
while (resp[0] != PLL_CMD_SUCCESS) {}

#else
/* Power down PLL to change the PLL divider ratio */
Chip_SYSCTL_PowerDown(SYSCTL_SLPWAKE_SYSPLL_PD);

/* Configure the PLL M and P dividers */
/* Setup PLL for main oscillator rate (FCLKIN = 12MHz) * 2 = 324Hz
&amp;nbsp;&amp;nbsp; MSEL = 1 (this is pre-decremented), PSEL = 2 (for P = 4)
&amp;nbsp;&amp;nbsp; FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 2 = 24MHz
&amp;nbsp;&amp;nbsp; FCCO = FCLKOUT * 2 * P = 24MHz * 2 * 4 = 192MHz (within FCCO range) */
Chip_Clock_SetupSystemPLL(1, 2);

/* Turn on the PLL by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_SYSPLL_PD);

/* Wait for PLL to lock */
while (!Chip_Clock_IsSystemPLLLocked()) {}

/* Set system clock divider to 1 */
Chip_Clock_SetSysClockDiv(1);

/* Set main clock source to the system PLL. This will drive 24MHz
&amp;nbsp;&amp;nbsp; for the main clock and 24MHz for the system clock */
Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_PLLOUT);
#endif
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 20:05:05 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T20:05:05Z</dc:date>
    <item>
      <title>sett_pll invokes HardFault Handler</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562604#M16521</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by masterboy on Thu Nov 21 06:37:48 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi all,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a problem. I try program lpc812 and I would like to change cpu clock with IRC. I have simple example:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include &amp;lt;cr_section_macros.h&amp;gt;

typedef struct _PWRD {
void (*set_pll)(unsigned int cmd[], unsigned int resp[]);
void (*set_power)(unsigned int cmd[], unsigned int resp[]);
} PWRD;

typedef struct _ROM {
const PWRD * pWRD;
} ROM;

ROM ** rom = (ROM **) (0x1FFF1FF8 + 3 * sizeof(ROM**));

unsigned int command[4], result[2];

int main(void) {

__disable_irq();
LPC_SYSCON-&amp;gt;SYSPLLCLKSEL = 0;
LPC_SYSCON-&amp;gt;SYSPLLCLKUEN = 0;
LPC_SYSCON-&amp;gt;SYSPLLCLKUEN = 1;
LPC_SYSCON-&amp;gt;SYSAHBCLKDIV = 1;
command[0] = 12000;
command[1] = 24000;
command[2] = 0;
command[3] = 0;
(*rom)-&amp;gt;pWRD-&amp;gt;set_pll(command, result);
__enable_irq();

&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0 ;
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This code still causes HardFault Handler, but I don't know why &lt;SPAN class="lia-unicode-emoji" title=":disappointed_face:"&gt;&lt;LI-EMOJI id="lia_disappointed-face" title=":disappointed_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt; Help please.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:05:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562604#M16521</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:05:05Z</dc:date>
    </item>
    <item>
      <title>Re: sett_pll invokes HardFault Handler</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562605#M16522</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wellsk on Thu Nov 21 09:40:00 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I've used this with LPCOpen and it seems to work fine. Maybe the pointer value for ROM is wrong?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the LPCOpen code for reference (not only ROM API structures and defines are included here). I'll apologize in advance for any syntax or cut/paste errors, but I hope it helps...&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

/**
 * @brief LPC8xx Power ROM APIs - set_pll mode options
 */
#define CPU_FREQ_EQU&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define CPU_FREQ_LTE&amp;nbsp;&amp;nbsp;&amp;nbsp; 1
#define CPU_FREQ_GTE&amp;nbsp;&amp;nbsp;&amp;nbsp; 2
#define CPU_FREQ_APPROX 3

/**
 * @brief LPC8xx Power ROM APIs - set_pll response0 options
 */
#define PLL_CMD_SUCCESS&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define PLL_INVALID_FREQ&amp;nbsp;&amp;nbsp; 1
#define PLL_INVALID_MODE&amp;nbsp;&amp;nbsp; 2
#define PLL_FREQ_NOT_FOUND 3
#define PLL_NOT_LOCKED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4

/**
 * @brief LPC8xx Power ROM APIs - set_power mode options
 */
#define PWR_DEFAULT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
#define PWR_CPU_PERFORMANCE 1
#define PWR_EFFICIENCY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2
#define PWR_LOW_CURRENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3

/**
 * @brief LPC8xx Power ROM APIs - set_power response0 options
 */
#define PWR_CMD_SUCCESS&amp;nbsp; 0
#define PWR_INVALID_FREQ 1
#define PWR_INVALID_MODE 2

/**
 * @brief LPC8XX Power ROM API structure
 */
typedef struct PWRD_API {
void (*set_pll)(uint32_t cmd[], uint32_t resp[]);/*!&amp;lt; Set PLL function */
void (*set_power)(uint32_t cmd[], uint32_t resp[]);/*!&amp;lt; Set power function */
} PWRD_API_T;

/**
 * @brief LPC8XX High level ROM API structure
 */
typedef struct ROM_API {
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; unused[3];
const PWRD_API_T&amp;nbsp; *pPWRD;/*!&amp;lt; Power profiles API function table */
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev1;
const I2CD_API_T&amp;nbsp; *pI2CD;/*!&amp;lt; I2C driver routines functions table */
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev3;
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev4;
const uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp; p_dev5;
const UARTD_API_T *pUARTD;/*!&amp;lt; UART driver routines function table */
} ROM_API_T;

#define ROM_DRIVER_BASE (0x1FFF1FF8UL)

#define LPC_PWRD_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((PWRD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pPWRD))
#define LPC_I2CD_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((I2CD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pI2CD))
#define LPC_UART_API&amp;nbsp;&amp;nbsp;&amp;nbsp; ((UARTD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))-&amp;gt;pUARTD))

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And here is how the code is used:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
/* Setup system clocking */
#define USE_ROM_API
#define LPC8XX_USE_XTAL_OSC
void SystemSetupClocking(void)
{
#if defined (USE_ROM_API)
uint32_t cmd[4], resp[2];
#endif

#if (LPC8XX_USE_XTAL_OSC == 1)
/* EXT oscillator &amp;lt; 15MHz */
Chip_Clock_SetPLLBypass(false, false);

/* Turn on the SYSOSC by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_SYSOSC_PD);

/* Select the PLL input to the external oscillator */
Chip_Clock_SetSystemPLLSource(SYSCTL_PLLCLKSRC_SYSOSC);

#else
/* Turn on the IRC by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_IRC_PD);

/* Select the PLL input in the IRC */
Chip_Clock_SetSystemPLLSource(SYSCTL_PLLCLKSRC_IRC);
#endif /* (LPC8XX_USE_XTAL_OSC == 1) */

/* Setup FLASH access to 2 clocks (up to 30MHz) */
Chip_FMC_SetFLASHAccess(FLASHTIM_30MHZ_CPU);

#if defined (USE_ROM_API)
#if (LPC8XX_USE_XTAL_OSC == 1)
/* Use ROM API for setting up PLL */
cmd[0] = Chip_Clock_GetMainOscRate() / 1000; /* in KHz */
#else
cmd[0] = Chip_Clock_GetIntOscRate() / 1000; /* in KHz */
#endif
cmd[1] = 24000000 / 1000; /* 24MHz system clock rate */
cmd[2] = CPU_FREQ_EQU;
cmd[3] = 24000000 / 10000;
LPC_PWRD_API-&amp;gt;set_pll(cmd, resp);

/* Dead loop on fail */
while (resp[0] != PLL_CMD_SUCCESS) {}

#else
/* Power down PLL to change the PLL divider ratio */
Chip_SYSCTL_PowerDown(SYSCTL_SLPWAKE_SYSPLL_PD);

/* Configure the PLL M and P dividers */
/* Setup PLL for main oscillator rate (FCLKIN = 12MHz) * 2 = 324Hz
&amp;nbsp;&amp;nbsp; MSEL = 1 (this is pre-decremented), PSEL = 2 (for P = 4)
&amp;nbsp;&amp;nbsp; FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 2 = 24MHz
&amp;nbsp;&amp;nbsp; FCCO = FCLKOUT * 2 * P = 24MHz * 2 * 4 = 192MHz (within FCCO range) */
Chip_Clock_SetupSystemPLL(1, 2);

/* Turn on the PLL by clearing the power down bit */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_SYSPLL_PD);

/* Wait for PLL to lock */
while (!Chip_Clock_IsSystemPLLLocked()) {}

/* Set system clock divider to 1 */
Chip_Clock_SetSysClockDiv(1);

/* Set main clock source to the system PLL. This will drive 24MHz
&amp;nbsp;&amp;nbsp; for the main clock and 24MHz for the system clock */
Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_PLLOUT);
#endif
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:05:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562605#M16522</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:05:05Z</dc:date>
    </item>
    <item>
      <title>Re: sett_pll invokes HardFault Handler</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562606#M16523</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by masterboy on Fri Nov 22 06:33:55 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you!!! This solution works :) The mistake is in the UM10601. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;TO NXP SUPPORT: PLEASE FIX IT !&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a next question. Can I set the CPU frequency to 30 MHz using IRC? Using the API can be set only 24 MHz.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:05:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/sett-pll-invokes-HardFault-Handler/m-p/562606#M16523</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:05:06Z</dc:date>
    </item>
  </channel>
</rss>

