LPC1788基于KEIL的项目应用开发参考例程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:LPC1788是恩智浦公司基于ARM Cortex-M3内核的微控制器,适合工业控制、汽车电子和消费电子应用。KEIL MDK-ARM开发工具链中包含的“LPC1788 KEIL AIR 参考例程”为开发者提供了一系列示例代码,涵盖了如何配置和使用LPC1788的GPIO、定时器、ADC、UART等外设。这些例程还涉及了KEIL的AIR工具,有助于优化和调试代码。源代码文件如main.c、LPC1788.h、adc.c/h和uart.c/h等,为开发者提供了项目构建和调试的完整流程,以及编写高效C代码的实践。这些资源对初学者和经验丰富的开发者都是宝贵的资产,有助于快速掌握嵌入式系统开发和ARM微控制器设计。

1. LPC1788微控制器概览

LPC1788微控制器简介

LPC1788是NXP公司推出的一款高性能32位ARM Cortex-M3微控制器,广泛应用于工业控制、医疗设备和汽车电子等领域。具备高速处理能力和丰富的外设接口,特别适合于需要高性能与高集成度的应用场合。

核心特性与优势

LPC1788的核心特性包括高达128KB的SRAM、512KB的Flash存储器,以及以太网、USB全速/高速接口、CAN、10位ADC等多种外设。其主要优势在于快速的中断响应、优秀的实时性能,以及强大的处理能力,能够满足绝大多数实时控制系统的需要。

应用场景举例

LPC1788因其高效的性能和丰富的功能,在实时性要求较高的应用中表现突出。例如,在工业自动化领域,LPC1788可以作为控制核心,实现电机控制、传感器数据采集和信号处理等功能。在智能家居和物联网设备中,LPC1788则可以作为智能网关或终端设备的处理器,执行协议转换和数据传输任务。

2. KEIL MDK-ARM开发工具介绍

2.1 KEIL MDK-ARM的安装与配置

2.1.1 KEIL MDK-ARM安装步骤

KEIL MDK-ARM是一种专门为基于ARM处理器的嵌入式系统设计开发的集成开发环境(IDE),它包含了工程管理、源代码编辑、编译器、调试器等强大功能。KEIL MDK-ARM的安装过程相对简单,但需要确保安装步骤正确,以便后续开发工作能够顺利进行。

以下是KEIL MDK-ARM的安装步骤:

  1. 访问KEIL官方网站或者下载链接,下载适用于您的操作系统(Windows,例如)的MDK-ARM安装包。
  2. 执行下载的安装程序(通常是一个.exe文件),开始安装流程。
  3. 在安装向导中,接受许可协议,选择安装路径。
  4. 选择要安装的组件,一般情况下建议安装全部组件,除非您有特定需求。
  5. 点击“安装”按钮,开始安装。
  6. 安装完成后,通常会提示是否立即重启计算机或启动KEIL MDK-ARM。

在安装过程中,如果用户计算机上安装有其他版本的MDK或者KEIL软件,新的安装程序会自动检测并升级已存在的软件包。

2.1.2 环境变量配置与验证

安装完成后,环境变量配置对于KEIL MDK-ARM能够正常工作至关重要。环境变量主要影响命令行工具和可执行文件的搜索路径。

KEIL MDK-ARM通常在安装过程中自动配置环境变量,但用户也可以手动进行配置或修改。以下是Windows系统中配置环境变量的步骤:

  1. 打开“控制面板”,选择“系统”选项。
  2. 在弹出的系统属性窗口中,点击“高级系统设置”。
  3. 在系统属性窗口中,点击“环境变量”按钮。
  4. 在环境变量窗口中,查找是否有名为 UV4 的系统变量,如果没有,点击“新建”按钮添加。
  5. 在新建环境变量窗口中,变量名填写 UV4 ,变量值填写KEIL MDK-ARM安装路径下的 bin 文件夹路径,例如 C:\Keil_v5\ARM\BIN
  6. 点击“确定”保存设置。

为了验证环境变量是否配置正确,可以在命令行窗口(CMD)中输入 uv4 ,如果能够成功启动KEIL MDK-ARM的命令行版本,则表示环境变量配置正确。

2.2 KEIL MDK-ARM的界面和功能解析

2.2.1 项目管理器界面介绍

KEIL MDK-ARM的项目管理器界面是用户进行工程管理的核心区域,其设计让用户可以方便地访问项目文件和配置项目设置。以下是项目管理器界面的主要组成部分及功能:

  • Project Explorer :工程文件的树状浏览视图,方便用户查看和管理源文件、头文件以及资源文件等。
  • Tool Bar :工具栏,提供了快捷方式,包括创建新项目、编译、调试等常用操作。
  • Target Window :目标窗口,用于显示当前项目的配置选项,包括处理器选择、外设配置、调试器设置等。
  • Output Window :输出窗口,用于显示编译和调试过程中的信息,错误和警告信息也会在此列出。

用户在熟悉了各个组件的功能之后,可以更加高效地使用KEIL MDK-ARM进行嵌入式系统开发。

2.3 KEIL MDK-ARM的项目设置与管理

2.3.1 创建新项目与目标配置

创建一个新项目是开始使用KEIL MDK-ARM进行开发的第一步。以下是创建新项目和配置目标的步骤:

  1. 打开KEIL MDK-ARM软件,选择菜单栏中的“Project”->“New uVision Project...”选项,或者使用快捷键 Ctrl+N
  2. 在弹出的“Save Project As”对话框中,选择一个合适的目录用于存放项目,并为项目命名,然后点击“保存”。
  3. 接下来,系统会弹出“Select Device for Target”对话框,用户需要从设备数据库中选择一个目标芯片,即您所使用的LPC1788微控制器。
  4. 选择完毕后,点击“OK”,此时会弹出“Select Software Packs”对话框,用户可以在这里选择需要使用的软件包,通常情况下,KEIL会自动选中与目标芯片相关的软件包。
  5. 点击“OK”完成新项目的创建。
2.3.2 外设配置和编译器设置

创建好项目之后,下一步是对外设进行配置并设置编译器。以下是详细步骤:

  1. 在项目管理器中,选中目标窗口中的“Target 1”,然后点击鼠标右键,选择“Options for Target 'Target 1'...”。
  2. 在弹出的“Options for Target”窗口中,切换到“Target”标签页,在“Target”选项中,可以设置晶振频率(XTAL)等参数。
  3. 切换到“Output”标签页,可以配置编译输出的相关选项,比如是否生成列表文件等。
  4. 切换到“C/C++”标签页,这里可以设置C编译器的优化级别、警告等级等。
  5. 切换到“Debug”标签页,配置调试选项,例如选择使用J-Link、ULINK等调试接口。
  6. 最后,点击“OK”保存设置。

完成以上配置后,您的项目就已经可以编译和调试了。接下来,您可以添加源文件和头文件到项目中,并开始编写LPC1788微控制器的代码。

3. LPC1788基本功能配置示例

在深入LPC1788的高级应用之前,本章节将重点介绍其基本功能的配置方法。这将为之后更复杂的操作打下坚实的基础。我们首先了解如何通过向导快速启动配置,然后深入探讨时钟系统配置和电源管理,这些都是微控制器稳定运行和高效功耗控制的关键。

3.1 LPC1788的启动配置与向导使用

LPC1788微控制器的启动配置包括多个方面,其中最直接的是启动文件的选择。启动文件(Bootloader)通常负责完成硬件初始化和加载操作系统或者应用程序。理解启动配置是深入进行其他功能配置的前提。

3.1.1 启动文件的选择与理解

在嵌入式系统中,启动文件通常被称为Bootloader,它运行在硬件上电之后,负责初始化系统直至操作系统或应用程序的加载。LPC1788的启动文件选择涉及到对硬件启动模式的理解,以及对芯片ROM中预置启动代码的了解。

  • 启动模式 :LPC1788提供多种启动模式,包括从内部Flash、外部存储器、或者USB等启动。根据实际需要,开发者可以将Bootloader烧录在这些不同的启动设备上。
  • Bootloader编写 :如果需要自定义Bootloader,开发者需了解启动代码的编写,包括初始化堆栈、时钟系统、内存、外设等步骤。

3.1.2 向导工具的使用和优势

在实际项目开发中,开发者往往需要面对繁琐的配置过程。为了简化这一过程,现代集成开发环境提供了向导工具。

  • 向导功能 :通过向导,开发者可以快速选择微控制器的配置参数,如时钟设置、存储器映射等,而无需手动修改配置文件。
  • 优势体现 :向导工具不仅降低了初学者的学习成本,同时还能通过图形化界面提高配置效率,减少出错的可能性。

3.2 LPC1788的时钟系统配置

时钟系统是微控制器的心脏,合理配置时钟系统对提高性能和降低功耗至关重要。LPC1788的时钟系统灵活且功能强大,包括时钟源选择、分频器设置和PLL(Phase-Locked Loop)配置。

3.2.1 时钟源与分频器设置

LPC1788的时钟源包括内部RC振荡器、外部晶振、以及PLL。正确配置时钟源是保证系统稳定运行的前提。

  • 内部和外部时钟源 :通常情况下,为了保证较高的时钟精度,会选用外部晶振。当对精度要求不高时,内部RC振荡器是一个简单有效的选择。
  • 分频器 :分频器的作用是将时钟源的频率降低至适合系统运行的水平。合理设置分频器可以有效控制功耗。

3.2.2 PLL配置与优化

PLL用于生成高于原始时钟源频率的时钟信号。合理配置PLL对于获取更高速度的处理能力至关重要。

  • 配置原则 :PLL的配置涉及到对其输出频率、反馈分频器、以及预分频器的设置。开发者必须根据系统需求和晶振频率来确定这些参数。
  • 优化策略 :在配置PLL时,需要考虑功耗与性能之间的平衡。过高的时钟频率虽然能够提升性能,但也可能带来更高的功耗和温度。

3.3 LPC1788的电源管理和睡眠模式

电源管理是嵌入式系统设计中的重要部分,合理管理电源能够有效延长设备寿命、降低能耗。LPC1788提供了灵活的电源管理功能,包括多种睡眠模式和电源优化技术。

3.3.1 电源优化技术

电源优化技术能够有效降低系统在非活动状态下的功耗,这对于便携式设备和长期运行的系统尤其重要。

  • 省电模式 :LPC1788支持多种省电模式,包括等待模式、深度睡眠模式等。在这些模式下,通过关闭或降低某些外设和时钟的电源,可以大幅度降低功耗。
  • 动态电压调节 :这是另一种电源优化技术,通过动态调整处理器的工作电压和频率来降低功耗。

3.3.2 睡眠模式配置与唤醒机制

合理配置睡眠模式,并设置有效的唤醒机制,是保证系统能够快速响应并恢复工作的关键。

  • 睡眠模式配置 :开发者需要根据不同的应用场景来选择合适的睡眠模式。不同的睡眠模式在省电和唤醒速度方面有不同的特点。
  • 唤醒机制 :系统可以通过多种方式从睡眠模式中唤醒,包括外部中断、定时器到期等。合理的唤醒机制能够确保系统在正确的时间以最快的速度恢复运行。

在后续章节中,我们将进一步探讨如何通过代码和工具来实践这些理论知识,让LPC1788微控制器的功能得到充分利用。接下来,我们将进入外设应用章节,从GPIO、定时器、ADC、UART等外设的配置和应用开始。

4. GPIO、定时器、ADC、UART外设应用

在嵌入式开发中,外设的应用是实现功能的关键步骤。本章节将深入探讨LPC1788微控制器中常用外设的应用,如GPIO、定时器、ADC以及UART,并分析如何实现这些外设的基础与高级功能。

4.1 LPC1788外设基础操作

4.1.1 GPIO的输入输出控制

GPIO(General Purpose Input/Output,通用输入输出)端口是微控制器与外部世界进行交互的基本接口。LPC1788提供了多组GPIO端口,可以配置为输入、输出或特殊功能。

GPIO初始化代码示例:

#include "LPC17xx.h"

// 配置P0.0为输出
void GPIO_Configuration(void)
{
    LPC_PINCON->PINSEL0 &= ~(3 << (0 * 2)); // 清除P0.0的PINSEL值,设置为GPIO功能
    LPC_GPIO0->FIODIR |= (1 << 0);          // 设置方向为输出
}

int main(void)
{
    GPIO_Configuration(); // 调用配置函数
    while(1)
    {
        LPC_GPIO0->FIOSET = (1 << 0); // 输出高电平
        // 延时函数,此处省略具体实现
        LPC_GPIO0->FIOCLR = (1 << 0); // 输出低电平
        // 延时函数,此处省略具体实现
    }
}

在上述代码中,我们首先配置了LPC1788的P0.0引脚,将其设定为输出模式。通过使用 FIOSET FIOCLR 寄存器,我们可以控制该引脚输出高电平或低电平。适当的延时函数确保了电平变化的可观察性。

4.1.2 定时器的初始化与中断配置

定时器是用于产生定时事件或计数功能的外设。LPC1788具有多个定时器,每个都可以用于不同的目的。

定时器初始化与中断配置代码示例:

#include "LPC17xx.h"

void Timer0_Init(void)
{
    LPC_TIM0->CTCR = 0;                     // 设置为定时器模式
    LPC_TIM0->PR  = 0x01;                  // 设置预分频值,定时器时钟 = PCLK / (PR + 1)
    LPC_TIM0->TCR = 1;                      // 启动定时器计数

    // 中断使能
    LPC_TIM0->MCR |= (1 << 0);             // 0位: 匹配0中断使能
    LPC_TIM0->IR  |= (1 << 0);             // 清除中断标志
    LPC_TIM0->TCR |= (1 << 2);             // 使能中断触发
    NVIC_EnableIRQ(TIMER0_IRQn);           // 使能中断线
}

// 定时器0中断服务函数
void TIMER0_IRQHandler(void)
{
    if(LPC_TIM0->IR & (1 << 0))           // 检查是否为匹配0中断
    {
        LPC_TIM0->IR |= (1 << 0);          // 清除中断标志
        // 用户代码:定时器中断触发的处理逻辑
    }
}

在这里,我们配置了定时器0,并使其在匹配0时触发中断。首先,我们设置了定时器的工作模式并配置了预分频器。然后,我们启用了匹配中断,并在中断服务函数中添加了中断处理逻辑。

4.2 LPC1788外设高级应用

4.2.1 ADC的采样与转换实例

LPC1788的ADC允许微控制器对模拟信号进行数字化。这对于需要传感器输入和模拟信号处理的应用非常有用。

ADC采样与转换代码示例:

#include "LPC17xx.h"

void ADC_Init(void)
{
    LPC_PINCON->PINSEL1 |= (1 << 10);       // 配置P0.3为ADC0.2功能
    LPC_ADC->CR = 0x***;              // 启动ADC,设置ADC时钟
    LPC_ADC->CR |= (1 << 6);               // 启用DMA请求
}

void ADC_ReadData(void)
{
    if((LPC_ADC->GDR & (1 << 24)) == 0)    // 检查数据有效位
    {
        uint32_t adc_value = LPC_ADC->DR[2]; // 读取ADC0.2通道的值
        // ADC值处理逻辑
    }
}

int main(void)
{
    ADC_Init();                            // 初始化ADC
    while(1)
    {
        ADC_ReadData();                    // 定期读取ADC值
        // 延时函数,此处省略具体实现
    }
}

在初始化ADC时,我们首先配置了相关引脚,并启动了ADC模块。ADC数据寄存器 DR 用于存储从ADC通道读取的值,通过检查数据有效位位可以确保读取到有效的数据。

4.3 LPC1788外设的扩展应用

4.3.1 以太网控制器的配置与使用

以太网控制器为LPC1788提供了网络通信的能力。通过它,可以实现微控制器与网络之间的数据交换。

以太网控制器初始化代码示例:

#include "LPC17xx.h"

void EMAC_Init(void)
{
    // 此处省略EMAC初始化代码,包括网络接口的配置、MAC地址的设置等。
}

int main(void)
{
    EMAC_Init();                            // 初始化以太网控制器
    // 主循环中包含网络数据处理和发送代码,此处省略。
}

初始化以太网控制器需要设置MAC地址、配置网络接口以及可能的中断处理逻辑,以实现网络数据的接收和发送。

4.3.2 USB设备的配置与通信

USB接口是LPC1788支持的另一个重要接口,可以实现与PC或其他USB设备的通信。

USB设备初始化代码示例:

#include "LPC17xx.h"

void USB_Init(void)
{
    // 此处省略USB设备初始化代码,包括USB设备枚举和中断配置。
}

int main(void)
{
    USB_Init();                             // 初始化USB设备
    // 主循环中包含USB事件处理代码,此处省略。
}

配置USB设备涉及USB枚举过程,即设备与主机的连接过程,以及处理USB事件的中断服务函数。

通过本章节的内容,我们学习了如何对LPC1788微控制器的GPIO、定时器、ADC、UART等外设进行基础操作和高级应用的配置与使用。在下一章节中,我们将讨论如何使用KEIL AIR工具进行在线仿真调试和性能优化。

5. KEIL AIR工具的功能和优势

5.1 KEIL AIR的工作原理与特点

KEIL AIR是针对ARM架构的微控制器编程和调试的集成开发环境(IDE)。它是KEIL MDK-ARM的扩展组件,用于提供强大的在线仿真调试功能。本节将深入探讨KEIL AIR的工作原理,并分析其特点。

5.1.1 在线仿真调试的优势

在线仿真调试允许开发者在实际硬件上进行程序调试,而不必担心可能对硬件造成的损害。KEIL AIR提供对目标设备的完全控制,开发者可以在程序的任何时刻停止执行,检查变量和寄存器的状态,以及进行内存查看和修改。

在线调试的优势在于:

  • 实时性:开发者可以实时监控程序运行状态,随时中断程序来查看和分析。
  • 交互性:调试过程中,开发者可以与程序进行实时交互,例如设置断点、单步执行、修改寄存器和内存值。
  • 精确性:能够精确地定位程序中的问题,减少排查错误所需的时间。

5.1.2 软件断点与硬件断点的区别

KEIL AIR支持两种断点类型:软件断点和硬件断点。

  • 软件断点:利用目标设备的调试接口来实现的,当程序执行到断点地址时,会触发调试事件。软件断点易于设置,但当断点处的代码被写入到闪存时,软件断点会失效。
  • 硬件断点:不依赖于代码内容,而是通过调试器的硬件功能来实现。通常,硬件断点数量有限,但不受代码是否写入到闪存的影响。

5.2 KEIL AIR的应用实例与分析

5.2.1 实时跟踪和性能监控

KEIL AIR在程序调试时,可以进行实时跟踪和性能监控。这些功能对于了解程序的执行情况非常有用。

  • 实时跟踪:在代码执行过程中,开发者可以看到每条指令的执行情况,包括寄存器的值和程序的流程。
  • 性能监控:KEIL AIR提供性能分析工具,可以收集程序执行的统计信息,如执行时间、调用次数等,帮助开发者优化程序性能。

5.2.2 代码覆盖率分析与优化

代码覆盖率分析是KEIL AIR提供的重要功能,它可以评估测试用例的有效性,并帮助开发者识别未覆盖到的代码部分。

  • 代码覆盖率分析:通过执行测试用例,KEIL AIR能够追踪哪些代码被执行过,哪些没有。这有助于开发者评估测试的质量,并找到可能的遗漏。
  • 优化建议:基于覆盖率分析的结果,KEIL AIR能够给出优化建议,提示开发者修改测试用例或者调整代码结构。

代码覆盖率分析对于嵌入式系统开发者来说,是确保产品质量的重要手段,它可以显著提升软件的可靠性和稳定性。

代码覆盖率分析的Mermaid图表示例:

graph LR
A[开始覆盖率分析] --> B[执行测试用例]
B --> C{是否有未覆盖代码}
C -- 是 --> D[修改测试用例]
C -- 否 --> E[分析报告完成]
D --> B
E --> F[优化建议]

该流程图展示了代码覆盖率分析的基本步骤,并使用了Mermaid格式,以直观的方式展示了分析的过程。KEIL AIR通过这种分析,确保开发人员能够持续地提升代码质量,为最终用户交付高质量的嵌入式产品。

在第五章中,我们介绍了KEIL AIR工具的功能和优势,它不仅为开发者提供了强大的调试工具,还通过实时跟踪和性能监控确保了程序的高效运行。通过代码覆盖率分析,KEIL AIR帮助开发者优化代码质量,从而提升整个项目的品质。

6. 项目构建和调试的流程

6.1 LPC1788项目的搭建与编译

在微控制器项目开发中,项目的搭建和编译是至关重要的一步。LPC1788项目的搭建不仅仅是简单地将源文件组织在一起,更需要考虑到整个项目的结构和编译器的配置。

6.1.1 项目结构和源文件管理

LPC1788项目的结构应该清晰地反映出其功能和模块划分。一个典型的项目结构可能包含以下文件夹:

  • src :存放源代码文件(.c 和 .cpp)。
  • inc :存放头文件(.h 和 .hpp)。
  • lib :存放库文件,可能是第三方库或是之前编译好的静态库。
  • bin :存放生成的二进制文件。
  • doc :存放相关文档。

在KEIL MDK-ARM中,可以使用项目管理器来管理文件。从"Project"菜单中选择"Add New Item to Group..."来添加新的文件,或使用右键菜单中的"Add Existing Item to Group..."来添加已存在的文件。

6.1.2 编译器选项和错误调试

在KEIL中,编译器的设置和选项对编译过程有着决定性的影响。右键点击项目名称选择"Options for Target",在这里可以设置包括编译器优化级别、调试信息的生成、预处理器定义等多种编译选项。

编译错误和警告是开发过程中的重要反馈,它们可以帮助开发者发现代码中的问题。例如,如果编译器报告了一个未定义的符号,开发者应检查是否正确包含了相应的头文件。

6.2 LPC1788的调试技巧与策略

在项目编译无误后,接下来就需要通过调试器来逐步检查程序的运行情况,确保其按预期执行。

6.2.1 常用的调试命令和快捷操作

在KEIL中,调试器提供了一套丰富的命令和快捷键来帮助开发者高效地进行调试。例如,使用"F5"可以开始调试会话,"F10"和"F11"分别用于单步执行和单步进入函数内部。开发者可以使用"Breakpoint"对话框来设置和管理断点。

6.2.2 调试过程中的常见问题及其解决方案

在调试过程中,开发者可能会遇到程序运行异常或卡死的情况。此时,可以利用KEIL的分析工具,例如逻辑分析仪或性能分析器,来捕获运行时数据。此外,开发者还可以检查是否有外设配置错误、中断优先级设置不当或内存访问违规等问题。

6.3 LPC1788的性能优化与问题定位

性能优化和问题定位是将项目从开发阶段推向生产阶段的重要步骤。

6.3.1 性能瓶颈的诊断方法

性能瓶颈往往可以通过性能分析工具来诊断。KEIL提供了性能分析器,可以帮助开发者找到程序中最耗时的函数。使用这些工具可以有效识别出需要优化的代码部分。

6.3.2 系统稳定性和资源使用的优化技巧

系统稳定性的提升和资源使用的优化往往涉及到代码结构的优化、算法的选择和优化、以及内存和处理器资源的有效管理。开发者需要使用系统监控工具来跟踪资源使用情况,比如CPU占用率、内存分配和外设状态等。

性能优化是一个持续的过程,需要开发者不断测试、分析并调整代码。通过上述步骤,开发者可以确保LPC1788项目能够在性能和稳定性方面达到理想的水平。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:LPC1788是恩智浦公司基于ARM Cortex-M3内核的微控制器,适合工业控制、汽车电子和消费电子应用。KEIL MDK-ARM开发工具链中包含的“LPC1788 KEIL AIR 参考例程”为开发者提供了一系列示例代码,涵盖了如何配置和使用LPC1788的GPIO、定时器、ADC、UART等外设。这些例程还涉及了KEIL的AIR工具,有助于优化和调试代码。源代码文件如main.c、LPC1788.h、adc.c/h和uart.c/h等,为开发者提供了项目构建和调试的完整流程,以及编写高效C代码的实践。这些资源对初学者和经验丰富的开发者都是宝贵的资产,有助于快速掌握嵌入式系统开发和ARM微控制器设计。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值