本帖最后由 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 | | | | | | | | | | RTE(run-time environment)driver:芯片GPIO、SPI、UART、I2C、DMA、USB等各芯片上周边设备驱动 | | CMSIS System View Description 系统视图说明,非常详细的芯片信息,包含了哪些片内所有资源及其详细的说明信息,被代码自动生成(如生成RTE_Driver)、调试工具使用(如寄存器调试),相当于给工具软件用的手册。 | | | | 电路板资料、中间件、库、例程、RTOS等,LCD、keyBoard等电路板设备驱动 |
其次, 裸机编程规划: 1) 启动过程:system_LPC17xx.c通常包含SystemInit和SystemCoreClockUpdate, 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。
例程:
Keil uVision MDK- ARM 5.22, 生成新工程,选 lpc1768, Keil.LPC1700_DFP.2.5.0, 从运行时环境添加CMSIS Core、startup、PIN、GPIO组件。
在主程序编制自己的需要如下:使用 SysTick_ 中断 设置 各LED 的标志, main 的 无限循环中 据标志 控制LED亮灭。
- #include "LPC17xx.h"
- #include "PIN_LPC17xx.h"
- #include "GPIO_LPC17xx.h"
- <font size="3" color="#ff0000"><b style="">static uint32_t ticks=0, flag=0;</b></font>
- #define LED_COUNT (4)
- const PIN LED_PIN[] = { //后3个 USB相关,做led 就不要用usb
- {0, 7},
- {1, 18},
- {2, 9},
- {1, 22 },
- };
- int32_t <b><font color="#0000ff">LED_Initialize</font></b> (void) { // led初始化 GPIO
- uint32_t n;
- GPIO_PortClock (1); /* Enable GPIO clock */
- for (n = 0; n < LED_COUNT; n++) { /* Configure pins: Output Mode with Pull-down resistors */
- PIN_Configure (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, PIN_FUNC_0, PIN_PINMODE_PULLDOWN, PIN_PINMODE_NORMAL);
- GPIO_SetDir (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, GPIO_DIR_OUTPUT);
- GPIO_PinWrite (LED_PIN[n].Portnum, LED_PIN[n].Pinnum, 0);
- }
- GPIO_PinWrite (LED_PIN[1].Portnum, LED_PIN[1].Pinnum, 1); // P1.18 led负端, 1灭
- GPIO_PinWrite (LED_PIN[2].Portnum, LED_PIN[2].Pinnum, 1); // P2.9 led负端, 1灭
- return 0;
- }
- /*----------------------------------------------------------------------------
- SysTick IRQ Handler
- *----------------------------------------------------------------------------*/
- void<b> <font color="#0000ff">SysTick_Handler</font></b><font color="#0000ff"> </font>(void) { // 500ms 一个<b><font color="#0000ff">flag</font></b>
- ticks++;
- switch (ticks)
- {
- case 5: flag=1; break;
- case 10: flag=2; break;
- case 15: flag=3; break;
- case 20: flag=0; ticks = 0; break;
- }
- }
- /*----------------------------------------------------------------------------
- Main function 启动startup_LPC17xx.s中 已调用system_LPC17xx.c的SystemInit lpc1768 512K + 64 K
- *----------------------------------------------------------------------------*/
- int <b><font color="#0000ff">main </font></b>(void) {
- SystemCoreClockUpdate (); /* Update system core clock 100MHz */
- LED_Initialize();
- SysTick_Config(SystemCoreClock/10); /* SysTick 中断 each 100 ms */
-
- while (1) {
- switch (flag)
- {
- case 0:
- flag=100; GPIO_PinWrite(0, 7,1); GPIO_PinWrite (1, 22, 0); break; //C3 O0
- case 1:
- flag=100; GPIO_PinWrite (1, 18, 0); GPIO_PinWrite (0, 7, 0); break; //C0 O1 18 0亮
- case 2:
- flag=100; GPIO_PinWrite (2, 9, 0); GPIO_PinWrite (1, 18, 1); break; //C1 O2 9 0亮
- case 3:
- flag=100; GPIO_PinWrite (1, 22, 1); GPIO_PinWrite (2, 9, 1); break; //C2 O3
- default: break;
- }
- }
-
- }
复制代码 代码大小:Program Size: Code=2152 RO-data=244RW-data=12 ZI-data=612
效果视频:
工程代码:
irdlpc1768devbaremetal.zip
(26.51 KB, 下载次数: 3)
|