admin管理员组

文章数量:1530051

02.TMS570LC43入门指南——点亮LED

文章目录

  • 02.TMS570LC43入门指南——点亮LED
    • 一、简介
    • 二、资源下载
    • 三、建立工程项目
      • 3.1 CCS 项目的建立
      • 3.2 HALCoGen 项目的建立
    • 四、项目实现
      • 4.1 硬件部分
      • 4.2 软件部分
        • 4.2.1 HALCoGen 配置
        • 4.2.2 CCS 配置
    • 五、寄存器使用
      • 5.1 GIO 初始化
        • 5.1.1 寄存器概述
          • 5.1.1.1 GIO 全局控制器(GIOGCR0)
          • 5.1.1.2 GIO 数据方向寄存器(GIODIR[A-B])
          • 5.1.1.3 GIO 数据输出寄存器(GIODOUT[A-B])
          • 5.1.1.4 GIO 开漏寄存器(GIOPDR[A-B])
          • 5.1.1.5 GIO 上下拉使能寄存器(GIOPULDS[A-B])
          • 5.1.1.6 GIO 上下拉选择寄存器(GIOPSL[A-B])
        • 5.1.2 编写函数
      • 5.2 寄存器操作重要性
    • 六、写在最后

一、简介

学习一款开发板,入门都是从点灯开始的,那么通过这篇文章,我们将学习如何优雅地点亮LED。

那么首先,我们需要了解,通过这篇文章你能学到什么?以下是本文主要想阐述的内容:

  • 了解开发板的相关资料

  • HALCoGen 项目建立以及 GIO 外设的使用

  • CCS 项目的建立以及 LED 代码的编写

  • 探索背后的寄存器操作

我们之所以要讲 寄存器,是因为对于 TMS570LC43 而言,虽然我们可以通过 HALCoGen 生成相关的 HAL 库代码,但大多数操作,我们仍然需要使用寄存器对外设进行操作。这里的话,最好在电脑上安装一个翻译软件,这里我选择的是 网易有道翻译_官方下载网站 (youdao),可以帮助我们更顺利地阅读文档。

另外,更希望各位初入嵌入式的读者能够掌握快速入门一款开发板的思路,无论是对以后的工作、学习生活中都能带来很大的帮助。


二、资源下载

对于任何一款开发板而言,我们都需要了解其”三件套“——原理图、技术手册、数据手册。当然,一个合格的嵌入式软件工程师只了解这三样肯定是不够的,但就日常开发而言,基本足够。对于 PCB 以及其他信息感兴趣,可以自行前往官方网站进行下载,这里给出相应链接:LAUNCHXL2-570LC43 开发套件 | TI。

而我们着重讲的,是常用开发”三件套“:

  • 开发板原理图:TMS570LC43x and RM57Lx LaunchPad Schematic

  • 数据手册:ti/lit/ds/spns195c/spns195c.pdf

  • 技术手册:ti/lit/ug/spnu563a/spnu563a.pdf

大家可以自行通过以上链接进行下载。后续在学习实验的过程中,我们会经常用到它们。大家可以仔细阅读。

如果点击跳转没反应,可以复制以下链接到浏览器进行访问:

  • 开发板原理图:https://www.ti/lit/df/sprr397/sprr397.pdf

  • 数据手册:https://www.ti/lit/ds/spns195c/spns195c.pdf

  • 技术手册:https://www.ti/lit/ug/spnu563a/spnu563a.pdf


三、建立工程项目

在这部分内容中,我们将通过 HALCoGenCCS 进行项目工程的建立。后续开发过程中将不再赘述该流程。

3.1 CCS 项目的建立

  1. 我们打开 CCS,首次进入会让我们创建一个工作环境,随意即可,最好放在一个你找的到的地方,另外,文件路径不要包含中文。然后我们点击 Launch 即可。

  2. 进入 CCS 后,我们依次点击 File -> New -> CCS Project,如下所示:

  1. 然后我们新建一个 TMS570LC43 的空工程文件,依次按照图中所示进行选择,我这里命名工程项目名为 TMS_01_FristTest,读者可以更具自身喜好进行修改。

  2. 等待生成完成,其目录结构如下所示:

至此,我们已经建立完 CCS 项目的部分。接下来我们建立 HALCoGen 工程部分。

3.2 HALCoGen 项目的建立

  1. 我们打开 HALCoGen 软件,依次点击 File -> New -> Project,如下所示:

  2. 接下来,找到我们使用的芯片 TMS570LC43,并将项目对应到我们之前建立 CCS 项目的文件中,其文件名可以随意,我建议在文件名后加后缀 _Gen 用于区分文件目录,如下所示:

  3. 等待其生成配置后,如下所示,视为建立成功:

  4. 同时,我们在 CCS 项目结构中也能看到我们生成的对应文件:

在本文第三章结束后,我们建立了 CCS 以及 HALCoGen 项目文件,但尚未生成代码,后续章节会提到。


四、项目实现

4.1 硬件部分

我们本文需要点亮 LED,首先我们需要了解其硬件组成,打开之前下载好的原理图,可以看到在 P10 有:

通过对原理图的认识,我们可以看到开发板上给我们预留了两个 LED。我们以 LED2 为例,其一段连接MCU的 GIOB_6,另一端接地,那我们如果想点亮它就需要拉高 GIOB_6 脚。
其在开发板上的位置如下所示:

4.2 软件部分

4.2.1 HALCoGen 配置

通过上述分析,我们已经可以确定使用 GIOB_6 来控制 LED,那么我们如何生成相应代码呢?以下我们将进行步骤讲解:

  1. 使能 GIO 外设

    • 对于操作任何外设,我们都需要对其进行使能操作。但是默认生成的 HALCoGen 工程是使能了所有外设的,这就需要我们先对其进行禁止操作。

    • 我们点击 TMS570LC4357ZWT -> Driver Enable

    • 点击 Mark/Unmark all drivers 后可以看到所有的勾都没了,这时候我们再点击 Enable GIO driver

  2. 点击 GIO 进行配置

    • 由于我们之前已经得出结论,需要初始化 GIOB_6 脚,故我们依次点击 GIO -> Port B,找到 Bit 6,将 DOUT1,然后将 DIR 勾选,如下所示:
  3. 生成 HAL 文件

    • 点击 File -> Generate Code 或者按 F5

  4. 查看 Output 信息

    • 当看到显示 Code omplete 则表示生成完成。

4.2.2 CCS 配置

根据以上步骤,我们完成了代码的生成,此时我们可以在 CCS 中看到文件目录结构:

其中多了 includesource 文件,这两个分别是头文件和代码文件,后续我们会进行使用。

  1. 首先需要配置 include 文件的路径,否则会出现编译出错的情况。

    • 我们在 CCS 项目名上 右键 -> Properties,在弹出的窗口中依次点击 Build -> Arm Compiler -> Include Options,按照下图所示进行操作:

    • 在弹出的界面中找到 HALCoGen 生成的 include 文件,直接将整个 include 文件添加到路径中:

    • 依次点击 ok,在 Properties 界面中点击 Apply and Close

  2. 找到 source 目录中的 HL_sys_main.c 文件并打开,这就是我们主函数所在的文件。

    我们可以看到里面有很多如下所示的结构:

    /* USER CODE BEGIN (1) */
    /* USER CODE END */
    

    我们在所有自动生成的文件中,都需要把自己书写的代码放入这样的注释块中,否则在下次自动生成代码的时候,我们所写的东西就会被编译器自动覆盖。

  3. 添加以下代码:

    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    
    /* Include Files */
    
    #include "HL_sys_common.h"
    
    /* USER CODE BEGIN (1) */
    #include "HL_gio.h"
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    /* USER CODE BEGIN (2) */
    #define CNT    5000000
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
        int i;
    
        gioInit();
    
        while(1) {
            gioToggleBit(gioPORTB, 6);
            for (i = 0; i < CNT; i++);
        }
    /* USER CODE END */
    
        return 0;
    }
    
    
    /* USER CODE BEGIN (4) */
    /* USER CODE END */
    
  4. 点击 Project -> Build Project 编译代码,编译无误会在 Console 窗口中显示 Build Finished,另外在 Problems 窗口中也没有错误提示。

  5. 编译无误,可以对代码进行烧录验证,点击 Run -> Debug 或按快捷键 F11 即可。当然前提是需要将板子通过USB线连接到电脑。成功进入 Debug 模式界面如下所示:

  6. 点击绿色小箭头可以运行程序,也可使用快捷键 F8

  7. 运行成功后,可以看到板子上的 LED 循环闪烁。其闪烁快慢与 CNT 宏定义

五、寄存器使用

通过以上使用 HAL 库进行开发,相信大家都对这种开发方式有了一定的了解。而当我们,通过了解函数的背后,会发现其完全是寄存器操作。就拿我们调用的 gioInit() 函数而言,其背后包含着大量寄存器操作,而这些操作都是软件自动生成的,里面的代码也并不简洁,当我们面对一些问题的时候,也不好对其进行修改。所以我们接下来介绍,如何使用寄存器优雅点亮LED!!!

首先,我们需要打开技术手册(spnu563a.pdf),在其中找到有关 GIO 描述的章节,其位于 P1183 General-Purpose Input/Output(GIO)Module 中。有时间的读者可以对其进行详细阅读,我这里只讲关键点。

5.1 GIO 初始化

我们依旧使用上述生成的文件,开发自定义的 myGioInit() 函数。我们需要用到以下几个寄存器。

5.1.1 寄存器概述

这部分略有难度,需要静下心进行理解,其实寄存器很简单,就是配置相应的 bit 位,实现我们需要的功能。

5.1.1.1 GIO 全局控制器(GIOGCR0)

  • 从上图可以看到,其描述:在系统复位后,在配置GIO其他寄存器之前,需要将该位设置为1。而从 Table 25-2 中可以看到,将该寄存器第 0 位设置为 1 表示 GIO 运行正常。

5.1.1.2 GIO 数据方向寄存器(GIODIR[A-B])

  • 从上图可以看到,其描述:GIODIR寄存器控制给定端口的引脚是否配置为输入或输出。而从 Table 25-14 中可以看到,该寄存器第 0 位到第 7 位对应着 GIO 管脚的第 0 位到第 7 位,而将某一位(n)设置为 1,则代表 GIO_n 配置为输出模式,反之置零则表示配置为输入模式。

5.1.1.3 GIO 数据输出寄存器(GIODOUT[A-B])

  • 从上图可以看到,其描述:GIODOUT寄存器中的值指定端口引脚配置为输出时的输出状态(高= 1或低= 0)。而从 Table 25-16 中可以看到,该寄存器第 0 位到第 7 位对应着 GIO 管脚的第 0 位到第 7 位,而将某一位(n)设置为 1,则代表 GIO_n 配置为逻辑高电平,反之置零则表示配置为逻辑低电平。

5.1.1.4 GIO 开漏寄存器(GIOPDR[A-B])

  • 从上图可以看到,其描述:这个寄存器中的值启用或禁用数据引脚的开漏能力。而从 Table 25-19 中可以看到,该寄存器第 0 位到第 7 位对应着 GIO 管脚的第 0 位到第 7 位,而将某一位(n)设置为 1,则代表 GIO_n 配置为开漏输出模式,反之置零则表示配置为普通上拉/下拉模式。

5.1.1.5 GIO 上下拉使能寄存器(GIOPULDS[A-B])

  • 从上图可以看到,其描述:这个寄存器中的值启用或禁用引脚的拉控制能力。而从 Table 25-19 中可以看到,该寄存器第 0 位到第 7 位对应着 GIO 管脚的第 0 位到第 7 位,而将某一位(n)设置为 1,则代表 GIO_n 配置为上下拉功能禁止,反之置零则表示配置为上下拉功能使能。

5.1.1.6 GIO 上下拉选择寄存器(GIOPSL[A-B])

  • 从上图可以看到,其描述:这个寄存器中的值选择引脚的上拉或下拉功能。而从 Table 25-19 中可以看到,该寄存器第 0 位到第 7 位对应着 GIO 管脚的第 0 位到第 7 位,而将某一位(n)设置为 1,则代表 GIO_n 配置为上拉模式,反之置零则表示配置为普通下拉模式。

通过配置上述寄存器即可实现对GIO输入输出的基本控制

5.1.2 编写函数

通过上述对寄存器的了解,我们大概知道了要使得点亮一个 LED 需要使用到哪些寄存器。

那么下面我们整理下思路:

  • 首先,我们需要了解需求:即使能 GIOB_6 将其配置为输出模式。了解了这个需求,对应到寄存器。

  • 我们要先开启 GIO 全局控制器,将其第 0 位置 1,使能 GIO

  • 然后配置 GIO 数据方向寄存器,将 GIOB 的 Pin[6] 置 1,配置为输出

  • 然后配置 GIO 数据输出寄存器,将 GIOB 的 Pin[6] 置 1,配置为输出逻辑高电平

  • 然后配置 GIO 开漏寄存器,将 GIOB 的 Pin[6] 置 0,配置为普通上下拉模式

  • 然后配置 GIO 上下拉使能寄存器,将 GIOB 的 Pin[6] 置 0,配置为上下拉功能使能

  • 然后配置 GIO 上下拉选择寄存器,将 GIOB 的 Pin[6] 置 0,配置为初始状态下拉

有了上述思路,我们就可以着手写函数了,这里我给出示例:

/* USER CODE BEGIN (0) */
/* USER CODE END */

/* Include Files */

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_gio.h"
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
#define CNT    5000000

#define INIT_MODEL  0

void myGioInit(void);
/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    int i;

#if (INIT_MODEL)
    gioInit();
#else
    myGioInit();
#endif

    while(1) {
        gioToggleBit(gioPORTB, 6);
        for (i = 0; i < CNT; i++);
    }
/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */
void myGioInit(void)
{
    gioREG->GCR0 = 1U;

    gioPORTB->DIR = (uint32)((uint32)1U << 6U);
    gioPORTB->DOUT = (uint32)((uint32)1U << 6U);
    gioPORTB->PDR = (uint32)((uint32)0U << 6U);
    gioPORTB->PULDIS = (uint32)((uint32)0U << 6U);
    gioPORTB->PSL = (uint32)((uint32)0U << 6U);
}
/* USER CODE END */

编译烧录后运行,可以看到 LED2 交替闪烁,这里我不再对 gioToggleBit() 函数进行重构,大家可以自行查看其源码,进行自己手动配置,这里不再赘述。

5.2 寄存器操作重要性

其实官方生成的 HAL 库并不完整,有很多操作这里面都没有,这时候往往就需要我们对照技术手册进行开发,另外,希望大家在平常使用 HAL 库的过程中,尽量多去看看源码,试着自己写一段代码,试着运行,这对提高自己的技术很有帮助。

六、写在最后

本文介绍了 TMS570LC43 对应开发板的 LED 使用,以及如何使用 CCSHALCoGen 进行项目的生成及使用,另外阐述了如何使用寄存器实现 LED 的初始化。

在后续的文章中,将对 TMS570LC43x 进行详细的入门指导,欢迎读者关注!!!

欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。

  • 个人CSDN账号:刘梓谦_-CSDN博客

  • Gitee:刘佳豪 (liu-jiahaohappy) - Gitee

  • GitHub:Jiahao-Liu29 (github)

本文标签: 入门指南LED