TM4C123GH6PM一共有8个串口,UART0~UART7。以串口0为例,串口0在硬件上用的是PA0和PA1。
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
;
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_UART0))
;
表示将PA0和PA1分别作为串口0的接收端和发送端。
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
这里讲一下,这个函数其实是官网库二次封装的一个函数,可以看下其定义:
void
GPIOPinTypeUART(uint32_t ui32Port, uint8_t ui8Pins)
{
//
// Check the arguments.
//
ASSERT(_GPIOBaseValid(ui32Port));
//
// Make the pin(s) be peripheral controlled.
//
GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_HW);
//
// Set the pad(s) for standard push-pull operation.
//
GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
}
即:设置引脚为GPIO_DIR_MODE_HW
,电流为GPIO_STRENGTH_2MA
,类型为GPIO_PIN_TYPE_STD
所以也可以用这两行代码进行替换:
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW);
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);//Clock 16MHz
串口的时钟源有两个,一个是用系统时钟,另一个使用内部振荡器,这里用了内部振荡器,16MHz。
也可以使用系统时钟,则代码为:
UARTClockSourceSet(UART0_BASE, UART_CLOCK_SYSTEM);
UARTConfigSetExpClk(UART0_BASE, 16000000, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
第一个参数UART0_BASE
:为串口0基址。
第二个参数16000000
:表示时钟频率16MHz。若之前配置的时钟源为系统时钟,那么这个要改为SysCtlClockGet()
。
第三个参数为帧格式
:UART_CONFIG_WLEN_8
表示八个数据位,UART_CONFIG_STOP_ONE
表示一个停止位,UART_CONFIG_PAR_NONE
表示无校验位,将它们以或运算的形式填进去即可。
可以用UARTCharPut
函数打印字符,如:
UARTCharPut(UART0_BASE, 'A');
用UARTCharGet
获得字符,如:
char c;
c = UARTCharGet(UART0_BASE);
//待续
首先需要在Keil设置里面勾选使用MicroLib,步骤如图所示:
包含一下头文件#include
重写fputc
函数:
// 重写fputc函数以支持printf功能
int fputc(int ch, FILE *f)
{
UARTCharPut(UART0_BASE,(unsigned char)ch); //这里填写的基址(UART0_BASE)不同,则printf用的串口不同
return ch;
}
便可以直接使用printf
功能了,用法和C语言一样。
#include
#include
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include
void delay_ms(int n)
{
for(int i = 0; i < n; i++)
SysCtlDelay(SysCtlClockGet()/3000);
}
//重写fputc函数以支持printf
int fputc(int ch, FILE *f)
{
UARTCharPut(UART0_BASE,(unsigned char)ch);//如果用其他串口,只需修改基址(UART0_BASE)即可。
return ch;
}
int main()
{
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_UART0))
;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
;
//配置引脚复用
PIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//配置引脚类型
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW);
//GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
//时钟源选择
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
//帧格式配置
UARTConfigSetExpClk(UART0_BASE, 16000000, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
while(1)
{
printf("Hello\n");//打印字符串测试
delay_ms(100);
}
//待续