void ConfigureUART(void)//串口初始化
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);// Enable the GPIO Peripheral used by the UART. //使能GPIOA的时钟
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);// Enable UART0 使能串口0
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);// Configure GPIO Pins for UART mode. 配置串口的GPIO的RX引脚
ROM_GPIOPinConfigure(GPIO_PA1_U0TX); //配置串口的TX引脚
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); //配置GPIO的端口A 引脚0与引脚1
// Use the internal 16MHz oscillator as the UART clock source. //使用内部16HZ振荡器作为串口时钟源
// Initialize the UART for console I/O. 初始化控制台IO的UART
UARTStdioConfig(0, 115200, 16000000); //串口初始化配置 第一个是控制串口的端口数 第二个是传输速率 115200 第三个是16MHZ内部震荡
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);//第一个是时钟源基质 第二个是波特时钟源
}
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);
重映射printf函数
int fputc(int ch, FILE *f){UARTCharPut(UART0_BASE,ch); return (ch);}//重新映射printf函数
int fgetc(FILE *f) {int ch=UARTCharGet(UART0_BASE); return (ch);}
int main(void) 使能主函数
{
ROM_FPUEnable();//使能浮点单元
ROM_FPULazyStackingEnable();//浮点延迟堆栈,减少中断响应延迟
//时钟选择 各个参数 分频系数/有没有用到PLL/用的什么晶振/时钟源(不知道是啥时直接通用场景)/
ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);//配置系统时钟
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能外设不只是GPIO还有串口 但是这个是使能GPIOF 是为了后面的RGB灯点亮
//三种原色灯 F4 F5 F6
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_5);//红色
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_6);//绿色
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);//蓝色
ConfigureUART();//初始化串口0
PrintfLogo();//串口打印版本信息
while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, 0);//置低位点亮
SysCtlDelay(SysCtlClockGet() / 20);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_5);//置高位熄灭
SysCtlDelay(SysCtlClockGet() / 20);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, 0);//置低位点亮
SysCtlDelay(SysCtlClockGet() / 20);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, GPIO_PIN_6);//置高位熄灭
SysCtlDelay(SysCtlClockGet() / 20);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);//置低位点亮
SysCtlDelay(SysCtlClockGet() / 20);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);//置高位熄灭
SysCtlDelay(SysCtlClockGet() / 20);
}
}