查看: 4709|回复: 1

[原创] IRDLPC1768 从裸机(bare metal)到RTOS A -- 1

[复制链接]
回帖奖励 100 NXP金币 回复本帖可获得 1 NXP金币奖励! 每人限 1 次
  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5669
    最后登录
    2021-12-22
    发表于 2019-3-16 17:10:04 | 显示全部楼层 |阅读模式
    本帖最后由 okwh 于 2019-3-23 15:33 编辑

    裸机(bare metal)RTOS   A       本篇介绍裸机编程
    1   嵌入软件的功能用途:
    MCU/MPU中运行,基于其指令系统、地址内存配置和中断、DMA机制,通过紧密直接周边设备(如时钟、直接IO、开关、数字信号、模拟信号、各UART/I2C/I2S/SPI/CAN/ETH/USB/Vedio/Audio/keyboard/接口 )进行控制、信号产生与信号测量、响应(各种事件如按键触发、通讯、数据处理等)处理工作,基于工作的大致紧迫性如立即响应无延迟(us)、近实时响应(ms)、非实时(秒级及更慢),选用用相应响应处理方式(参考:PC机时间片大约为10 ~ 50ms左右)。

    2    通常处理流程:
    开机准备期初始化;  
    运行时条件(如中断、各种标志)对应的响应处理;
    事后处理或序列后续事务的引发。
    核心:事务分类、状态分类、资源分配与使用冲突管理。

    3   裸机软件构成设计:
    首先:  通常芯片厂家提供的芯片编程资源主要是启动代码、设备驱动,对keil uVision MDK, 可在http://www.keil.com/dd2/下载或PackInstaller连线安装Keil.LPC1700_DFP.2.5.0.pack:

      
    Device Family Pack
      
    Keil.LPC1700_DFP.2.5.0.pack
      
    C:\Keil\ARM\Pack\Keil\LPC1700_DFP\2.5.0
    Device
    启动代码startup code
    Debug
    调试支持debugger support
    Documents
    芯片资料、手册
    Flash
    编程器下载代码用编程算法
    RTE_Driver
    RTErun-time  environmentdriver:芯片GPIOSPIUARTI2CDMAUSB等各芯片上周边设备驱动
    SVD
    CMSIS System View Description 系统视图说明,非常详细的芯片信息,包含了哪些片内所有资源及其详细的说明信息,被代码自动生成(如生成RTE_Driver)、调试工具使用(如寄存器调试),相当于给工具软件用的手册。
    Keil.LPC1700_DFP.pdsc
    Package description file
    Boards
    电路板资料、中间件、库、例程、RTOS等,LCDkeyBoard等电路板设备驱动


    其次, 裸机编程规划:
    1) 启动过程:system_LPC17xx.c通常包含SystemInitSystemCoreClockUpdate
    startup_LPC17xx.s,通常包含Heap_Size、Stack_Size设置,中断向量表,调用SystemInit初始化系统,然后跳转到用户的main函数;
    2)用户程序入口:
    main函数: 调用SystemCoreClockUpdate完成时钟设置,然后调用电路板设计厂家提供的设备初始化,或结合驱动,根据电路自行配置内存、IO端口、其他用到设备的初始化。最后在一无限(超级、死)循环中,基于自行设计的各种条件标志,调用相应的应对处理函数。
    3)中断响应:
    依中断向量表,设计编制需要的中断响应函数。通常在中断响应函数完成即时响应处理,需要时设置后续处理条件标志。
    4)各种要用到被调用的函数。
    5)注意事项:
    内存占用与分配,小心避免中断响应和其他函数中对同一变量的使用冲突,Heap_Size、Stack_Size设置,状态分析以处理可能的错误源。

    调试方法:  通常采用调试器编译器提供的单步、断点、附加方法如串口、如J-Link支持的RTT Viewer/CMSIS-DAP支持的Event Recoder


    4   例程:裸机编程模式- 4LED 序列明灭
      IRD-LPC1768-DEV  可直接IO操作的led 有4个, 其中3个用于有个USB指示,这里先不用USB, 仅直接控制LED。
      
    led编号
      
    PIN
    逻辑
    说明书用途
    0
    P0.7
    1 0
    heartneat
    1
    P1.18
    0 1
    USB CONFIG UP
    2
    P2.9
    0 1
    USB EN_SOFT usb connect
    3
    P1.22
    1 0
    USB_PWR


    例程:
    Keil uVision MDK- ARM 5.22,  生成新工程,选 lpc1768, Keil.LPC1700_DFP.2.5.0, 从运行时环境添加CMSIS Core、startup、PIN、GPIO组件。


    0101.png

    0102.png

    在主程序编制自己的需要如下:使用 SysTick_ 中断 设置 各LED 的标志, main 的 无限循环中 据标志 控制LED亮灭。

    1. #include "LPC17xx.h"                  
    2. #include "PIN_LPC17xx.h"
    3. #include "GPIO_LPC17xx.h"

    4. <font size="3" color="#ff0000"><b style="">static uint32_t ticks=0, flag=0;</b></font>

    5. #define LED_COUNT (4)
    6. const PIN LED_PIN[] = {     //后3个 USB相关,做led  就不要用usb
    7.   {0, 7},
    8.   {1, 18},
    9.   {2, 9},
    10.   {1, 22 },
    11. };
    12. int32_t <b><font color="#0000ff">LED_Initialize</font></b> (void) {       // led初始化  GPIO
    13.   uint32_t n;
    14.   GPIO_PortClock     (1);          /* Enable GPIO clock */
    15.   for (n = 0; n < LED_COUNT; n++) {              /* Configure pins: Output Mode with Pull-down resistors */
    16.     PIN_Configure (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, PIN_FUNC_0, PIN_PINMODE_PULLDOWN, PIN_PINMODE_NORMAL);
    17.     GPIO_SetDir   (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, GPIO_DIR_OUTPUT);
    18.     GPIO_PinWrite (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, 0);
    19.   }
    20.   GPIO_PinWrite (LED_PIN[1].Portnum, LED_PIN[1].Pinnum, 1);  // P1.18 led负端, 1灭
    21.         GPIO_PinWrite (LED_PIN[2].Portnum, LED_PIN[2].Pinnum, 1);  // P2.9 led负端, 1灭
    22.   return 0;
    23. }
    24. /*----------------------------------------------------------------------------
    25.   SysTick IRQ Handler
    26. *----------------------------------------------------------------------------*/
    27. void<b> <font color="#0000ff">SysTick_Handler</font></b><font color="#0000ff"> </font>(void) {       // 500ms  一个<b><font color="#0000ff">flag</font></b>
    28.   ticks++;
    29.         switch (ticks)
    30.                 {
    31.                         case  5:    flag=1;  break;
    32.                         case  10:   flag=2;  break;
    33.                         case  15:   flag=3;  break;
    34.                         case  20:   flag=0; ticks = 0; break;
    35.                 }                                                                             
    36. }

    37. /*----------------------------------------------------------------------------
    38.   Main function    启动startup_LPC17xx.s中 已调用system_LPC17xx.c的SystemInit    lpc1768 512K + 64 K
    39. *----------------------------------------------------------------------------*/
    40. int <b><font color="#0000ff">main </font></b>(void) {
    41.   SystemCoreClockUpdate ();                 /* Update system core clock    100MHz   */  
    42.   LED_Initialize();
    43.   SysTick_Config(SystemCoreClock/10);      /* SysTick 中断 each 100 ms  */
    44.         
    45.   while (1) {
    46.                 switch (flag)
    47.                 {
    48.     case  0:   
    49.                         flag=100;          GPIO_PinWrite(0, 7,1);     GPIO_PinWrite (1, 22, 0);   break;           //C3 O0
    50.     case  1:
    51.                         flag=100;          GPIO_PinWrite (1, 18, 0);  GPIO_PinWrite (0, 7, 0);    break;           //C0 O1     18 0亮
    52.     case  2:
    53.                         flag=100;          GPIO_PinWrite (2, 9, 0);   GPIO_PinWrite (1, 18, 1);   break;          //C1 O2      9  0亮
    54.     case  3:
    55.                         flag=100;          GPIO_PinWrite (1, 22, 1);  GPIO_PinWrite (2, 9, 1);   break;         //C2 O3
    56.     default:  break;
    57.     }
    58.   }
    59.          
    60. }
    复制代码
    代码大小:
    Program Size: Code=2152 RO-data=244RW-data=12 ZI-data=612


    效果视频:


    工程代码:   irdlpc1768devbaremetal.zip (26.51 KB, 下载次数: 3)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5669
    最后登录
    2021-12-22
     楼主| 发表于 2019-3-23 15:34:14 | 显示全部楼层
    论坛不活跃, 回帖奖励!!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-10-29 13:20 , Processed in 0.083544 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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