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));
}
看着很多,其实大部分都是注释,实际的程序还是挺少的,而且几乎不用怎么动脑子。下面我就来简单说一说。
第一行是申请一个结构体,作为我们下面串口配置使用
这几行是配置串口的端口,因为默认情况下芯片内部并没有规定串口的引脚,可以由各位自行映射,我这里也是照搬官方的例程了,将P04设为TXD,P00设为RXD。这一块要用到一个全新的模块SWM,用于将芯片内部模块映射到GPIO去。
不过这块官方没有例程,仅仅在文档里面有描述如下图所示
如果大家需要了解可以去翻一翻官方文档,我这里也没有完全吃透。个人建议还是直接用官方的初始化工具来映射管脚。想必大家看到这也肯定学过STM32了,对于新芯片我个人不建议大家再从寄存器搞,能用上为主。
这一句话是选择串口0的时钟,我们将串口0的挂在main clock下,可以看到频率是15Mhz
然后就是设置参数了,第一句是读取默认参数到config里,然后就是改呗。
大家按照自己想要的参数进行设置就可以了,主要修改的参数就是RX和TX的使能,通信速率设置。其他的内容不常见,大家看到了对照着改就行。
最后就是将设置的参数初始化进去就行。
3.读写
3.1写
官方提供了一个USART_WriteBlocking这个函数,函数原型如下所示。
第一给个参数是你的串口号(USART0或USART1)第二个是数据的基地址,最后一个是数据的长度或是偏移量,使用方法如下。
3.2读
官方提供了一个USART_ReadBlocking函数
这里的形参与写是一样的,串口号 (USART0或USART1)数据的基地址,数据的长度或是偏移量。这个函数的返回值是状态,而非读到的数据。我们读到的数据是存放在第二个形参这个位置上的,别搞错了!当然如果大家需要读取的状态也可以看看函数原型的解释,我不怎么用得到,就不多说了。使用方法如下
4.测试
我们将板子上的管脚连接到DAP的串口上。
这次我先发一段hello world,然后再读一个数据到ch这个变量里。
可以看到我们想发送的hello world已经通过串口传过来了。 此时我们还没有输入一个字母或数字,因此ch的值还是0
可以看到我们从键盘上输入了一个a,ch的值变为了97
程序运行正常,符合我们的预期。
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的协议还是比较简单的不用分频,算波特率,全程芯片自己来。过两天等我板子画完了,我还是打算先把定时器做掉,其他几个协议等正点原子的逻辑分析仪到了再做给大家,这样看得比较直观。好了,还是那句话,有问题评论区见,我会尽力解答,毕竟我也是小白一个:)