根据给定文件的信息,我们可以提炼出以下几个重要的知识点:
### 1. 空的 `main()` 函数
在嵌入式系统开发中,`main()` 函数是程序的入口点。一个空的 `main()` 函数通常指的是一个不执行任何实际操作的 `main()` 函数。这种函数的主要目的是作为最小化程序的基础,便于测试硬件和编译环境是否配置正确。
#### 示例代码
```c
int main(void) {
return (0);
}
```
在嵌入式系统中,`main()` 函数通常不允许返回,因为一旦返回可能会导致程序异常或挂起。因此,实际的 `main()` 函数通常会是一个无限循环,如下所示:
```c
int main(void) {
for (;;) {
// 主程序循环体
}
}
```
### 2. 实用工程模板
为了快速启动嵌入式项目开发,开发者经常使用预先构建的工程模板。这些模板包含了基本的设置和结构,可以极大地简化开发过程。例如,给定文件中的“Demo”工程模板就提供了这样的基础。
#### 工程文件结构
- **main.c** 文件包含了程序的主入口点,其中包含了初始化函数的调用以及主循环。
- **systemInit.h** 文件定义了系统初始化所需的宏定义和函数声明。
- **systemInit.c** 文件实现了系统初始化功能,包括时钟初始化等。
#### 示例代码
**main.c**
```c
#include "systemInit.h"
int main(void) {
jtagWait(); // 防止 JTAG 失效
clockInit(); // 时钟初始化
for (;;) { // 主循环
}
}
```
**systemInit.h**
```c
#ifndef __SYSTEM_INIT_H__
#define __SYSTEM_INIT_H__
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_ints.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>
// 宏定义
#define SysCtlPeriEnable SysCtlPeripheralEnable
// ... 其他宏定义 ...
// 函数声明
extern unsigned long TheSysClock;
extern void jtagWait(void);
extern void clockInit(void);
#endif // __SYSTEM_INIT_H__
```
**systemInit.c**
```c
#include "systemInit.h"
unsigned long TheSysClock = 12; // 系统时钟变量
// ... 其他函数实现 ...
```
### 3. LED 闪烁发光
在嵌入式开发中,通过控制 LED 的亮灭来验证硬件连接和软件控制是最常见的调试方法之一。这通常涉及到对 GPIO(General Purpose Input Output,通用输入输出)端口的操作。
#### 示例代码
```c
// 初始化 LED 相关的 GPIO
void ledInit(void) {
// 设置 GPIO 为输出模式
GPIOPinTypeOut(GPIO_PORTX_BASE, GPIO_PINX);
}
// 使能/禁止 LED
void ledToggle(void) {
// 切换 LED 的状态
GPIOPinWrite(GPIO_PORTX_BASE, GPIO_PINX, GPIO_PINX);
}
```
### 4. 输出 "Hello World"
在嵌入式系统中,输出 "Hello World" 不仅是为了展示程序的基本输出能力,也是为了测试串行通信接口 UART 是否正常工作。
#### 示例代码
```c
// UART 初始化
void uartInit(void) {
// 设置 UART 相关的 GPIO 和波特率
}
// 输出 "Hello World"
void printHelloWorld(void) {
char *helloWorld = "Hello World\n";
UARTCharPut(UART0_BASE, helloWorld);
}
```
### 5. UART 控制台
UART (Universal Asynchronous Receiver/Transmitter) 是一种常用的串行通信接口。通过 UART 可以实现与外部设备的数据交换,比如连接计算机终端进行命令交互。
#### 示例代码
```c
// UART 初始化
void uartInit(void) {
// 设置 UART 相关的 GPIO 和波特率
// 使能 UART
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOX);
SysCtlPeriEnable(SYSCTL_PERIPH_UARTX);
// 配置 GPIO 为 UART 模式
GPIOPinConfigure(GPIO_PFAX_U0RX);
GPIOPinConfigure(GPIO_PFAX_U0TX);
GPIOPinTypeUART(GPIO_PORTX_BASE, GPIO_PINX | GPIO_PINX);
// 配置 UART
UARTConfigSetExpClk(UART0_BASE, TheSysClock, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}
// 接收字符
char uartGetch(void) {
return UARTCharGetNonBlocking(UART0_BASE);
}
// 发送字符串
void uartPutch(char *str) {
while (*str) {
UARTCharPut(UART0_BASE, *str++);
}
}
```
通过这些基本的例程,我们可以了解到 ARM 嵌入式开发的一些基础概念和技术要点,包括如何编写空的 `main()` 函数、如何使用工程模板、如何控制 LED、如何实现 UART 通信等。这些知识点对于初学者来说是非常宝贵的资源,可以帮助他们更快地上手 ARM 开发。