写在最前:博主19届电赛参赛,因为要用到TI的板子所以从0开始学习TM4C123,由于第一次接触所以很多地方都可能会有错误!欢迎指出~ QQ是1159806228 参赛题目是控制飞控组
TM4C123库函数存放有两个位置,一个是CPU本身一个是ROM,ROM里有更多函数,ROM里函数用前缀加以区分,本质一样。
#include "inc/hw_memmap.h"就是两类库函数的映射,简单说就是默认先在CPU里找函数,找不到就去ROM里找。
函数如ROM_SysCtlClockSet();前带了"ROM_"在TI库函数手册查的时候把这个前缀去掉即可。
即“ROM_SysCtlClockSet()“=”SysCtlClockSet()“仅仅是存放位置不同罢了
1. 时钟篇
·
SysCtlClockSet();
如:SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);
//函数意义:时钟选择;各参数:分频系数/有没有用PLL/用的什么晶振/时钟源
//分频系数SYSCTL_SYSDIV_1,SYSCTL_SYSDIV_2, SYSCTL_SYSDIV_3, …
SYSCTL_SYSDIV_64
//有没有用PLL:SYSCTL_USE_PLL ,SYSCTL_USE_OSC.
//外部晶振:(LaunchPad是16MHz)
SYSCTL_XTAL_4MHZ, SYSCTL_XTAL_4_09MHZ, SYSCTL_XTAL_4_91MHZ,
SYSCTL_XTAL_5MHZ, SYSCTL_XTAL_5_12MHZ, SYSCTL_XTAL_6MHZ,
SYSCTL_XTAL_6_14MHZ, SYSCTL_XTAL_7_37MHZ, SYSCTL_XTAL_8MHZ,
SYSCTL_XTAL_8_19MHZ, SYSCTL_XTAL_10MHZ, SYSCTL_XTAL_12MHZ,
SYSCTL_XTAL_12_2MHZ, SYSCTL_XTAL_13_5MHZ, SYSCTL_XTAL_14_3MHZ,
SYSCTL_XTAL_16MHZ, SYSCTL_XTAL_16_3MHZ, SYSCTL_XTAL_18MHZ,
SYSCTL_XTAL_20MHZ, SYSCTL_XTAL_24MHZ, or SYSCTL_XTAL_25MHz.
//时钟源(这个暂时没明白每个的准确指代…那个int是什么意思没搞懂):SYSCTL_OSC_MAIN,
SYSCTL_OSC_INT, SYSCTL_OSC_INT4, SYSCTL_OSC_INT30, or SYSCTL_OSC_EXT32.
·
SysCtlPeripheralEnable
如:SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
//使能外设,不仅是GPIO,还有串口定时器等
2. GPIO篇
·
GPIOPinTypeGPIOOutput
如:GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
//GPIO输出配置:port主地址+偏移量
·
GPIOPinWrite
如:GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 1);
//显然是控制GPIO输出高低电平
·
SysCtlPeripheralReady
//检测外设时钟配置好没:一般这么用↓
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{ }
·
GPIOPinTypeGPIOInput
如:GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4);
//配置IO口输出
·
GPIOPadConfigSet
如:GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
//输出设置:
//GPIO_PIN_TYPE_STD_WPU弱上拉
GPIO_PIN_TYPE_STD_WPD弱下拉
GPIO_PIN_TYPE_STD为推挽引脚
GPIO_PIN_TYPE_OD为开漏
GPIO_PIN_TYPE_ANALOG模拟输入
GPIO_PIN_TYPE_WAKE_HIGH高电平唤醒
GPIO_PIN_TYPE_WAKE_LOW低电平唤醒
·
GPIOPinRead
GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4);
//读GPIO
·
3.其他
·
FPULazyStackingEnable();
FPUEnable();
//使能浮点单元,TM4有专门的FPU所以使能了这个可以给之后的浮点计算减少CPU负担
·
SysCtlDelay(SysCtlClockGet() / n / 3);
//延时,延时时间=1/n秒
//解释: TI论坛上的解释粘过来:
SysCtlDelay(SysCtlClockGet()/1000/3) 这个函数执行的结果就是延时1ms,无论你的系统时钟是多少,当然你的系统时钟是不能低于3K的。 SysCtlClockGet()函数返回的值是系统的频率,也就是1S钟的CLOCK个数,这个个数/1000就是1ms系统时钟的个数,由于SysCtlDelay函数一个循环判断执行需要3个CLOCK时钟,所以系统时钟/3000就表示系统执行1ms的时间。 由此可以看出这个函数执行的结果就是延迟1ms. 在不同的系统时钟下,调用该函数都是延迟1ms.
·
UARTprintf(“Hello,world!\n”);
(这个在uartstdio.c中,非官方库,我是在examples看到这个的)
//类似printf,和原子给32的那个printf函数一个意思,默认串口1输出
//记得先把串口1配置好再用!
//要修改默认输出串口:uartstdio.c文件126行可以修改
//也可以直接用下面函数替代,这样就不用引用uartstdio.c啦(毕竟这个不是TI官方库),参数:字符串地址、字节数
void UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count)
{
// Loop while there are morecharacters to send.
while(ui32Count–)
{
// Write the next characterto the UART.
ROM_UARTCharPutNonBlocking(UART0_BASE,*pui8Buffer++);
}
}
如:UARTSend((uint8_t *)"\033[2JEnter text: ",16);