芯片是PIC24FJ256GB210
UART#3上的#UTXEN位不会置位。
使用完全相同的指令序列在UART#1上设置正常。 UART#2也是如此。
WORKS ...
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
- UPDATE -
我可以在MpLab中设置该位。有什么区别?
我真的很困惑。还有什么可以防止这个位被设置?
答案 0 :(得分:0)
与UART状态寄存器一起,我正在使用的PIC24中的每个UART都有一个相应的UART模式寄存器。
在这种情况下,其名称为U3MODE
。
相应的模式寄存器中有一个“UART使能”位
在这种情况下,该位称为UARTEN
,这是(根据我的特定PIC的文档)高位。
根据我用来组装它的文件p24FJ256GB210.inc
,它们就像这样定义......
.equiv UARTEN, 0x000F
如果U3MODE寄存器中的该位未在之前设置,则尝试将UTXEN
位设置为相应的状态寄存器(在本例中为U3STA
寄存器),那么状态寄存器不会以你想要的方式改变它的值。
首先设置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
答案 1 :(得分:0)
自己绊倒了(感谢帖子)并最终找到了:
Microchip的PIC24F系列参考手册,第21.4节UART配置,第21.4.1小节启用UART表示“在UARTEN位置1之前,不应设置UTXEN位,否则UART传输将不会被使能。”