LPC804开发(7.UART使用)

1.前言

这两天想画一个AD/DA的板子,就不想研究LPC804的时钟树了,就先搞一搞简单的通信吧,等明后天板子画完了再出定时器的教程。刚好低速协议这块是NXP芯片的优势,搞得挺快的,前面用RT1064等芯片感觉确实比ST简单,这次也不出所料吧。那就忙里偷闲地出一下教程吧。

2.初始化

这是串口0的初始化,速率是9600。

void init_usart1(void)
{
	usart_config_t config;

	/* Enables clock for switch matrix.: enable */
	CLOCK_EnableClock(kCLOCK_Swm);

	/* USART0_TXD connect to P0_4 */
	SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_4);

	/* USART0_RXD connect to P0_0 */
	SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_0);

	/* Disable clock for switch matrix. */
	CLOCK_DisableClock(kCLOCK_Swm);

	/* Select the main clock as source clock of USART0. */
	CLOCK_Select(kUART0_Clk_From_MainClk);

	/* Default config by using USART_GetDefaultConfig():
	 * config->baudRate_Bps = 9600U;
	 * config->parityMode = kUSART_ParityDisabled;
	 * config->stopBitCount = kUSART_OneStopBit;
	 * config->bitCountPerChar = kUSART_8BitsPerChar;
	 * config->loopback = false;
	 * config->enableRx = false;
	 * config->enableTx = false;
	 * config->syncMode = kUSART_SyncModeDisabled;
	 */
	USART_GetDefaultConfig(&config);
	config.enableRx     = true;
	config.enableTx     = true;
	config.baudRate_Bps = 9600;

	/* Initialize the USART with configuration. */
	USART_Init(USART0, &config, CLOCK_GetFreq(kCLOCK_MainClk));
}

看着很多,其实大部分都是注释,实际的程序还是挺少的,而且几乎不用怎么动脑子。下面我就来简单说一说。

c8fd05502b904b248f3ee7957c75e371.png第一行是申请一个结构体,作为我们下面串口配置使用

12c47604212d493e881bc1b62cb34d84.png

这几行是配置串口的端口,因为默认情况下芯片内部并没有规定串口的引脚,可以由各位自行映射,我这里也是照搬官方的例程了,将P04设为TXD,P00设为RXD。这一块要用到一个全新的模块SWM,用于将芯片内部模块映射到GPIO去。

8eb51fca1d3b4f768fba733ea610cabe.png

不过这块官方没有例程,仅仅在文档里面有描述如下图所示

9ce26c603d8545e1bbabb315bfb81e3b.png

如果大家需要了解可以去翻一翻官方文档,我这里也没有完全吃透。个人建议还是直接用官方的初始化工具来映射管脚。想必大家看到这也肯定学过STM32了,对于新芯片我个人不建议大家再从寄存器搞,能用上为主。

这一句话是选择串口0的时钟,我们将串口0的挂在main clock下,可以看到频率是15Mhz

ea1c2c1b839f4deaa708a1375bce531b.png

7541284157704b608597d1fb5f94fc94.png

然后就是设置参数了,第一句是读取默认参数到config里,然后就是改呗。

89c0a0d161c644988f4c0f9231e41160.png 大家按照自己想要的参数进行设置就可以了,主要修改的参数就是RX和TX的使能,通信速率设置。其他的内容不常见,大家看到了对照着改就行。

51d97039d9d14995ac023cb69c974878.png

最后就是将设置的参数初始化进去就行。

3.读写

3.1写

官方提供了一个USART_WriteBlocking这个函数,函数原型如下所示。

ff51d41fe61e422e93b63a40f9a19f76.png 第一给个参数是你的串口号(USART0或USART1)第二个是数据的基地址,最后一个是数据的长度或是偏移量,使用方法如下。

b270e9b5ec0e472b946e6fa6b9f648c3.png

3.2读

官方提供了一个USART_ReadBlocking函数

d92e5c3f20694b689052ff3d0db8a80a.png

这里的形参与写是一样的,串口号 (USART0或USART1)数据的基地址,数据的长度或是偏移量。这个函数的返回值是状态,而非读到的数据。我们读到的数据是存放在第二个形参这个位置上的,别搞错了!当然如果大家需要读取的状态也可以看看函数原型的解释,我不怎么用得到,就不多说了。使用方法如下

49ddd9009e0240079041b44e1e8d3712.png

4.测试

94fcb6722d9d4e7aab3de25f702c752e.jpeg

我们将板子上的管脚连接到DAP的串口上。

这次我先发一段hello world,然后再读一个数据到ch这个变量里。

0561b37615a4470d8331b376a030b51d.png可以看到我们想发送的hello world已经通过串口传过来了。 此时我们还没有输入一个字母或数字,因此ch的值还是0ae87393d289e4f5b865241ff20f7602d.png

 可以看到我们从键盘上输入了一个a,ch的值变为了978cadbb2df4524640933fd348a108108c.png

程序运行正常,符合我们的预期。

5.程序

main.c

#include "key.h"

uint8_t txbuff[] ="Hello World\n\rSend from LPC804M";
unsigned char ch=0;

int main(void)
{
    BOARD_InitBootClocks();
    BOARD_InitBootPeripherals();
    BOARD_InitDebugConsole();

    init_usart1();

    init_systick();
	init_led();


	USART_WriteBlocking(USART0, txbuff, sizeof(txbuff) - 1);

	USART_ReadBlocking(USART0, &ch, 1);

//	PRINTF("Hello World\r\n");

    while (1)
    {
    	;
    }
    return 0 ;
}



usart.c

/*
 * my_usart.c
 *
 *  Created on: 2024年1月27日
 *      Author: 18752
 */

#include "my_usart.h"

void init_usart1(void)
{
	usart_config_t config;

	/* Enables clock for switch matrix.: enable */
	CLOCK_EnableClock(kCLOCK_Swm);

	/* USART0_TXD connect to P0_4 */
	SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_4);

	/* USART0_RXD connect to P0_0 */
	SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_0);

	/* Disable clock for switch matrix. */
	CLOCK_DisableClock(kCLOCK_Swm);

	/* Select the main clock as source clock of USART0. */
	CLOCK_Select(kUART0_Clk_From_MainClk);

	/* Default config by using USART_GetDefaultConfig():
	 * config->baudRate_Bps = 9600U;
	 * config->parityMode = kUSART_ParityDisabled;
	 * config->stopBitCount = kUSART_OneStopBit;
	 * config->bitCountPerChar = kUSART_8BitsPerChar;
	 * config->loopback = false;
	 * config->enableRx = false;
	 * config->enableTx = false;
	 * config->syncMode = kUSART_SyncModeDisabled;
	 */
	USART_GetDefaultConfig(&config);
	config.enableRx     = true;
	config.enableTx     = true;
	config.baudRate_Bps = 9600;

	/* Initialize the USART with configuration. */
	USART_Init(USART0, &config, CLOCK_GetFreq(kCLOCK_MainClk));
}

6.结语

串口的简单使用至此就结束了,当然官方例程里还有串口中断等等例程,大家有需要也可以自己来测试,或是评论区告诉我,如果需要多我就再来研究出教程。 可以看出来NXP的协议还是比较简单的不用分频,算波特率,全程芯片自己来。过两天等我板子画完了,我还是打算先把定时器做掉,其他几个协议等正点原子的逻辑分析仪到了再做给大家,这样看得比较直观。好了,还是那句话,有问题评论区见,我会尽力解答,毕竟我也是小白一个:)

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值