7、TM4单片机学习之串口打印功能

文章目录

  • 一、初始化过程
    • 1、使能相应外设端口
    • 2、配置引脚的复用功能
    • 3、配置引脚类型
    • 4、时钟源设置
    • 5、串口帧格式配置
  • 二、使用方法
    • 1、简单使用
    • 2、使用中断
    • 3、printf 函数
  • 四、测试例程
    • 1、循环打印字符串"Hello"
    • 2、中断方式获取命令控制LED灯

一、初始化过程

1、使能相应外设端口

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))
    ;

2、配置引脚的复用功能

表示将PA0和PA1分别作为串口0的接收端和发送端。

GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);

3、配置引脚类型

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);

4、时钟源设置

UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);//Clock 16MHz

串口的时钟源有两个,一个是用系统时钟,另一个使用内部振荡器,这里用了内部振荡器,16MHz。
也可以使用系统时钟,则代码为:

UARTClockSourceSet(UART0_BASE, UART_CLOCK_SYSTEM);

时钟树如图:
7、TM4单片机学习之串口打印功能_第1张图片

5、串口帧格式配置

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表示无校验位,将它们以或运算的形式填进去即可。

二、使用方法

1、简单使用

可以用UARTCharPut函数打印字符,如:

UARTCharPut(UART0_BASE, 'A');

UARTCharGet获得字符,如:

char c;
c = UARTCharGet(UART0_BASE);

2、使用中断

//待续

3、printf 函数

首先需要在Keil设置里面勾选使用MicroLib,步骤如图所示:
7、TM4单片机学习之串口打印功能_第2张图片
包含一下头文件#include
重写fputc函数:

// 重写fputc函数以支持printf功能
int fputc(int ch, FILE *f)
{
    UARTCharPut(UART0_BASE,(unsigned char)ch);	//这里填写的基址(UART0_BASE)不同,则printf用的串口不同
    return ch;
}

便可以直接使用printf功能了,用法和C语言一样。

四、测试例程

1、循环打印字符串"Hello"

#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);
    }

2、中断方式获取命令控制LED灯

//待续

你可能感兴趣的:(TM4单片机学习)