串口用例子就可以了。
一、引脚。
二、代码。
#include "board.h"
#include "fsl_usart.h"
#include "pin_mux.h"
#include <stdbool.h>
#define DEMO_USART USART0
#define DEMO_USART_CLK_SRC kCLOCK_Flexcomm0
#define DEMO_USART_CLK_FREQ CLOCK_GetFlexCommClkFreq(0U)
#define DEMO_USART_IRQHandler FLEXCOMM0_IRQHandler
#define DEMO_USART_IRQn FLEXCOMM0_IRQn
#define DEMO_RING_BUFFER_SIZE 16
uint8_t g_tipString[] =
"Usart functional API interrupt example\r\nBoard receives characters then sends them out\r\nNow please input:\r\n";
uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];
volatile uint16_t txIndex; /* Index of the data to send out. */
volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */
void DEMO_USART_IRQHandler(void) {
uint8_t data;
if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART)) {
data = USART_ReadByte(DEMO_USART);
if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex) {
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
}
}
}
int main(void) {
usart_config_t config;
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockPLL150M();
BOARD_InitDebugConsole();
USART_GetDefaultConfig(&config);
config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
config.enableTx = true;
config.enableRx = true;
USART_Init(DEMO_USART, &config, DEMO_USART_CLK_FREQ);
USART_WriteBlocking(DEMO_USART, g_tipString, (sizeof(g_tipString) / sizeof(g_tipString[0])) - 1);
USART_EnableInterrupts(DEMO_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
EnableIRQ(DEMO_USART_IRQn);
while (1) {
while ((kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART)) && (rxIndex != txIndex)) {
USART_WriteByte(DEMO_USART, demoRingBuffer[txIndex]);
txIndex++;
txIndex %= DEMO_RING_BUFFER_SIZE;
}
}
}
三、说明。
将串口线的TXD连接开发板P8的TX,RXD连接开发板P8的RX。
烧完代码,板子会发一串字符过来,然后就是发送什么,它就回响什么。
四、其它问题。
1、使用串口0(FC0)时,需要在P1上插上短路帽,否则U6会导致RXD引脚不能拉低,而影响串口0接收数据。
2、由于Xpresso编辑器对中文支持不好,不能直接写成如下形式:
SendString("启动");
可以将中文转成16进制的编码,存入数组中,再发送,如下所示:
s8 strStart[] = {0xC6,0xF4,0xB6,0xAF}; // 启动
SendString(strStart);
3、该例子的串口收发是使用了FIFO缓冲器,所以使用USART_WriteByte()发送字节,发现很久没发出去,而且有部分字节被冲刷掉。所以需要改成以下发送、接收函数。
void SendChar(u8 t) {
USART_WriteByte(USART0, t);
while(!(kUSART_TxFifoEmptyFlag & USART_GetStatusFlags(USART0)));
}
void FLEXCOMM0_IRQHandler(void) {
uint8_t data;
while((kUSART_RxFifoNotEmptyFlag & USART_GetStatusFlags(USART0))) {
data = USART_ReadByte(USART0);
}
}