本帖最后由 数码小叶 于 2021-8-8 21:34 编辑
从官网给的地址中,下载了板子的BSP包,里面有三个文件夹,Document、Library、SampleCode。虽然第一次接触新唐,但是看到了Library文件,就意味着支持库操作
在demo里,看到了模板工程,那就从模板工程开始熟悉,模板工程结构如下
而在mian函数里,是简单的几行代码
SYS_Init();
UART_Open(UART0, 115200);
printf("Hello World\n");
while(1);
这个操作简直是简单明了啊。。。首先是UART_Open函数,参数里直接赋值串口号、波特率
参数一直支持到串口5,M471手册里介绍的也是5个串口。但是在UART_Open函数以及其内部的函数中没有看到TX和RX的管脚操作。。。只剩一个SYS_Init()函数了,这个函数在mian.c文件中,
SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) | \
(SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);
这个配置貌似也有点简单了吧,一个复合语句搞定?对比原理图,确认下,是不是PB12和PB13从源头,板载下载器开始,四个拨码开关,1和2决定了是否连接MCU串口和虚拟串口
拨码开关连接到MCU_TX/RX,MCU_TX/RX确实是连接到了PB12和PB13
实际在看管脚复用功能的时候,发现新唐有一个软件,NuTool-PinView,可以方便的查看每个管脚的复用功能
自动侦测已连接的芯片,然后读取芯片管脚配置,可以反向验证芯片的管脚配置
在SYS_Init()函数中,还注意到一点,
就是这对操作,查看参考手册,找到相关描述
大意就是一些系统控制寄存器需要被保护,以避免一些意外的操作。在对这些特殊寄存器编程的时候,要进行解除保护。解除保护就是序列的将数据“59h”,“16h”和“88h”连续写入寄存器SYS REGLCTL。在这三个数据写入过程中,任何不同的数据值、不同的序列或任何其他对其他地址的写入都会中止这个操作。下面列出了全部需要解除保护的寄存器名称
在SYS_Init()函数中,解除保护后,就是设置晶振管脚、各种系统时钟源操作。
整个工程,最终的效果就是串口输出一个字符串
对于打印输出以及输入,库里也提供了一个c文件retarget.c来实现基于半主机的printf和getchar,然后就转到通用操作了,改写重定向这两个函数
int fputc(int ch, FILE *stream)
{
SendChar(ch);
return ch;
}
int fgetc(FILE *stream)
{
return (GetChar());
}
SendChar以及GetChar就是和实际串口操作相挂钩的
|