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

前言

(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)
{
}
#endifint 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=80MROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);  //使能GPIOF外设	ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);// LEDROM_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,为什么先不用管,后面会讲解
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣每日一题】2023.8.5 合并两个有序链表

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个有序的链表&#xff0c;要我们保持升序的状态合并它们。 我们可以马上想要把两个链表都遍历一遍&#xff0c;把所有节点的…

扫地机器人(dfs基础)

题面 Mike同学在为扫地机器人设计一个在矩形区域中行走的算法&#xff0c;Mike是这样设计的&#xff1a;先把机器人放在出发点 (1,1)(1,1) 点上&#xff0c;机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则&#xff1a;优先向右&#xff0c;如果向右不能走…

1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!

UVM-搭建一个最简单的验证平台&#xff0c;已用Questasim实现波形 1&#xff0c;背景知识2&#xff0c;".sv"文件搭建的UVM验证平台&#xff0c;包括代码块分享3&#xff0c;Questasim仿真输出&#xff08;1&#xff09;compile all&#xff0c;成功&#xff01;&…

基于 CentOS 7 构建 LVS-DR 集群 及 配置nginx负载均衡

一、构建LVS-DR集群 1、主机规划 Node01&#xff1a;PC Node02&#xff1a;LVS Node03、Node04&#xff1a;Webserver 2、部署环境 2.1 在Node02上配置 2.1.1 安装ipvsadm管理软件按 [rootlocalhost ~]# yum install -y ipvsadm 2.1.2 配置VIP [rootlocalhost ~]# if…

【力扣每日一题】2023.8.8 任意子数组和的绝对值的最大值

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组&#xff0c;让我们找出它的绝对值最大的子数组的和。 这边的子数组是要求连续的&#xff0c;让我们找出一个元素之和…

GG修改器安装与Root环境的安装

关于GG修改器大家应该都有一定的了解吧&#xff0c;就是类似于电脑端CE的一个软件。 GG修改器在百度云盘里请自行下载&#xff01; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1p3KJRg9oq4s0XzRuEIBH4Q 提取码&#xff1a;vuwj 那我要开始了&#xff01; 本来不想讲GG…

Spring Boot集成EasyPoi实现导入导出操作

文章目录 Spring Boot集成EasyPoi实现导入导出操作0 简要说明1 环境搭建1.1 项目目录1.2 依赖管理2.3 关于swagger处理2.4 关于切面处理耗时1 自定义注解2 定义切面类3 如何使用 2.5 核心导入操作2.6 核心导出操作 2 最佳实线2.1 导入操作1 实体类说明2 业务层3 效果3 控制层 2…

常用抓包工具

Fiddler Fiddler 是一个很好用的抓包工具&#xff0c;可以用于抓取http/https的数据包&#xff0c;常用于Windows系统的抓包&#xff0c;它有个优势就是免费 Charles Charles是由JAVA开发的&#xff0c;可以运行在window Linux MacOS&#xff0c;但它是收费的&#xff0c;和…

.Net Framework请求外部Api

要在.NET Framework 4.5中进行外部API的POST请求&#xff0c;你可以使用HttpClient类。 1. Post请求 using System; using System.Net.Http; using System.Threading.Tasks;class Program {static async Task Main(string[] args){// 创建一个HttpClient实例using (HttpClien…

Python取得系统进程列表

Python取得系统进程列表 上代码 上代码 import psutilfor proc in psutil.process_iter():try:pinfo proc.as_dict(attrs[pid, name])except psutil.NoSuchProcess:passelse:print(pinfo)

httpd+Tomcat(jk)的Web动静分离搭建

动静分离是指将动态请求和静态请求分别交给不同的服务器来处理&#xff0c;可以提高服务器的效率和性能。在Java Web开发中&#xff0c;常见的动态请求处理方式是通过Tomcat来处理&#xff0c;而静态请求则可以通过Apache服务器来处理。本文将详细讲解如何结合Apache和Tomcat来…

Logback ThresholdFilter LevelFilter

当我们需要对日志的打印要做一些范围的控制的时候&#xff0c;通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现&#xff1a; ch.qos.logback.classic.filter.LevelFilter和 ch.qos.logback.classic.filter.ThresholdFilter&#xff0c…

面试热题(翻转k个链表)

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…

使用Feign 的远程调用,把mysql数据导入es

要把数据库数据导入到elasticsearch中&#xff0c;包括下面几步&#xff1a; 1&#xff09;将商品微服务中的分页查询商品接口定义为一个FeignClient&#xff0c;放到feign-api模块中 2&#xff09;搜索服务编写一个测试业务&#xff0c;实现下面功能&#xff1a; 调用item-ser…

ctfshow-web7

0x00 前言 CTF 加解密合集 CTF Web合集 0x01 题目 0x02 Write Up 通过尝试&#xff0c;发现是数字型的注入&#xff0c;并且同样是过滤了空格 判断字段 获取一下flag即可 1/**/union/**/select/**/1,flag,3/**/from/**/web7.flag#&passworda以上

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…

kylin-Desktop gsettings 获取或设置系统配置

gsettings提供了对GSetings的命令行操作。GSetings实际上是一套高级API,用来操作dconf。 dconf存储着GNOME3的配置,是二进制格式。它做为GSettings的后端系统存在,暴露出低级API。在GNOME2时代,类似的角色是gconf,但它是以XML文本形式存储。 更接地气的说法是,dconf是G…

JavaScript基础知识

JavaScript基础知识 一、变量与数据类型1. 变量2. 数据类型 二、表达式与运算符1.字面量2.表达式3.运算符3.1 算术运算符3.2 比较运算符3.3 逻辑运算符3.4 赋值运算符 三、条件语句1. 控制流程2. 语句块3. if 语句3. switch 语句4. 条件运算符 四、循环语句1. while2. do...whi…

【框架篇】MyBatis 介绍及使用(详细教程)

一&#xff0c;MyBatis 介绍 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…