请选择 进入手机版 | 继续访问电脑版
查看: 5520|回复: 5

[原创] LPC824调试笔记之CLKOUT输出系统时钟信号

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
    发表于 2016-12-30 01:31:52 | 显示全部楼层 |阅读模式
    本帖最后由 suyong_yq 于 2016-12-30 01:42 编辑

    拿到LPC824-Lite开发板有一段时间了,抽空阅读了一下LPC824的手册和相关的代码资料,非常感兴趣,打算研究一下这块板子。
    看了现有的代码,无论是LPC824-Lite开发板资料中的固件库,或者是官方提供的LPCOpen的固件库,用起来都比较麻烦(build一个最简单的工程至少需要编译三次,第一次是驱动库,第二次是板子库,第三次才是应用程序)。其中各个文件的关联度比较高,想要单独提取驱动代码对原有代码改动颇多,而且解不完的编译错误让我有点头大。万般无奈之下,我不得不重新构建代码库,刚好可以完整地学习一下这款芯片。不过基础代码还是源自于官方的LPCOpen固件库。

    万里之行,始于时钟,对于应用程序来讲,第一步永远是配置系统时钟。system_LPC82x.c中用于初始时钟的SystemInit()函数中的代码有点冗余(各种宏定义),配置时钟要自己搞定!通过阅读手册可以了解到,LPC824单片机系统中有一个Main Clock,系统中绝大多数模块使用的时钟都是源自于此,而这个Main Clock默认使用内部的IRC 12MHz时钟、外部晶振或是时钟发生器输出时钟或是PLL倍频时钟。PLL是个好东西,可以基于较低频率的时钟信号产生较高频率的时钟信号,但是调试过程一般比较复杂(此时想起以前调试K60的MCG模块,仍心有余悸),最好能够在调试产生时钟是通过示波器观察到PLL的输出,从而实实在在地看到PLL的输出信号。

    啊哈,通过阅读手册得知,芯片的CLKOUT信号可以输出各种时钟,其中就包含Main Clock。
    寄存器.png
    图1

    通过使用示波器观察CLKOUT输出的时钟信号,就可以在调试时钟系统时实实在在观察时钟输出的情况啦。
    经过一番调试,终于在示波器中输出基础的时钟信号了,分享代码如下。

    由于没有找到配置CLKOUT相关的API,自定义一个配置CLKOUT信号的函数:
    1. /*!
    2. * @brief 定义CLKOUT信号输出时钟源选项
    3. */
    4. typedef enum
    5. {
    6.     eSYSCON_ClkoutSource_IRC12MHz      = 0, /*!< IRC oscillator.    */
    7.     eSYSCON_ClkoutSource_OSC           = 1, /*!< Crystal oscillator (SYSOSC). */
    8.     eSYSCON_ClkoutSource_WatchdogClock = 2, /*!< Watchdog oscillator. */
    9.     eSYSCON_ClkoutSource_MainClock     = 3, /*!< Main clock. */
    10. } SYSCON_ClkoutSource_T;

    11. /*!
    12. * @brief 配置CLKOUT信号输出
    13. *
    14. * CLKOUT信号需要绑定到引脚上才能真正被外部观测设备观察到,因此还需要SWM及IOCON(默认配置)配合使用.
    15. *
    16. * @param source  选择输出时钟源, 参见#SYSCON_ClkoutSource_T.
    17. * @param divider 设定输出时信号的分频值, 有效范围为1-255, 当为0时关闭输出.
    18. */
    19. static inline void Chip_SYSCON_ConfigClkoutOutput(SYSCON_ClkoutSource_T source, uint32_t divider)
    20. {
    21.     LPC_SYSCON->CLKOUTSEL = (uint32_t)source; /* 选定时钟信号源. */
    22.     LPC_SYSCON->CLKOUTDIV = divider; /* 设定输出分频值. */
    23.     /* 在硬件上更新CLKOUT时钟源的设定. */
    24.     LPC_SYSCON->CLKOUTUEN = 0x0;
    25.     LPC_SYSCON->CLKOUTUEN = 0x1;
    26. }
    复制代码

    代码1

    在system_LPC82x.c文件中清空SystemInit()函数。

    1. void SystemInit(void)
    2. {
    3.     /* 启用访问SWM和IOCON模块的时钟。其中:
    4.      * - SWM模块将用于通过引脚接入晶振信号到芯片内部
    5.      * - IOCON模块将用于配置时钟系统
    6.      */
    7.     LPC_SYSCON->SYSAHBCLKCTRL |= ( (1 << 7) |           /* Enables SWM clock          */
    8.                                    (1 << 18) );         /* Enables IOCON clock        */

    9.     /* 配置引脚引入晶振信号 */
    10.     LPC_IOCON->PIO0_8         &= ~(3 <<  3);          /* no pull-down/pull-up       */
    11.     LPC_IOCON->PIO0_9         &= ~(3 <<  3);          /* no pull-down/pull-up       */
    12.     LPC_SWM->PINENABLE0       &= ~(3 <<  6);          /* enable XTALIN/XTALOUT func.*/
    13. }
    复制代码

    代码2

    配置晶振部分的代码可以用于在CLKOUT上观察外部晶振产生的OSC时钟信号。

    然后编写main.c文件如下:
    1. /* main.c */
    2. #include "app_inc.h"
    3. #include "chip_swm_8xx.h"
    4. #include "chip_syscon_8xx.h"
    5. #include "chip_iocon_8xx.h"
    6. #include "chip_clock_8xx.h"

    7. void App_ClkoutOutputMainClock(void);

    8. /*
    9. * 应用程序入口.
    10. */
    11. int main(void)
    12. {
    13.     /* 配置CLKOUT输出Main Clock. */
    14.     App_ClkoutOutputMainClock();

    15.     while (1)
    16.     {
    17.         __NOP();
    18.     }
    19. }

    20. /* 设定CLKOUT在PIO0_6引脚输出主时钟信号. */
    21. void App_ClkoutOutputMainClock(void)
    22. {
    23.     /* 在SWM中配置关联引脚. */
    24.     Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); /* 使用SWM之前启用接口访问时钟. */
    25.     Chip_SWM_DisableFixedPin(SWM_FIXED_ADC1); /* 关闭PIO0_6引脚的模拟信号功能. */
    26.     Chip_SWM_MovablePinAssign(SWM_CLKOUT_O, 6U); /* 将CLKOUT输出信号绑定到PIO0_6引脚上. */
    27.     Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); /* 关闭SWM时钟以省电. */

    28.     /* 配置CLKOUT输出.
    29.      * 设定CLKOUT输出Main Clock, 分频值为1. */
    30.     Chip_SYSCON_ConfigClkoutOutput(eSYSCON_ClkoutSource_MainClock, 1U);
    31. }

    32. /* EOF. */
    复制代码

    代码3


    实际使用的是开发板Analog插座的的A0位,也就是LPC824单片机的PIO0_6引脚。测量时,用示波器探针夹持该引脚。如图2所示。
    LPC824-Lite测试CLKOUT_1.jpg
    图2

    下载程序到开发板,运行程序,观察示波器可以看到振幅大约500mV,频率为12MHz的时钟信号波形。
    LPC824-Lite测试CLKOUT_2.jpg
    图3

    到此为止,已经搭建好了片内时钟的调试环境。

    后续的工作是在SystemInit()函数中调试PLL,参考官方提供的代码把Core Clock搞到LPC824标称上限的30MHz,然后还可以试试看能不能超频。但无论如何,现在得睡觉了。。。


    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-12-30 08:31:42 | 显示全部楼层
    加油                     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-1-8 18:28
  • 签到天数: 93 天

    [LV.6]常住居民II

    3

    主题

    221

    帖子

    0

    高级会员

    Rank: 4

    积分
    508
    最后登录
    2022-1-8
    发表于 2016-12-30 08:53:49 | 显示全部楼层
    加油
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    518
    最后登录
    2019-11-10
    发表于 2016-12-30 09:40:49 | 显示全部楼层
    加油   
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-12-30 15:42:14 | 显示全部楼层
    好样的。加油。不过快过年了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-6-20 16:19
  • 签到天数: 46 天

    [LV.5]常住居民I

    3

    主题

    270

    帖子

    0

    高级会员

    Rank: 4

    积分
    591
    最后登录
    2023-1-9
    发表于 2017-5-8 22:02:54 | 显示全部楼层
    zhanhzna
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 22:02 , Processed in 0.138580 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表