你好对话框,
我正在通过你的DA14580基本套件学习UART,并目前试图通过UART定期发送一个字节,用示波器测量,看看它是如何工作的。我已经写了以下代码:
SetWord16 (CLK_AMBA_REG 0 x01);
setword16(set_freeeze_reg,frz_wdog);
SetWord16 (CLK_PER_REG UART1_ENABLE);
setword16(UART_LCR_REG,0x80);//设置位以访问DLH和DLL寄存器
setword16(UART_IIR_DLH_REG,(UART_BAUDRATE_115K2&0xFF >> 8)); //设置高字节
setword16(UART_RBR_THR_DLL_REG,UART_BAUDRATE_115K2&0xFF); //设置低字节
setBits16(UART_MCR_REG,UART_SIRE,0);// mode 0正常,1对于IRDA
setword16(UART_IIR_FCR_REG,1);//启用FIFO.
setBits16(UART_IER_DLH_REG,ERBFI_DLH0,0);// ier访问,禁用可用数据的中断
setBits16(UART_LCR_REG,UART_DLS,0x03);
setbits16(p10_mode_reg,pupd,0x03);
setBits16(p20_mode_reg,pid,0x02);
long n,j;
n = 0;
j = 0;
而(1)
{
而(n <200000){
n ++;
}
n = 0;
J ++;
if(j%2 == 0){
SetWord16 (UART_RBR_THR_DLL_REG 0 x92);
setBits16(UART_MCR_REG,UART_RTS,0x01);
}
别的{
SetBits16 (P1_RESET_DATA_REG P2_RESET 0 x01);
SetWord16 (UART_RBR_THR_DLL_REG 0 x0);
}
}
探测端口2_0显示了很高的是,因为功能但空闲UART保持高电平,但是,我找不到任何用于传输UART_RBR_THR_DLL_REG的内容的任何显式命令,一旦我用要发送的数据填写它。你能用这个指向正确的方向吗?
谢谢,
svl0822

你好svl0822,
您可以使用UART驱动程序实现更高级别的抽象和更容易控制UART。这将为您节省大量时间,因为您不需要以什么顺序思考,您应该控制寄存器。为此,包括UART驱动程序(UART2.c)到您的项目。您还需要定义
cfg_printf_uart2.在你的da14580_config.h文件。定义将在文件中包含uart初始化periph_setup.c.:# ifdef CFG_PRINTF_UART2
setBits16(CLK_PER_REG,UART2_ENABLE,1);
UART2_INIT(UART_BAUDRATE_115K2,3);
#万一
包括UART.H.要使用UART的头文件。检查UART.H.文件以查看您使用的功能。
还记得引脚混合periph_setup.c.配置正确的UART引脚。您需要在功能中进行
GPIO_reservations和set_pad_functions.您应该已经找到了初始定义。PS:是否有一些需要直接操纵寄存器?最可能没有什么好事。它已经被认为是处理它的正确方法,所以我建议使用UART驱动程序,或者至少你可以拍摄它的示例。
vesan,
包括的更高级别代码非常令我初学者。我无法遵循不同文件中发生的事情,我想学习低级寄存器操作,以真正了解UART初始化和用法的过程。
在我使用的另一个微控制器(MSP430)中,写入播放TROR角色的寄存器立即通过配置为UART配置的引脚串联发字节。DA14580是否具有相似的功能?
谢谢,
svl0822
vesan,
我已经查看了包含的文件,并在arch_main.c文件中添加了#include "uart2.c"。
这产生了一堆错误:
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_HANDLER乘法定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_INIT_FUNC乘法常识(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_INIT乘法定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FLOW_ON_FUNC乘以定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FLOW_ON乘法定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FLOW_OFF_FUNC乘法(由UART2.O和ARCH_MAIN.O)。
, \ \ full_emb_sysram。错误:L6200E:符号uart2_flow_off相乘定义(由uart2。o和arch_main.o)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FINISH_TRANSFERS_FUNC乘以(由UART2.O和ARCH_MAIN.O)。
, \ \ full_emb_sysram。(错误:L6200E: Symbol uart2_finish_transfers multiply defined (by uart2.)o和arch_main.o)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_READ_FUNC乘以定义(由UART2.O和ARCH_MAIN.O)。
, \ \ full_emb_sysram。符号uart2_read乘定义(由uart2。o和arch_main.o)。
, \ \ full_emb_sysram。符号uart2_write_func乘被定义(由uart2。o和arch_main.o)。
, \ \ full_emb_sysram。错误:L6200E:符号uart2_write乘定义(由uart2。o和arch_main.o)。
, \ \ full_emb_sysram。符号UART2_Handler_func的乘法被定义(由uart2。o和arch_main.o)。
我应该取消包含的东西从这个文件现在防止双重定义?
你好svl0822,
一般来说,将文件中的文件纳入代码并不是一个好主意。这确实很可能导致多种定义。尝试更换
# include“uart2.c”与#include“uart.h”你想用UART做些什么?
你好Vesan,
我需要UART与另一个uC通信,然后将数据传输到DA14580进一步的无线传输。
我已经写了一些代码,试图使用P2_0通过UART 2传输。
periph_init ();
UART2_INIT(UART_BAUDRATE_115K2,3);
UART2_FLOW_OFF();
setBits16(p20_mode_reg,pid,0x4);
Uint8_t sample[] = {0x92};
而(1){
uart2_write(样本1空);
UART2_FINISH_TRANSFERS();
}
我还改变了GPIO_CONFIGUREPIN中的引脚配置,以便为UART2保留P2_0和P2_1。
但是,我没有看到除恒定高信号之外的P2_0上的任何东西,这意味着它已被正确初始化为UART,并且在UART模式下空白。我相信我应该从0x92看到10010010。我需要做些什么才能在DA14580的PIN 2_0上看到这些级别?
谢谢,
svl0822
对话中的某个人可以提供一些洞察力吗?当我加载Blinky代码并探测相应的端口时,我能够看到函数printf_string的信号,这是一个包装器,用于将寄存器UART_RBR_THR_DLL_REG设置为已发送字符的十六进制值。当我在由模板制作的项目中的p2_0上做同样的时候,我看到什么都不是恒定的高信号。
你好svl0822,
也许你可以用函数
app_console.c.我认为你应该配置你的引脚periph_setup.c.而不是手动操作SetBits16.也许这也很有用?
对不起,我没有看过这么低的操纵uart水平