实例介绍
【实例简介】
LPC824例程,比较全面 分享给大家
【实例截图】
【核心代码】
/*******************************************************************************
* AMetal
* ---------------------------
* innovating embedded systems
*
* Copyright (c) 2001-2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
* All rights reserved.
*
* Contact information:
* web site: http://www.zlg.cn/
* e-mail: ametal.support@zlg.cn
*******************************************************************************/
/**
* \file
* \brief PLL例程,通过HW层的接口实现
*
* - 实验现象:
* 1. 打印PLL期望频率、实际输出频率和CLKOUT引脚输出频率;
* 2. CLKOUT引脚(PIO0_27引脚)输出__CLKOUT_DIV分频后的主时钟频率。
*
* \par 源代码
* \snippet demo_lpc82x_hw_pll.c src_lpc82x_hw_pll
*
* \internal
* \par Modification history
* - 1.00 15-07-20 win, first implementation.
* \endinternal
*/
/**
* \addtogroup demo_if_lpc82x_hw_pll
* \copydoc demo_lpc82x_hw_pll.c
*/
/** [src_lpc82x_hw_pll] */
#include "ametal.h"
#include "am_board.h"
#include "am_vdebug.h"
#include "amhw_lpc82x_syscon.h"
#include "amhw_lpc82x_iocon.h"
#include "amhw_lpc82x_swm.h"
#include "amhw_lpc82x_clk.h"
#include "am_lpc82x_inst_init.h"
/**
* \brief PLL时钟源,为以下一种:
* AMHW_LPC82X_CLK_PLLIN_SRC_IRC 或
* AMHW_LPC82X_CLK_PLLIN_SRC_SYSOSC 或
* AMHW_LPC82X_CLK_PLLIN_SRC_CLKIN;
*/
#define __PLL_CLKSRC AMHW_LPC82X_CLK_PLLIN_SRC_IRC
/** \name PLL频率控制
*
* M = AM_CFG_SYSPLLCTRL_M 1
* P = 2^(AM_CFG_SYSPLLCTRL_P)
*
* PLLOUT = M * PLLIN;
* FCCO = 2 * P * PLLOUT;
* @{
*/
/** \brief PLL 控制寄存器PSEL值 */
#define __PLL_CFG_PSEL 1
/** \brief PLL 控制寄存器MSEL值 */
#define __PLL_CFG_MSEL 3
/** \brief PLL期望频率 */
#define __PLL_DESIREDRATE (48000000UL)
/** \brief 选择输出时钟源 */
#define __CLKOUT_SRC AMHW_LPC82X_CLK_CLKOUT_SRC_MAINCLK
/** \brief 输出时钟源分频 */
#define __CLKOUT_DIV 48
/** @} */
extern void am_delay_init(void);
/**
* \brief 例程入口
*/
void demo_lpc82x_hw_pll_entry (void)
{
volatile uint32_t i;
/* 开启内部IRC */
if (__CLKOUT_SRC == AMHW_LPC82X_CLK_CLKOUT_SRC_IRC) {
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_IRC);
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_IRC_OUT);
/* 开启WDT 时钟振荡器 */
} else if (__CLKOUT_SRC == AMHW_LPC82X_CLK_CLKOUT_SRC_WDTOSC) {
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_WDT_OSC);
/* 开启系统振荡器 */
} else if (__CLKOUT_SRC == AMHW_LPC82X_CLK_CLKOUT_SRC_SYSOSC) {
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_SYS_OSC);
}
/* 配置PLL之前,改变主时钟源为IRC */
amhw_lpc82x_clk_main_src_set(AMHW_LPC82X_CLK_MAIN_SRC_IRC);
/* 设置PLL时钟源前的准备 */
if (__PLL_CLKSRC == AMHW_LPC82X_CLK_PLLIN_SRC_SYSOSC) {
/* 系统振荡器作为PLL时钟源 */
/* 将PIO0_8,、PIO0_9 配置为消极模式(无上拉和下拉)*/
amhw_lpc82x_iocon_mode_set(AMHW_LPC82X_IOCON,
PIO0_8,
AMHW_LPC82X_IOCON_MODE_INACTIVE);
amhw_lpc82x_iocon_mode_set(AMHW_LPC82X_IOCON,
PIO0_9,
AMHW_LPC82X_IOCON_MODE_INACTIVE);
/* 使能PIO0_8_XTALIN,PIO0_9_XTALOUT 开关矩阵固定引脚功能 */
amhw_lpc82x_swm_fixed_func_enable(AMHW_LPC82X_SWM,
AMHW_LPC82X_SWM_PIO0_8_XTALIN);
amhw_lpc82x_swm_fixed_func_enable(AMHW_LPC82X_SWM,
AMHW_LPC82X_SWM_PIO0_9_XTALOUT);
/* 外部 XTAL < 15MHz */
amhw_lpc82x_clk_pll_bypass_set(FALSE, FALSE);
/* 使能系统 OSC */
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_SYS_OSC);
for (i = 0; i < 200; i );
}
if (__PLL_CLKSRC == AMHW_LPC82X_CLK_PLLIN_SRC_CLKIN) {
/* 外部管脚输入作为时钟源 */
/* 将PIO0_1 配置为消极模式(无上拉和下拉)*/
amhw_lpc82x_iocon_mode_set(AMHW_LPC82X_IOCON,
PIO0_1,
AMHW_LPC82X_IOCON_MODE_INACTIVE);
/* 使能PIO0_1 开关矩阵固定引脚功能 CLKIN */
amhw_lpc82x_swm_fixed_func_enable(AMHW_LPC82X_SWM,
AMHW_LPC82X_SWM_PIO0_1_CLKIN);
for (i = 0; i < 200; i );
}
/* 设置PLL时钟源 */
amhw_lpc82x_clk_pll_src_set(__PLL_CLKSRC);
/* PLLOUT 时钟 */
amhw_lpc82x_clk_pllctrl_set(__PLL_CFG_MSEL, __PLL_CFG_PSEL);
amhw_lpc82x_syscon_powerup(AMHW_LPC82X_SYSCON_PD_SYS_PLL);
/* 等待PLL锁定 */
while (!amhw_lpc82x_clk_pll_locked_chk());
/* 配置主时钟为PLL输出 */
amhw_lpc82x_clk_main_src_set(AMHW_LPC82X_CLK_MAIN_SRC_PLLOUT);
/* 系统时钟分频为48 */
amhw_lpc82x_clk_system_clkdiv_set(__CLKOUT_DIV);
am_delay_init();
/* 因为时钟改变了,必须重新初始化串口 */
/* 调试初始化 */
am_debug_init(am_lpc82x_usart0_inst_init(),
AM_CFG_DEBUG_BAUDRATE);
AM_DBG_INFO("PLL configure Success!\r\n");
AM_DBG_INFO("The Desired rate is %8d Hz\r\n", __PLL_DESIREDRATE);
AM_DBG_INFO("The Actual Desired rate is %8d Hz\r\n",
amhw_lpc82x_clk_pllout_rate_get());
/* 配置引脚为时钟输出 */
am_gpio_pin_cfg(PIO0_27, PIO_FUNC_CLKOUT);
/* 配置输出时钟源和时钟分频参数 */
amhw_lpc82x_clk_clkout_config(__CLKOUT_SRC, __CLKOUT_DIV);
AM_DBG_INFO("The CLKOUT rate is %8d Hz\r\n",
amhw_lpc82x_clk_main_clkrate_get() / __CLKOUT_DIV);
while (1) {
am_led_on(LED0);
am_mdelay(200);
am_led_off(LED0);
am_mdelay(200);
}
}
/** [src_lpc82x_hw_pll] */
/* end of file */
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论