[TM4]TM4C123G使用笔记
1|0[TM4]TM4C123G使用笔记
TI的板子真让人头大😓甚至重装了两遍KEIL5
如何用keil5新建工程可以参考如下博客:
https://blog.csdn.net/D_XingGuang/article/details/89390211?spm=1001.2014.3001.5506
记得在榔头里的C/C++勾选C99 Mode和GNU extensions,不然一大堆报错
下面主要是常用外设的使用
1|1GPIO
常用函数
void SysCtlPeripheralEnable(uint32_t ui32Peripheral)
- 功能:使能外设时钟
- 参数:uint32_t ui32Peripheral:需要使能的外设,在本文中需要使能的外设为GPIO(例如SYSCTL_PERIPH_GPIOF)
- 说明:从使能操作开始到完成需要经过五个时钟周期,在此期间不可访问外设,否则会出现总线错误。
void GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
-
功能:配置引脚为输出模式
-
参数:参见下面例程
void GPIODirModeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32PinIO)
-
功能:设置引脚模式
-
参数:
void GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32Strength, uint32_t ui32PadType)
-
功能:设置引脚PAD
-
参数:ui32Strength:输出驱动强度,正常设为2MA;ui32PadType:设置上下拉推挽开漏等
-
注:该函数一般与上面的void GPIODirModeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32PinIO)函数连用
void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
-
功能:写入高低电平
-
参数:ui8Val:低电平为0,高电平为引脚名(这个很特别,在读取电平也是一样的道理)
-
说明:例如GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_1|GPIO_PIN_2);表示Pin1和Pin2输出高电平。若引脚被设置为输入,则向该引脚输出是无效的。
int32_t GPIOPinRead(uint32_t ui32Port, uint8_t ui8Pins)
- 功能:读取电平
- 返回值:低电平为0,高电平为引脚名
例程:
1|2外部中断
常用函数
void GPIOIntTypeSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32IntType)
- 功能:设置引脚中断的触发条件
- 参数:
void GPIOIntRegister(uint32_t ui32Port, void (*pfnIntHandler)(void))
- 功能:注册中断回调函数
- 参数:自定义的中断回调函数名称
void GPIOIntEnable(uint32_t ui32Port, uint32_t ui32IntFlags)
- 功能:使能GPIO端口中断
- 参数:ui32IntFlags:
void IntEnable(uint32_t ui32Interrupt)
- 功能:使能中断外设
- 参数:如 INT_GPIOx 等
void IntMasterEnable(void)
- 功能:使能处理器中断
uint32_t GPIOIntStatus(uint32_t ui32Port, bool bMasked)
- 功能:读取中断状态
- 参数:bMasked:指定返回被屏蔽的中断状态(true)还是原始的中断状态(false)
- 说明:被屏蔽的中断状态:就是只返回在GPIOIntEnable函数里被使能的ui32IntFlags的中断状态,其他的被屏蔽。
void GPIOIntClear(uint32_t ui32Port, uint32_t ui32IntFlags)
- 功能:清除指定中断源标志
- 说明:发生中断后,对应的中断标志位置1,进入中断服务函数,在服务函数中务必清除中断标志,否则程序将不停地进入中断服务函数
例程
1|3Pulse Width Modulator(PWM)
与STM32相似,TM4C的PWM利用定时器实现,但TM4C的PWM模块中有自带的定时器,不需要像STM32那样使用定时器外设。
类比STM32,TM4C的分频系数相当于PSC,Period相当于ARR,Width相当于CCRx,PWM频率的计算公式为:
占空比的计算公式为:
观察PWM结构框图能知道,TM4C的PWM外设包含两个PWM模块,每个模块有4个PWM Generator,每个PWM Generator控制两个PWM信号的产生。同一个PWM Generator产生的两个PWM信号的Period是相同的,但Width可以不同。
下面的表格十分重要,编程时需要一一对照查表。
TM4C中PWM的配置过程
1、使能PWM时钟 SysCtlPeripheralEnable()
2、使能被复用引脚的时钟 SysCtlPeripheralEnable()
3、使能引脚复用PWM功能 GPIOPinTypePWM()
4、将PWM信号分配到合适的引脚上 GPIOPinConfigure()
5、使能PWM时钟,设置PWM分频器为4分频(PWM时钟源为10M) SysCtlPWMClockSet();
6、配置为向下计数,参数立即更新模式 PWMGenConfigure()
7、设置周期时间(定时器计数范围) PWMGenPeriodSet()
8、设置信号0占空比25%,信号1占空比75% PWMPulseWidthSet()
9、启动PWM发生器的定时器 PWMGenEnable()
10、使能PWM输出 PWMOutputState()
常用函数
void SysCtlPWMClockSet(uint32_t ui32Config)
- 功能:设置分频系数
- 参数:
void GPIOPinTypePWM(uint32_t ui32Port, uint8_t ui8Pins)
- 功能:为引脚分配PWM信号
void GPIOPinConfigure(uint32_t ui32PinConfig)
- 功能:使能GPIO引脚复用
- 参数:GPIO_Pxx_xxxx(xx引脚的xxxx功能)
void PWMGenConfigure(uint32_t ui32Base, uint32_t ui32Gen,uint32_t ui32Config)
- 功能:配置PWM Generator
- 参数:ui32Config:PWM寄存器的计数方式
void PWMGenPeriodSet(uint32_t ui32Base, uint32_t ui32Gen,uint32_t ui32Period)
- 功能:设置PWM Generator的Period
void PWMPulseWidthSet(uint32_t ui32Base, uint32_t ui32PWMOut,uint32_t ui32Width)
- 功能:设置PWM Output的Width
void PWMOutputState(uint32_t ui32Base, uint32_t ui32PWMOutBits,bool bEnable)
- 功能:使能PWM Output
void PWMGenEnable(uint32_t ui32Base, uint32_t ui32Gen)
- 功能:使能PWM Generator
例程
1|4Universal Asynchronous Receivers/Transmitters (UARTs)
和STM32F4的大差不差,但是比F4多一个硬件FIFO。
先对FIFO做一个简要的说明吧,全称为First In First Out,就是先进先出。想象一个水管,用手堵住一个口,然后往另一个口装水,装满了就把手拿掉,先进入的水就会先出来,其中水管的作用就相当于FIFO。所以FIFO实际上起到了一个缓存区的作用。FIFO的大小也有规定,比如一个16x8的FIFO,表示其容量为16个8位数据,就是说他最多可以装16个字节,超过16个字节就满了,同时还要触发中断。
TM4C的FIFO深度可以编程控制,支持1/8,1/4,1/2,3/4,7/8的深度,比如说我给FIFO设置为1/2深度,则FIFO中数据字节数超过16x1/2=8时就会产生一个中断。
通过下面TM4C的UART模块结构图,我们可以发现FIFO最大深度为16个字节,TX、RX各有一个FIFO
参考下图DataSheet的说明,TM4C的FIFO在上电后应该不会自动启动,需要代码里手动配置。如果不配置FIFO的话其相当于一个字节深度,跟STM32的DR寄存器差不多,装一个字节产生一个中断。
具体的UART操作逻辑和STM32差不太多,就不细说了。
常用函数
void GPIOPinTypeUART(uint32_t ui32Port, uint8_t ui8Pins)
- 功能:给引脚分配UART信号
void UARTClockSourceSet(uint32_t ui32Base, uint32_t ui32Source)
- 功能:为UART设置波特率时钟源
- 参数:ui32Base为串口基地址,ui32Source为串口的波特时钟源一般为UART_CLOCK_PIOSC是16MHz
void UARTStdioConfig(uint32_t ui32PortNum, uint32_t ui32Baud, uint32_t ui32SrcClock)
- 功能:配置串口参数
- 参数:PortNum:0~7,代表UARTx;Baud:波特率,比如115200;SrcClock:如果你上面波特率时钟源设置的是UART_CLOCK_PIOSC,那么SrcClock就是16000000
void UARTprintf(const char *pcString, ...)
- 功能:printf
void UARTConfigSetExpClk(uint32_t ui32Base, uint32_t ui32UARTClk,uint32_t ui32Baud, uint32_t ui32Config)
- 功能:配置串口参数
- 参数:ui32UARTClk为提供给UART的时钟频率,通过SysCtlClockGet()函数可以得到,通过ui32Config来配置串口的字长,校验位,停止位
void UARTCharPut(uint32_t ui32Base, unsigned char ucData)
- 功能:输出
- 说明:等待FIFO中有数据再发送,即阻塞式输出
int32_t UARTCharGet(uint32_t ui32Base)
- 说明:同上,阻塞式读取
bool UARTCharPutNonBlocking(uint32_t ui32Base, unsigned char ucData)
- 返回值:若TX的FIFO已满,直接返回false而不在那循环等待
- 说明:非阻塞式输出
int32_t UARTCharGetNonBlocking(uint32_t ui32Base)
- 说明:同上,非阻塞式读取,若RX的FIFO为空,直接返回False
void UARTFIFOEnable(uint32_t ui32Base)
- 功能:使能FIFO
void UARTFIFOLevelSet(uint32_t ui32Base, uint32_t ui32TxLevel,uint32_t ui32RxLevel)
- 功能:设置FIFO深度
void UARTIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
- 功能:使能串口中断
- 参数:ui32IntFlags:UART_INT_RX/TX
void UARTIntRegister(uint32_t ui32Base, void (*pfnHandler)(void))
- 功能:注册串口中断回调函数
void IntPrioritySet(uint32_t ui32Interrupt, uint8_t ui8Priority)
- 功能:设置中断优先级
- 参数:ui32Interrupt为中断外设,如INT_UARTx,ui8Priority为中断优先级从0x0到0xE0,0x0优先级最高
uint32_t UARTIntStatus(uint32_t ui32Base, bool bMasked)
- 功能:读取UART中断状态
- 参考GPIOIntStatus
void UARTIntClear(uint32_t ui32Base, uint32_t ui32IntFlags)
- 功能:清除上个函数读取到的标志位
bool UARTCharsAvail(uint32_t ui32Base)
- 功能:判断FIFO是否有数据存在
- 返回值:有为true,无为false
void UARTEnable(uint32_t ui32Base)
- 功能:使能串口
例程
注:
- 该例程需要导入utils文件夹中的uartstdio.c,并设置包含utils文件夹。
- 需要将uartstdio.c中126行的static uint32_t g_ui32Base改成自己的串口
后面再准备详细研究一下TM4C的UART
1|5General-Purpose Timers
TM4C有两种定时器,一种是16/32bit,另一种是32/64bit,两种定时器各有六个;对于一个16/32bit定时器来说,其可以拆分成两个16位定时器A和B工作,也可以组装成一个32位定时器工作。
常用函数
void SysCtlPeripheralEnable(uint32_t ui32Peripheral)
- 功能:使能外设
- 参数:ui32Peripheral如果为16/32bit的定时器就是TIMER,如果是32/64bit的定时器就是WTIMER。
void TimerConfigure(uint32_t ui32Base, uint32_t ui32Config)
-
功能:设置定时器模式
-
说明:
-
如果在定时器不拆分的情况下,可以将ui32Config设置为以下模式之一:
如果将定时器拆分的话则将ui32Config设置为TIMER_CFG_SPLIT_PAIR(分裂为一对)然后与以下模式进行或运算:
void TimerLoadSet(uint32_t ui32Base, uint32_t ui32Timer, uint32_t ui32Value)
-
功能:配置定时器频率
-
参数:ui32Base为定时器基地址,ui32Timer有TIMER_A,TIMER_B和TIMER_BOTH(单独A,单独B,AB都用)三种选择,在定时器拆分的情况下用哪个就设置哪个,在不拆分的情况下就设置为TIMER_A(对于其他函数也是,如果在级联的情况下还需要选择,那默认为选择TIMER_A),ui32Value为定时器加载值,一般来说定时器频率为N,那么定时器加载值=SysCtlClockGet()/N-1,即根据自己的定时器频率即可得定时器加载值。
此函数适用于16bit,32bit的定时器,即适用于16/32bit的定时器拆分与级联,32/64bit定时器的拆分三种情况,对于64bit的定时器,即32/64bit定时器的级联使用TimerLoadSet64。
void TimerIntRegister(uint32_t ui32Base, uint32_t ui32Timer,void (*pfnHandler)(void))
- 功能:为定时器中断注册中断回调函数
void TimerIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
- 功能:使能定时器中断
- 参数:ui32Base为定时器基地址,ui32IntFlags为中断模式,在定时器状态下一般设置为TIMER_TIMB_TIMEOUT或TIMER_TIMA_TIMEOUT
void TimerEnable(uint32_t ui32Base, uint32_t ui32Timer)
- 功能:使能定时器
- 参数:ui32Base为定时器基地址,ui32Timer也是有TIMER_A,TIMER_B和TIMER_BOTH三种
例程
1|6Quadrature Encoder Interface (QEI)
简单的说,就是TM4自带的编码器外设,能读取电机编码器并且测速以及读取位置(好用捏😋)
以下是DataSheet里的解释:(懒得翻译了,凑合着看吧)
可以发现,QEI有四个中断来源(有几个看不太懂什么意思,就不细说了)
API函数就自己翻手册吧,没啥好说的
例子
QEI初始化函数:
读取速度:
读取位置:
__EOF__

本文链接:https://www.cnblogs.com/Asaka-QianXiang/p/17542126.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库