TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建

2023-11-16

前言

(1) 首先,我们需要知道TM4C123是M4的内核。对于绝大多数人而言,入门都是学习STM32F103,这款芯片是采用的M3的内核。所以想必各位对M3内核还是有一定的了解。M4内核就是M3内核的升级版本,他继承了M3的的所有功能,同时还增加和增强了如下功能:
<1> 增加了高精度 MAC,使得在 做算法计算时的性能更高;
<2>增加了浮点单元 FPU;
<3>增加了具有 SIMD 功能的 DSP 指令;
(2)这几个新增加的功能让M4内核的芯片有很强大的浮点运算功能,让M4的芯片多用于需要复杂的数字运算功能的场景。

开发环境搭建

keil工程环境搭建

(1)首先搜索引擎搜索keil,进入keil官网,搜索pack,然后按Ctrl+F搜索TEXAS(因为TI的英文名前缀是这个)。

在这里插入图片描述

(2)将pack文件导入到keil中。打开keil(注意,任意工程都行,就算没有工程是空白的也行)。点击左上角的PACK Installer

在这里插入图片描述

(3)进入PACK Installer之后,关闭弹窗——>点击左上角的File——>点击Import

在这里插入图片描述

(4)找到存放PACK的路径,然后打开他即可。之后你需要等待一段时间,右下角会有一个进度条,因为安装包是在国外网站,所以需要等待比较长的时间。
注意:TM4C123的pack名字不是如下图,因为我懒得重新演示,所以复制的我RA2E1 开发板教程截图。

在这里插入图片描述

(5)之后keil工程里面会弹出一个弹框,点击确定即可。
(6)之后按照下图确认是否pack已经安装

在这里插入图片描述

程序下载

(1)连接好下载器,设置下载器

在这里插入图片描述

(2)设置ROM的运算单元的起始位置和大小。以及设置编程算法

在这里插入图片描述

(3)编译,下载

在这里插入图片描述

TM4C123前缀带ROM的函数

详情请看:TM4C123的ROM函数和非ROM函数区别

函数介绍

ROM_FPUEnable();

因为在M4的内核中,可以有专门的浮点运算单元。所以当我们需要在程序中使用浮点运算的时候,需要调用ROM_FPUEnable()函数。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_FPUEnable(void);
//这个是存放在flash
void FPUEnable(void);

ROM_FPULazyStackingEnable();

当处理中断时,这个函数允许浮点寄存器s0-s15的延迟堆叠。当lazy stacking被启用时,堆栈上为浮点上下文保留空间,但不保存浮点状态。如果在中断上下文中执行一个浮点指令,那么该浮点上下文中首先被保存到堆栈预留的空间中。在中断处理程序完成时,只有保存了(作为执行浮点指令的结果)的浮点上下文才会被恢复。
(1)这提供了快速中断响应(因为在中断入口时不会保存浮点状态)和(2)在中断处理程序中使用浮点的能力(因为如果使用浮点指令,会保存浮点状态)之间的折衷

/****** 函数声明 ******/
//这个存放在ROM
void ROM_FPULazyStackingEnable(void);
//这个是存放在flash
void FPULazyStackingEnable(void);

ROM_SysCtlClockSet();

(1)这个函数用于设置设备时钟。一般采用ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);设置系统时钟为80MHZ。
(2)如下为 TM4C123 的时钟树。很多人对于时钟树就头痛,起始没有必要害怕,我们现在只需要看系统时钟。因为它最重要,其他的时钟信号,要用到的时候再去看。
<1>咱们一个一个的看ROM_SysCtlClockSet()中传入的参数。SYSCTL_USE_PLL | SYSCTL_OSC_MAIN这一段话表示让PLL作为系统时钟的时钟源。
<2>SYSCTL_XTAL_16MHZ表示主振荡器为16MHZ,这个需要更具你的外部晶振频率来设定。因为本人的开发板外部晶振是16MHZ,所以选择SYSCTL_XTAL_16MHZ。
<3>SYSCTL_SYSDIV_2_5进行再次分频的。因为PLL输出400MHZ频率,返回进行了一次2分频之后是200MHZ。因为TM4C123最大频率为80MHZ,所以再次分频数必须大于2.5。我们这里选择分频2.5,让TM4C123以最大频率运转。

在这里插入图片描述

/****** 系统时钟设置为80MHZ ******/
ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);//配置系统时钟,系统时钟频率400M/2/2.5=80M

/****** 函数声明 ******/
//这个存放在ROM
void ROM_SysCtlClockSet(uint32_t ui32Config);
//这个存放在flash
void SysCtlClockSet(uint32_t ui32Config);

ROM_SysCtlPeripheralEnable()

(1)经过上面的初始之后,我们现在可以正常进入LED程序编写了。系统上电的时候,IO口时钟是默认关闭的,作用是降低功耗。所以首先我们需要打开IO口时钟,因为我的开发板,LED是在PF4。所以我需要打开PF这一组IO的时钟。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_SysCtlPeripheralEnable(uint32_t ui32Peripheral);
//这个存放在flash
void SysCtlPeripheralEnable(uint32_t ui32Peripheral);

/****** 函数介绍 ******/
/* 作用 : 使能IO
 * 传入参数 : 
     * ui32Peripheral : 参数必须仅为下列值之一:
       SYSCTL_PERIPH_ADC0, SYSCTL_PERIPH_ADC1,
SYSCTL_PERIPH_CAN0, SYSCTL_PERIPH_CAN1, SYSCTL_PERIPH_CCM0,
SYSCTL_PERIPH_COMP0, SYSCTL_PERIPH_EEPROM0, SYSCTL_PERIPH_EMAC,
SYSCTL_PERIPH_EPHY, SYSCTL_PERIPH_EPI0, SYSCTL_PERIPH_GPIOA,
SYSCTL_PERIPH_GPIOB, SYSCTL_PERIPH_GPIOC, SYSCTL_PERIPH_GPIOD,
SYSCTL_PERIPH_GPIOE, SYSCTL_PERIPH_GPIOF, SYSCTL_PERIPH_GPIOG,
SYSCTL_PERIPH_GPIOH, SYSCTL_PERIPH_GPIOJ, SYSCTL_PERIPH_GPIOK,
SYSCTL_PERIPH_GPIOL, SYSCTL_PERIPH_GPIOM, SYSCTL_PERIPH_GPION,
SYSCTL_PERIPH_GPIOP, SYSCTL_PERIPH_GPIOQ, SYSCTL_PERIPH_GPIOR,
SYSCTL_PERIPH_GPIOS, SYSCTL_PERIPH_GPIOT, SYSCTL_PERIPH_HIBERNATE,
SYSCTL_PERIPH_I2C0, SYSCTL_PERIPH_I2C1, SYSCTL_PERIPH_I2C2,
SYSCTL_PERIPH_I2C3, SYSCTL_PERIPH_I2C4, SYSCTL_PERIPH_I2C5,
SYSCTL_PERIPH_I2C6, SYSCTL_PERIPH_I2C7, SYSCTL_PERIPH_I2C8,
SYSCTL_PERIPH_I2C9, SYSCTL_PERIPH_LCD0, SYSCTL_PERIPH_ONEWIRE0,
SYSCTL_PERIPH_PWM0, SYSCTL_PERIPH_PWM1, SYSCTL_PERIPH_QEI0,
SYSCTL_PERIPH_QEI1, SYSCTL_PERIPH_SSI0, SYSCTL_PERIPH_SSI1,
SYSCTL_PERIPH_SSI2, SYSCTL_PERIPH_SSI3, SYSCTL_PERIPH_TIMER0,
SYSCTL_PERIPH_TIMER1, SYSCTL_PERIPH_TIMER2, SYSCTL_PERIPH_TIMER3,
SYSCTL_PERIPH_TIMER4, SYSCTL_PERIPH_TIMER5, SYSCTL_PERIPH_TIMER6,
SYSCTL_PERIPH_TIMER7, SYSCTL_PERIPH_UART0, SYSCTL_PERIPH_UART1,
SYSCTL_PERIPH_UART2, SYSCTL_PERIPH_UART3, SYSCTL_PERIPH_UART4,
SYSCTL_PERIPH_UART5, SYSCTL_PERIPH_UART6, SYSCTL_PERIPH_UART7,
SYSCTL_PERIPH_UDMA, SYSCTL_PERIPH_USB0, SYSCTL_PERIPH_WDOG0,
SYSCTL_PERIPH_WDOG1, SYSCTL_PERIPH_WTIMER0, SYSCTL_PERIPH_WTIMER1,
SYSCTL_PERIPH_WTIMER2, SYSCTL_PERIPH_WTIMER3,
SYSCTL_PERIPH_WTIMER4, or SYSCTL_PERIPH_WTIMER5
 * 返回参数 : 无
*/

ROM_GPIOPinTypeGPIOOutput()

因为我们想要点亮LED,那么就需要将IO口设置为输出引脚。使用这个函数可以将IO口设置为输出。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_GPIOPinTypeGPIOOutput(uint32_t ui32Port,
uint8_t ui8Pins);
//这个存放在flash
void GPIOPinTypeGPIOOutput(uint32_t ui32Port,
uint8_t ui8Pins);

/****** 函数介绍 ******/
/* 作用 : 将IO口设置为输出
 * 传入参数 :
     * ui32Port : GPIO_PORTx_BASE,x可为A,B,C,D,E,F,G,H,J,K
     * ui8Pins : GPIO_PIN_x,x可为1,2,3,4,5,6,7
 *返回值 : 无
*/

ROM_GPIOPinWrite()

我们配置完IO之后,需要需要设置它的输出引脚电平。因为我的LED是共阳,所以输出低电平才是点亮LED。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_GPIOPinWrite(uint32_t ui32Port,
uint8_t ui8Pins,
uint8_t ui8Val);
//这个存放在flash
void GPIOPinWrite(uint32_t ui32Port,
uint8_t ui8Pins,
uint8_t ui8Val);

/****** 函数介绍 ******/
/* 作用 : 设置IO口电平
 * 传入参数 :
     * ui32Port : GPIO_PORTx_BASE,x可为A,B,C,D,E,F,G,H,J,K
     * ui8Pins : GPIO_PIN_x,x可为1,2,3,4,5,6,7
     * ui8Val : GPIO_PIN_x表示设置为高电平,!GPIO_PIN_x表示设置为低电平
 *返回值 : 无
*/

代码实操

#include "stdio.h"
#include <stdint.h>
#include <stdbool.h>
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_gpio.h"
#include "debug.h"
#include "fpu.h"
#include "gpio.h"
#include "pin_map.h"
#include "rom.h"
#include "sysctl.h"
#include "uart.h"
#include "uartstdio.h"


#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif

int main(void)
{
	ROM_FPUEnable();//使能浮点单元。这个函数必须在执行任何硬件浮点运算之前被调用;如果不这样做,将导致NOCP使用错误。
	ROM_FPULazyStackingEnable();//浮点延迟堆栈,减少中断响应延迟 
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);//配置系统时钟,系统时钟频率400M/2/2.5=80M
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);  //使能GPIOF外设	
	ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);// LED
	ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);//置高位熄灭
    while(1)
    {
			GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, !GPIO_PIN_5);//置低位点亮
			SysCtlDelay(SysCtlClockGet() / 10); //延时0.1s,为什么先不用管,后面会讲解
			GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_5);//置高位熄灭
			SysCtlDelay(SysCtlClockGet() / 10);//延时0.1s,为什么先不用管,后面会讲解
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建 的相关文章

  • 【学习笔记之操作系统原理篇】进程管理

    进程的概念 进程 单道程序 特点 顺序性 封闭性 独占性 可再现性 多道程序系统 特点 间断性 相互制约竞争资源 失去封闭性 共性资源 多个程序操作相同资源 不可再现性 运行结果不唯一 因为执行顺序不唯一 进程特征 动态性 一个进程可以对应
  • 写博客有哪些好用的工具和软件?

    写博客有哪些好用的工具和软件 在各种平台上写文章 要有一个好用的编辑器 使用简单方便 不用花很多时间排版 能预览效果等 此外 文章还需要配图片 动图和视频等 所以需要好用的截图软件 视频录制和剪辑软件 本文介绍我自己使用的软件和工具 本人认
  • mysql 重复下单_你的项目是如何处理重复请求/并发请求的?

    你的项目是如何处理重复请求 并发请求的 对于一些用户请求 在某些情况下是可能重复发送的 如果是查询类操作并无大碍 但其中有些是涉及写入操作的 一旦重复了 可能会导致很严重的后果 例如交易的接口如果重复请求可能会重复下单 重复的场景有可能是
  • GD32,在电源电路VDD VDDA VREF+/-参考设计

    GD32 在电源电路参考设计 https bbs 21ic com icview 2568876 1 9 html 资料来源于微信公众号 life and family 更多相关资料可以关注下该公众号 对于GD32 在电源电路设计方面的一些
  • C语言中volatile关键字,简单说明

    C语言中volatile关键字 如 define GPIO1 DR volatile unsigned int 0x0209C000 数据寄存器 每一位代表一个GPIO的0或1 一句话 使用volatile修饰后 会强制你每次引用GPIO寄

随机推荐

  • epoll移植到windows的可行性研究

    1 各有千秋 linux作为高效稳定的操作系统 部署在大量的服务器上 epoll在linux下 一个高性能的网络IO模型 在服务端领域发挥着重要的作用 但在开发效率上 windows以及visual studio系列因其良好的用户体验而更受
  • rabbitmq 添加用户和设置最大权限,也是解决mq报socket关闭异常

    此方式也是解决整合mq后 自己添加用户后 mq报socket关闭异常 1 安装完可视化mq后台后 直接http localhost 15672 进入 2 默认帐号密码 guest guest 3 首先添加用户 tags设置为admin 最大
  • OpenGL纹理贴图相关基本概念

    1 纹理贴图之所以复杂是因为矩形的纹理数据需要被合理地映射到非矩形的区域上面 纹理就是数据的数组 例如颜色数据亮度数据alpha数据等 纹理的单个数据值 被叫做纹理元素 英文叫做texual 初学者会本能地把纹理当成二维图像 但是纹理也可以
  • JavaScript的外部引入方式

    document writeln hello world
  • 聊聊数据库中的 savepoint

    从全局二级索引讲起 故事要从全局二级索引开始讲起 当我们构建了一个全局二级索引之后 一条逻辑上的数据插入 就会变成两条物理上的数据插入 一条插入到主表 另一条插入到索引表 为了保证主表和索引表数据的一致性 我们往往需要开启分布式事务 再并行
  • keil5 Device Database 灰色问题

    使用 keil5 安装 GD 软件包后打开工程依然无法搜索到对应的芯片型号 GD32F450 The Project references device files or libraries that are not installed D
  • 一个类的实例是另一个类的属性python_Python 的类其实是一个特殊的对象

    Python 中的类是一个特殊的对象 Python 中一切皆对象 class AAA 定义的类属于类对象 obj1 AAA 属于实例对象 在程序运行时 类同样会被加载到内存 类是一个特殊的对象 类对象 类对象在内存中只有一份 使用一个类可以
  • 60-200-072-使用-命令-MySQL使用mysqldumpslow分析慢查询日志文件

    1 概述 因为直接分析日志文件是个体力活 因此mysql为我们提供了相关工具mysqldumpslow来对慢查询日志文件进行分析 2 mysqldumpslow命令 访问次数最多的10条sql语句 usr local mysql bin m
  • fedora18 从文本模式启动而不是图形界面启动

    在之前的linux版本中 如果想要启动操作系统后直接进入文本模式 那就要修改 etc inittab这个文件 把其中的5改成3即可 可是 linux2 6 貌似是 内核之后 这个文件就改了 它不再控制着系统的默认启动模式了 如果在fedor
  • vant-weapp 组件 样式的覆盖(一)

    最近在小程序开发中使用到 vant weapp 组件 但有些样式不符合自己的项目要求 需要对样式进行覆盖 以DropdownMenu组件为例 需求是用户选择菜单项 菜单文字变成 橙色 样式的修改 就是以权重高的 覆盖权重低的
  • “Docker Content Trust + 镜像签名”,打造安全的 Kubernetes 供应链!

    出品丨Docker公司 ID docker cn 编译丨小东 每周一 三 五晚6点10分 与您不见不散 说在前面 两周前 我们分享了一篇名为 镜像扫描 基于策略的镜像提升 打造安全的 Kubernetes 供应链 的文章 它主要介绍了 Do
  • 利用BaseMultiItemQuickAdapter打造二、三级级菜单

    去网上找了下资料 然后自己整理了下二级 三级菜单的实现 直接上代码 Recyclerview记得要导包 implementation com android support recyclerview v7 28 0 0 一 首先在app下的
  • AI赋能的判定机制的倾向性

    最近忙着论文的事情 没有时间写一些技术博客 而且CSDN的图床经常出现问题 也懒得整理了 今天也是说些闲话 讨论下对未来AI赋能的判定机制的一些思考 什么是AI赋能的判定机制 主要其实就是 基于机器智能的技术手段 来代替人类评判事情 可以举
  • 最全的整理:毫米波雷达在检测、分割、深度估计等多个方向的近期工作及简要介绍

    前情回顾 在之前 我已经有介绍过毫米波雷达在2D视觉任务上的一些经典网络 自动驾驶中雷达与相机融合的目标检测工作 多模态目标检测 整理 Naca yu的文章 知乎 总结概括而言 其本质上都是对视觉任务的一种提升和辅助 主要的工作在于如何较好
  • 一些官方的github地址

    阿里巴巴开源github地址 https github com alibaba 腾讯开源github地址 https github com Tencent 奇虎360github地址 https github com Qihoo360 小米
  • xss的绕过方式

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 xss的类型以及常用标签 二 xss常用绕过 总结 前言 xss cross site scripting 中文 跨站脚本攻击 常年位于owasp top
  • 损失函数和正则化

    参考 https www cnblogs com LXP Never p 10918704 html https blog csdn net Heitao5200 article details 83030465 https zhuanla
  • C++-----拷贝构造函数

    拷贝构造函数是一种特殊的构造函数 和构造函数同样是特殊的类成员函数 C 提供的拷贝构造函数用于在建立新对象时将已存在对象的数据成员的值复制给新对象 拷贝函数的特点 拷贝函数是构造函数的一个重载形式 拷贝函数的参数只有一个且必须是类类型对象的
  • ffmpeg命令使用记录

    1 添加水印 ffmpeg i a mp4 acodec copy b v 548k vf movie logo png watermark in watermark overlay 20 20 output mp4 说明 i a mp4
  • TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建

    前言 1 首先 我们需要知道TM4C123是M4的内核 对于绝大多数人而言 入门都是学习STM32F103 这款芯片是采用的M3的内核 所以想必各位对M3内核还是有一定的了解 M4内核就是M3内核的升级版本 他继承了M3的的所有功能 同时还