通过UART传输的命令

8个帖子/ 0新
最后发表
SVL0822
离线
最后看到:6年2个月前
加入:2014-11-17 19:20
通过UART传输的命令

你好,对话框,

我正在通过您的DA14580基本套件学习UART,目前正在尝试通过UART定期发出一个字节,以使用示波器测量它是如何运作的。我写了以下代码:

setword16(clk_amba_reg,0x01);
SetWord16 (SET_FREEZE_REG FRZ_WDOG);

setword16(clk_per_reg,uart1_enable);
SetWord16 (UART_LCR_REG 0 x80);//设置访问DLH和DLL寄存器的位
SetWord16 (UART_IER_DLH_REG, (UART_BAUDRATE_115K2&0xFF > > 8)); / /设置高字节
SetWord16 (UART_RBR_THR_DLL_REG UART_BAUDRATE_115K2&0xFF); / /设置低字节
SetBits16 (UART_MCR_REG UART_SIRE 0);//正常模式为0,IRDA模式为1
SetWord16 (UART_IIR_FCR_REG, 1);/ /启用先进先出
SetBits16 (UART_IER_DLH_REG ERBFI_dlh0 0);//访问IER,禁用中断可用的数据
SetBits16 (UART_LCR_REG UART_DLS 0 x03);

SetBits16 (P10_MODE_REG PUPD 0 x03);
SetBits16 (P20_MODE_REG PID 0 x02);

长n, j。
n = 0;
j = 0;

而(1)

而(n < 200000) {
n + +;

n = 0;
+ +;
如果(j % 2 = = 0) {
setword16(UART_RBR_THR_DLL_REG,0x92);
SetBits16 (UART_MCR_REG UART_RTS 0 x01);

其他{
setBits16(p1_reset_data_reg,p2_reset,0x01);
setword16(UART_RBR_THR_DLL_REG,0x0);

探测端口2_0显示高值,这是有意义的,因为有功能但空闲的UART保持高值-然而,一旦我用要发送的数据填充它,我找不到任何显式的命令来传输UART_RBR_THR_DLL_REG的内容。你能用这个给我指一下正确的方向吗?

谢谢,
SVL0822

VesaN
离线
最后看到:5年11个月前
格鲁鲁 主
加入:2014-06-26 08:49
你好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);
# endif

包括uart.h标题文件您要使用UART。检查uart.h文件以查看您正在使用的函数。

还要记住pin的结构periph_setup.c配置正确的UART引脚。您需要在功能中进行gpio_revations.set_pad_functions..您应该已经找到了初始定义。

是否有一些特殊需要直接操作寄存器?很可能不会有什么好结果。已经很好地考虑了处理它的正确方法,所以我建议使用UART驱动程序,或者至少您可以从中获取示例。

SVL0822
离线
最后看到:6年2个月前
加入:2014-11-17 19:20
VesaN,

VesaN,

其中包含的高级代码对于像我这样的初学者来说非常令人困惑。我无法了解不同文件之间发生了什么,我想学习低级寄存器操作,以便真正理解UART初始化和使用的过程。
在我使用的另一个微控制器(MSP430)中,写入寄存器(扮演THR的角色)会立即通过为UART配置的引脚以串行方式发送字节。DA14580有类似的功能吗?

谢谢,
SVL0822

SVL0822
离线
最后看到:6年2个月前
加入:2014-11-17 19:20
VesaN,

VesaN,

我看过包括的​​文件,并将#include“uart2.c”添加到我的Arch_main.c文件中。
这产生了一系列错误:

, \ \ full_emb_sysram。axf: Error: L6200E: Symbol UART2_Handler multiply defined (by uart2. axf: Error: L6200E: Symbol UART2_Handler multiply defined (by uart2. axf)o和arch_main.o)。
, \ \ full_emb_sysram。xf: Error: L6200E: Symbol uart2_init_func multiply defined (by uart2. axf) . axf: Error: L6200E: Symbol uart2_init_funco和arch_main.o)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_init multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_inito和arch_main.o)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_flow_on_func multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_flow_on_funco和arch_main.o)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_flow_on multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_flow_ono和arch_main.o)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_flow_off_func multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_flow_off_funco和arch_main.o)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FLOW_OFF乘法定义(由UART2.O和ARCH_MAIN.O)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_finish_transfers_func multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_finish_transfers_funco和arch_main.o)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_FINISH_TRANSFERS乘以定义(由UART2.O和ARCH_MAIN.O)。
, \ \ full_emb_sysram。axf: Error: L6200E: Symbol uart2_read_func multiply defined (by uart2. axf: Error: L6200E: Symbol uart2_read_funco和arch_main.o)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_READ乘法定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_WRITE_FUNC乘以定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_WRITE乘法定义(由UART2.O和ARCH_MAIN.O)。
。\ out \ full_emb_sysram.axf:错误:l6200e:符号UART2_HANDLER_FUNC乘以定义(由UART2.O和ARCH_MAIN.O)。

我现在应该从这个文件中包含一些东西来防止双重定义吗?

VesaN
离线
最后看到:5年11个月前
格鲁鲁 主
加入:2014-06-26 08:49
你好svl0822,

你好svl0822,

通常,在代码中包含.c文件不是一个好主意。这确实很可能导致多种定义。尝试更换#include“uart2.c”# include“uart.h”

您具体想用UART做什么?

SVL0822
离线
最后看到:6年2个月前
加入:2014-11-17 19:20
你好VesaN,

你好VesaN,

我需要UART与另一UC通信,然后将数据传送到DA14580以进行进一步的无线传输。

我已经写了一些代码来尝试使用P2_0通过UART 2传输。


periph_init();
uart2_init (UART_BAUDRATE_115K2 3);
uart2_flow_off ();
SetBits16 (P20_MODE_REG PID 0 x4);
uint8_t sample [] = {0x92};
而(1){
UART2_WRITE(样本,1,null);
uart2_finish_transfers ();

我还更改了GPIO_ConfigurePin的引脚配置,为uart2保留P2_0和P2_1。

然而,我在P2_0上没有看到任何东西,除了一个恒定的高信号,这意味着它已经为UART正确初始化,并且在UART模式下处于空闲状态。我相信我应该从0x92看到10010010。我需要做什么才能看到DA14580引脚2_0上的这些水平?

谢谢,
SVL0822

SVL0822
离线
最后看到:6年2个月前
加入:2014-11-17 19:20
可以从对话中获取某人

Dialog的人能提供一些见解吗?当我加载闪烁代码并探测适当的端口时,我能够看到printf_string函数的信号,该函数是将寄存器UART_RBR_THR_DLL_REG设置为发送字符的十六进制值的包装器。当我在一个由模板制作的项目的P2_0上做同样的操作时,我看到的只是恒定的高信号。

VesaN
离线
最后看到:5年11个月前
格鲁鲁 主
加入:2014-06-26 08:49
你好svl0822,

你好svl0822,

也许你可以使用功能app_console.c..我想你应该把你的别针配置在内periph_setup.c而不是手动用SetBits16

也许这也很有用?

抱歉,我还没研究过这么低级别的操纵UART