UART

smallcracker 2021-01-29 00:00:00
Categories: Tags:

UART

UART能干什么?

能用来通信。

感谢这个人的博客

基本功能 向上位机输出一个字符

1
2
3
4
5
6
7
8
9
10
11
//使能UART和GPIO
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//复用GPIO口为UART功能
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//设置UART组、频率、波特率、模式
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
//输出字符
UARTCharPut(UART0_BASE, 'E');

模式说明:The ui32Config parameter is the logical OR of three values: the number of data bits, the number of stop bits, and the parity. UART_CONFIG_WLEN_8, UART_CONFIG_WLEN_7, UART_CONFIG_WLEN_6, and UART_CONFIG_WLEN_5 select from eight to five data bits per byte (respectively). UART_CONFIG_STOP_ONE and UART_CONFIG_STOP_TWO select one or two stop bits (respectively). UART_CONFIG_PAR_NONE, UART_CONFIG_PAR_EVEN, UART_CONFIG_PAR_ODD, UART_CONFIG_PAR_ONE, and UART_CONFIG_PAR_ZERO select the parity mode (no parity bit, even parity bit, odd parity bit, parity bit always one, and parity bit always zero,
respectively).

就是设置每一个byte有多少数据位,多长停止位,多长奇偶校验位

进阶功能 格式化输出到上位机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//使能外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

//配置复用功能
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);

//分配UART信号
GPIOPinTypeUART(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1);

//配置UART参数(这样配置可以用UARTprintf)
UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
//使用16MHz内部高精度振荡器(PIOSC)作为UART模块时钟
UARTStdioConfig(1,115200, 16000000);
//UART编号、波特率、UART时钟频率(频率要和上一行设的一致)

UARTprintf("Enter Text: \n");

uint8_t getChar;
while (1)
{
getChar=UARTCharGet(UART1_BASE);
UARTCharPut(UART1_BASE,getChar);
}

更加进阶的功能 UART中断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void ConfigureUART(void)
{
//
// Enable the GPIO Peripheral used by the UART.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);

//
// Configure GPIO Pins for UART mode.
//
GPIOPinConfigure(GPIO_PC4_U1RX);
GPIOPinConfigure(GPIO_PC5_U1TX);
GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);

UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);

//
// Initialize the UART for console I/O.
//
UARTStdioConfig(1, 115200, 16000000);
}

void UARTIntHandler(){
//清除中断标志
uint32_t ui32Status;
ui32Status = UARTIntStatus(UART1_BASE, true);
UARTIntClear(UART1_BASE, ui32Status);
//循环直到接受队列中不存在字符
while(UARTCharsAvail(UART1_BASE))//loop while there are chars
{
//串口输出一个char型
UARTCharPutNonBlocking(UART1_BASE,UARTCharGetNonBlocking(UART1_BASE));
//闪一下灯
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlDelay(SysCtlClockGet() /10 / 3);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
SysCtlDelay(SysCtlClockGet() / 10 / 3);
}
}
void int_init(){
IntMasterEnable();
IntEnable(INT_UART1);
UARTIntEnable(UART1_BASE,UART_INT_RX|UART_INT_RT);
UARTIntRegister(UART1_BASE,UARTIntHandler);

}
int main(void)
{
MAP_FPULazyStackingEnable();
MAP_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
MAP_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
ConfigureUART();
int_init();
UARTprintf("Hello, world!\n");
while(1)
{
;
}
}

至高功能 测试FIFO

代码放在这,有时间再看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//配置接收中断,当接收FIFO半满(8byte)时触发。利用串口调试助手一个char一个char发送。
//观察到发送8个char后进入中断,FIFO测试成功
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h" //Register Definitions
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
//#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "uartstdio.h"
#include "driverlib/systick.h"
#include "driverlib/pin_map.h"


#define delay_ms(n); SysCtlDelay(n*(SysCtlClockGet()/3000));


void UARTIntHandler(void)
{
uint32_t ui32Status;
ui32Status = UARTIntStatus(UART1_BASE, true); //get interrupt status
UARTIntClear(UART1_BASE, ui32Status); //clear the asserted interrupts
while(UARTCharsAvail(UART1_BASE)) //loop while there are chars
{
UARTCharPutNonBlocking(UART1_BASE, UARTCharGetNonBlocking(UART1_BASE)); //echo character
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); //blink LED
delay_ms(1);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); //turn off LED
}
}

int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

//使能外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

//配置复用功能
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);

//分配UART信号
GPIOPinTypeUART(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1);

//LED配置
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //enable GPIO port for LED
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); //enable pin for LED PF2

//串口参数设置
UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC); //使用16MHz内部高精度振荡器(PIOSC)作为UART模块时钟
UARTStdioConfig(1,115200, 16000000); //UART编号、波特率、UART时钟频率(频率要和上一行设的一致)

//FIFO配置,
UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX4_8,UART_FIFO_RX4_8); //FIFO填入半满(8byte)时触发中断
UARTFIFOEnable(UART1_BASE);

//中断使能
IntMasterEnable(); //enable processor interrupts
IntEnable(INT_UART1); //enable the UART interrupt
UARTIntEnable(UART1_BASE, UART_INT_RX);

//注册中断服务函数
UARTIntRegister(UART1_BASE,UARTIntHandler);

UARTprintf("Enter Text: \n");

while (1) //let interrupt handler do the UART echo function
{
;
}
}

进一步进行其他FIFO中断测试,如下:

部分库函数小结

(1)void UARTprintf(const char *pcString, …)

  1. 包含uartstdio.cuartstdio.h后可用
  2. 类似C语言printf()

(2)void UARTCharPut(uint32_t ui32Base, unsigned char ucData)

  1. 串口输出一个char型
  2. 等待FIFO中有数据再发送

(3)int32_t UARTCharGet(uint32_t ui32Base)

  1. 串口接收一个uint32_t型数据
  2. 等待FIFO中有数据再接收

(4)bool UARTCharPutNonBlocking(uint32_t ui32Base, unsigned char ucData)

  1. 串口输出一个char型
  2. 若发送时FIFO已满时,直接返回false而不在那循环等待

(5)int32_t UARTCharGetNonBlocking(uint32_t ui32Base)

  1. 串口接收一个uint32_t型数据
  2. 如果遇到接收时FIFO为空,直接返回false而不在那循环等待

(6)void UARTFIFOLevelSet(uint32_t ui32Base, uint32_t ui32TxLevel,uint32_t ui32RxLevel)

  1. 配置输入输出FIFO的深度

(7)void UARTFIFOEnable(uint32_t ui32Base)

  1. 开启某UART的FIFO功能

UART向上位机发送信息模板

1
2
3
4
5
6
7
8
9
10
11
12
ConfigureUART();

void ConfigureUART(void)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}