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

news2024/12/25 9:21:15

前言

(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,为什么先不用管,后面会讲解
}

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

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

相关文章

pka 预测汇总

汇总内容来自 Open-Source Machine Learning in Computational Chemistry 中表格涉及的内容 文章目录 1.DeepKa2.Machine learning meets pKa 1.DeepKa 预测蛋白质的 pka&#xff0c;文章是 Basis for Accurate Protein p Ka Prediction with Machine Learning 和 Protein p…

web-csrf

目录 CSRF与XSS的区别&#xff1a; get请求 原理&#xff1a; pikachu为例 post请求 pikachu为例 CSRF与XSS的区别&#xff1a; CSRF是借用户的权限完成攻击&#xff0c;攻击者并没有拿到用户的权限&#xff0c;而XSS是直接盗取到了用户的权限 get请求 原理&#xff1a;…

20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵)

20230807在WIN10下使用python3将TXT文件转换为DOCX&#xff08;在UTF8编码下转换为DOCX有多一行的瑕疵&#xff09; 2023/8/7 12:58 https://translate.google.com/?slen&tlzh-CN&opdocs 缘起&#xff0c;由于google的文档翻译不支持SRT/TXT格式的字幕&#xff0c;因此…

利用Arthas+APM监控进行Java性能深度定位

大家可能都用过APM监控&#xff0c;包括开源的Skywalking、商用的卓豪&#xff08;ZOHO&#xff09;ManageEngine APM应用性能监控、以及云监控产品如听云&#xff08;Server监控&#xff09;&#xff0c;这些APM监控产品大大方便了我们实时监控应用性能&#xff0c;并实现性能…

04-6_Qt 5.9 C++开发指南_QListWidget和QToolButton

文章目录 1. 实例简介2. 源码2.1 混合式界面设计2.2 mainwindow.h2.3 mainwindow.cpp 1. 实例简介 Qt 中用于项 (Item)处理的组件有两类&#xff0c;一类是 Item Views&#xff0c;包括 QListView、QTreeView、QTableView、QColumnView 等;另一类是 Item Widgets&#xff0c;包…

用html+javascript打造公文一键排版系统14:为半角和全角字符相互转换功能增加英文字母、阿拉伯数字、标点符号、空格选项

一、实际工作中需要对转换选项细化内容 在昨天我们实现了最简单的半角字符和全角字符相互转换功能&#xff0c;就是将英文字母、阿拉伯数字、标点符号、空格全部进行转换。 在实际工作中&#xff0c;我们有时只想英文字母、阿拉伯数字、标点符号、空格之中的一两类进行转换&a…

FTP Server(二)

问题 使用Centos8通过命令行登录FTP服务器后发现乱码&#xff0c;无法显示中文 原因 FTP服务器是windows系统使用的是GBK编码&#xff0c;大多数Linux版本默认使用的是UTF-8 解决 在家目录下新建编辑 .lftprc 文件 [rootwenzi ~]#pwd /root [rootwenzi ~]#vim .lftprc debu…

狂神说-通俗易懂的23种设计模式

狂神说-通俗易懂的23种设计模式 文章目录 1、设计模式概述2、OOP七大原则4、工厂模式5、抽象工厂模式6、建造者模式7、原型模式8、适配器模式9、桥接模式10、静态代理模式11、静态代理再理解12、动态代理详解 1、设计模式概述 设计模式的基本要素&#xff1a; 1、模式名称 2、…

以太网DHCP协议(十)

目录 一、工作原理 二、DHCP报文 2.1 DHCP报文类型 2.2 DHCP报文格式 当网络内部的主机设备数量过多是&#xff0c;IP地址的手动设置是一件非常繁琐的事情。为了实现自动设置IP地址、统一管理IP地址分配&#xff0c;TCPIP协议栈中引入了DHCP协议。 一、工作原理 使用DHCP之…

2022 robocom 世界机器人开发者大赛-本科组(国赛)

RC-u1 智能红绿灯 题目描述&#xff1a; RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路&#xff0c;在某养老社区前&#xff0c;某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的&#xff1a; 路的两旁设置了一个按钮&#xff0c;老年人希望通行马路时会…

C语言预处理命令 #error 学习

#error命令是C/C语言的预处理命令之一&#xff0c;当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息。 如下代码输出数字1000&#xff0c;如果加了 #error&#xff0c;构建时不会通过&#xff0c;提示出错如下&#xff1b; 这可能在大型项目中比较有用&am…

前端小练--社区主页

文章目录 前言首页结构固定导航栏左侧导航itemitem标志 头部推荐文章展示ITEM实现ToolTip完整实现 首页完整实现 前言 废话不多说&#xff0c;直接看到效果&#xff1a; 是的也许你已经发现了这个页面和某个网站长得贼像。没错是这样的&#xff0c;这个布局我确实看起来很舒服…

【Rust】Rust学习 第五章使用结构体组织相关联的数据

5.1 定义结构体并实例化结构体 定义结构体&#xff0c;需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着&#xff0c;在大括号中&#xff0c;定义每一部分数据的名字和类型&#xff0c;我们称为 字段&#xff08;field&…

从进程pid反推获得该进程所属容器

参考链接 https://cloud-atlas.readthedocs.io/zh_CN/latest/docker/debug/get_container_by_pid.html

基于Java+SpringBoot+Vue的生鲜交易系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Idea使用Docker插件实现maven打包自动构建镜像

Docker 开启TCP 服务 vi /lib/systemd/system/docker.service改写以下内容 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启服务 #重新加载配置文件 systemctl daemon-reload #重启服务 systemctl restart docker.service此时docker已…

支付模块功能实现(小兔鲜儿)【Vue3】

支付 渲染基础数据 支付页有俩个关键数据&#xff0c;一个是要支付的钱数&#xff0c;一个是倒计时数据&#xff08;超时不支付商品释放&#xff09; 准备接口 import request from /utils/httpexport const getOrderAPI (id) > {return request({url: /member/order/$…

Redis实战案例27-UV统计

1. Redis的HyperLogLog的统计功能 示例&#xff1a; 表明HyperLogLog不管加入重复元素多少次都不会让count&#xff0c;不会计数重复元素&#xff0c;所以适合做UV计数 2. 简单实现UV测试 通过单元测试&#xff0c;向 HyperLogLog 中添加 100 万条数据&#xff0c;看看内存占…

小鼠是否使用分布性RL?DeepMind说是的

DeepMind的研究人员发现了大脑对多巴胺的反应与分布强化学习的趋势AI理论之间的相似之处。这些发现验证了分布强化学习的潜力&#xff0c;并促使DeepMind研究人员自豪地宣称“现在人工智能研究走在正确的道路上”。 在这项新研究中&#xff0c;来自DeepMind和哈佛大学的研究人…

C# 完成串口通信RS485

C# 完成串口通信RS485|RS232上下位机交互 第零步&#xff1a; 我用的是电脑usb 转串口的所以首先是驱动程序下载&#xff0c;我们用的是CH341 下载地址&#xff1a;https://www.wch.cn/downloads/CH341SER_EXE.html 第一步&#xff1a;连接机器 RS485 上面有三个端子&#xf…