查看: 1355|回复: 1

[原创] [IRD-LPC1768-DEV] #2 BSP 板载LED #

[复制链接]
  • TA的每日心情
    开心
    2020-4-30 21:50
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    9

    主题

    142

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1208
    最后登录
    2023-2-28
    发表于 2019-2-24 20:37:14 | 显示全部楼层 |阅读模式
    接上贴开箱上电加Systick点灯:https://www.nxpic.org.cn/module/forum/thread-616106-1-1.html
    本周开始了通过板载资源的学习来全面了解LPC1768 M3 的各相关外设,为完成开发任务做准备。平时工作比较忙,晚上调试后基本上就没有时间发帖了,周末来加紧发帖把一周的内容补起来,记录下学习过程,请老手指导,感谢!


    先说说本次的开发环境:MDK 5.26 + LPCOPEN2.10。 其实上周大神@原来的你 提到开发板附带了厂家开发资源,基于IAR,个人认真浏览了下,风格比较独特,适应起来需要花点时间。而且开发板申请后, 年前一直在看官方的LPCOPEN 2.10库, 所以后续学习及开发任务的完成都会以LPCOPEN为基础。暂时也不考虑大范围的寄存器直接操作。参考的资料包括官方资料,周立功资料等。


    在开箱帖中,板载LED已经通过Systick 驱动实现显示闪烁功能。但考虑后续RTOS的移植,决定保留系统滴答定时器,采用其他定时器。在学习LPC1768的USER MANUAL时发现,LPC1768除了TIME 0/1/2/3 通用定时器外,额外赠送了一个定时器,叫RIT - 重复中断定时器,该定时器只能用于定时,带有一个中断。这个完全可以用于系统辅助定时延时使用。

    RIT定时器流程如下:
    1.PNG

    本次采用RIT驱动板载LED的函数如下:

    1. /* Initialize RITimer */
    2.         Chip_RIT_Init(LPC_RITIMER);

    3.         /* Configure RIT for a 1s interrupt tick rate */
    4.         Chip_RIT_SetTimerInterval(LPC_RITIMER, TIME_INTERVAL);

    5.         NVIC_EnableIRQ(RITIMER_IRQn);
    复制代码
    其中 Chip_RIT_Init()函数如下:
    1. /* Initialize the RIT */
    2. void Chip_RIT_Init(LPC_RITIMER_T *pRITimer)
    3. {
    4.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_RIT);
    5.         pRITimer->COMPVAL = 0xFFFFFFFF;
    6.         pRITimer->MASK  = 0x00000000;
    7.         pRITimer->CTRL  = 0x0C;
    8.         pRITimer->COUNTER   = 0x00000000;
    9. }
    复制代码
    Chip_RIT_SetTimerInterval()函数用于设置计时时间,函数原型及TIME_INTERVAL宏定义如下:
    1. #define TIME_INTERVAL   (1000)/*毫秒*/

    2. /* Set timer interval value */
    3. void Chip_RIT_SetTimerInterval(LPC_RITIMER_T *pRITimer, uint32_t time_interval)
    4. {
    5.         uint32_t cmp_value;

    6.         /* Determine aapproximate compare value based on clock rate and passed interval */
    7.         cmp_value = (Chip_Clock_GetPeripheralClockRate(SYSCTL_PCLK_RIT) / 1000) * time_interval;

    8.         /* Set timer compare value */
    9.         Chip_RIT_SetCOMPVAL(pRITimer, cmp_value);

    10.         /* Set timer enable clear bit to clear timer to 0 whenever
    11.            counter value equals the contents of RICOMPVAL */
    12.         Chip_RIT_EnableCTRL(pRITimer, RIT_CTRL_ENCLR);
    13. }
    复制代码


    中断函数如下:开始NVIC_EnableIRQ(RITIMER_IRQn)中断后,执行以下RIT中断。


    1. /**
    2. * @brief        RIT interrupt handler
    3. * @return        Nothing
    4. */
    5. void RIT_IRQHandler(void)
    6. {
    7.         /* Clearn interrupt */
    8.         Chip_RIT_ClearInt(LPC_RITIMER);

    9.         /* Toggle LED */
    10.         On = (bool) !On;
    11.         Board_LED_Set(0, On);
    12.         if(On){
    13.                 Board_UARTPutSTR("RIT_IRQHandler, Heartbeat LED On\n");
    14.         }
    15.         else{
    16.                 Board_UARTPutSTR("RIT_IRQHandler, Heartbeat LED Off\n");
    17.         }
    18. }
    复制代码
    编译,下载后执行,HEARTBEAT LED按翻转时间变化,同时串口打印出中断信息并显示LED状态,如下:
    2.PNG

    思考:重新查看了IRD-LPC1768-DEV板的所有LED, 除两个I2C 驱动的芯片附带LED。 系统还有如下USB 状态显示的LED直接连接到了GPIO。
    通过修改接口,用以上代码都可以驱动显示。后续结合USB运用在具体任务需要时实现点亮不同LED.
    (P1.18 - USB CONFIG; P1.22 USB_PWR: P2.9 USB EN_SOFT
    3.PNG

    其他可以驱动的板载LED将在后续具体模块中驱动并提及。

    因使用LPCOPEN 开发系统文件比较大,如有需要的坛友,请直接站短。以上有任何错误请老手指导,谢谢!

    下一步计划UART,其实上面已经实现了串口输出。




    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    6
    最后登录
    2019-12-19
    发表于 2019-12-19 09:22:35 | 显示全部楼层
    您好,问问您,LPC的官方驱动库在NXP官网的什么地方下载的?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 04:25 , Processed in 0.119904 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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