*( ( volatile unsigned char * )&( PORTD+1 ) ) = yours_data;
e掾木 发表于 2009-10-19 08:15
1.有错, 首先&不能对表达式( PORTD+1 ) 取内存地址
2.手头正好有dsPIC33FJ256MC710, 测试一下, 先看下边反汇编
58: *( ( volatile unsigned char * )(&LATA ) ) = 0x55;
01ACE 202C41 mov.w #0x2c4,0x0002
01AD0 B3C550 mov.b #0x55,0x0000
01AD2 784880 mov.b 0x0000,[0x0002]
59: *( ( volatile unsigned char * )(&LATA + 1) ) = 0xaa;
01AD4 202C60 mov.w #0x2c6,0x0000
01AD6 780080 mov.w 0x0000,0x0002
01AD8 B3CAA0 mov.b #0xaa,0x0000
01ADA 784880 mov.b 0x0000,[0x0002]
60: *( ( volatile unsigned char * )(&LATA) + 1 ) = 0x88;
01ADC 202C40 mov.w #0x2c4,0x0000
01ADE E80080 inc.w 0x0000,0x0002
01AE0 B3C880 mov.b #0x88,0x0000
01AE2 784880 mov.b 0x0000,[0x0002]
dsPIC33FJ256MC710是16位单片机, 对寄存器是按字访问的,0x2C4是LATA寄存器地址, 0x2C6是TRISB的寄存器地址
如果是59:的表达式,从反汇编来看是对寄存器地址0x2C6的TRISB写入0xaa
如果用60:的表达式,从反汇编来看是对寄存器地址0x2C5写入0x88,违背按字访问原则,故错
下边是测试结果:
Update Address Symbol Name Hex
02C6 TRISB 0xFFAA
02C4 LATA 0x8055
|