0

芯片为PIC24FJ256GB210

UART #3 上的#UTXEN 位不会设置。

它使用完全相同的指令序列在 UART #1 上设置良好。UART #2 也是如此。

作品...

 096E6  204000     mov.w #0x400,0x0000            111:           Mov     #Uart_1_Status_Control_Pattern, W0      ;Defined in CONSTANT.INC file
 096E8  881110     mov.w 0x0000,0x0222            112:           Mov     W0, U1STA                               ;ibid, page 230 Reg 17-2

失败...

09748  204000     mov.w #0x400,0x0000            248:           Mov.W   #Uart_3_Status_Control_Pattern, W0              ;Defined in CONSTANT.INC file
0974A  881290     mov.w 0x0000,0x0252            249:           Mov.W   W0, U3STA                                       ;ibid, page 230, Reg 17-2

所以我想,“啊,这是我想要的一个位,而在所有只读位之上移动的完整字会以某种方式导致问题。我将只设置一个位”。

不,仍然不会设置那个位。

失败...

 09754  A84253     bset.b 0x0253,#2               256:      Bset.W  U3STA, #UTXEN                   ;DEBUG DEBUG DEBUG Date: 2013-02-18  Time: 11:37:07 

- 更新 -

我可以在 MpLab 中设置该位。有什么不同 ?

我真的很困惑。这里还有什么可以防止该位被设置?

4

2 回答 2

0

错误

除了 UART 状态寄存器,我正在使用的 PIC24 中的每个 UART 都有一个相应的 UART 模式寄存器。

在这种情况下,它的名字是U3MODE

在相应的模式寄存器中有一个“UART Enable”位

在这种情况下,该位称为UARTEN,它是(根据我对这个特定 PIC 的文档)高位。

根据p24FJ256GB210.inc我用来组装它的文件,他们有这样定义的......

    .equiv UARTEN,  0x000F

如果在您尝试设置相应状态寄存器(在本例中为寄存器)中的位之前未设置 U3MODE 寄存器中的该位,则状态寄存器将不会按照您想要的方式更改其值。UTXENU3STA

修复

先设置寄存器UARTEN中的位U3MODE,然后再设置寄存器UTXEN中的位U3STA

代码示例

我从这里的反汇编窗口中复制了源代码和实际的十六进制值,以及每条指令的物理十六进制编码。

标签实际上只是我编造的常数;有效的代码,你可以阅读的代码;那种想法。您可以在每条指令的反汇编部分查看它们的值。

在这种情况下,重要的是U3MODE在尝试设置寄存器中的位之前确保寄存器的高位U3STA

这解决了这个问题。

                                                                             ;-------------------------------------
                                                                             ; --- THIS MUST COME FIRST ---
                                                                             ;
280080  mov.w #0x8008,0x0000  Mov.W   #Uart_3_Mode_Pattern, W0            ;Defined in Constant.Inc File
881280  mov.w 0x0000,0x0250   Mov.W   W0, U3MODE                          ;Documented in Manual DS39975A, p. 228, Register 17-1
                                                                             ;
                                                                             ; --- IN ORDER FOR THIS TO WORK ---
                                                                             ;
204000  mov.w #0x400,0x0000   Mov.W   #Uart_3_Status_Control_Pattern, W0  ;Defined in CONSTANT.INC file
881290  mov.w 0x0000,0x0252   Mov.W   W0, U3STA                           ;Manual DS39975A, page 230, Reg 17-2
于 2013-02-22T17:43:32.080 回答
0

我自己被这个绊倒了(感谢你的帖子)并最终发现:

Microchip 的 PIC24F 系列参考手册,第 21.4 节 UART 配置,第 21.4.1 节启用 UART 表示“在设置 UARTEN 位之前不应设置 UTXEN 位,否则将无法启用 UART 传输。”

http://ww1.microchip.com/downloads/en/DeviceDoc/39708B.pdf

于 2015-07-27T15:23:45.590 回答