主题中讨论的其他器件:MSP430FR2311
工具与软件:
我在哪里可以找到这些 CCS 命令、宏或它们所调用的任何内容的文档。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我在哪里可以找到这些 CCS 命令、宏或它们所调用的任何内容的文档。
我查看了文档、发现端口的工作方式似乎与其他微控制器相同。
那么、为什么我的位始终反相?
例如:
#define BIT_SET (A、B) A |= B //应将位设置为1或输出3.3伏
#define BIT_CLR (A、B) A &=~B //应输出0伏或零伏。
但它们的工作方式是相反的吗?
BIT_SET (P1OUT、BIT0);设置为低电平
BIT_CLR (P1OUT、BIT0);设置为高电平
使用中没有中断或其他内部外设。
端口初始化如下:
int main(void) { int i,j,x,y,x0,y0,x1,y1; WDTCTL = WDTPW | WDTHOLD; // Stop wdt P1SEL = 0x0; P2SEL = 0x0; P4SEL = 0x0; P1DIR = 0xFF; P2DIR = 0x0; P4DIR = 0xFC; P5DIR = 0xFF; P6DIR = 0xFF; P7DIR = 0xFF; P8DIR = 0xFF;
#define bit_tst(A,B) (A & B) #define bit_set(A,B) A |= B #define bit_clr(A,B) A &= ~B #define bit_tog(A,B) A ^= B #include <msp430.h> #include <stdint.h> #include <stdlib.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop wdt P1SEL = 0x0; P2SEL = 0x0; P4SEL = 0x0; P1DIR = 0xFF; P2DIR = 0x0; P4DIR = 0xFC; P5DIR = 0xFF; P6DIR = 0xFF; P7DIR = 0xFF; P8DIR = 0xFF; while(1) { bit_clr(P1OUT,BIT2); __delay_cycles(100); bit_set(P1OUT,BIT2); __delay_cycles(1000); } }
这里、它被削减至这个问题的基本要素。 这个代码应该生成一个低电平100ms 和高电平1000ms 的脉冲序列、但是它生成相反的100us 高电平和1000ss 低电平。
具有 Tektronix 实验室级示波器! 没有一些 USB 连接的玩具。 我拥有35年的电子工程技术经验、因此我对电子行业有很好的了解。
方向。 我怀疑代码优化会再次干扰标准 C 语言的操作。
我想关闭所有这种优化、并按照我认为合适的方式将其添加。
这是一款具有8条数据线和5条控制线路的 LCD 彩色屏幕控制器实现方案。 因此、如果处理器或编译器未正确分配级别状态、您可以理解问题的严重性。
当然,我们不知道你的经验水平是什么。
在 MSP430FR2311上使用此代码:
#define bit_tst(A,B) (A & B) #define bit_set(A,B) A |= B #define bit_clr(A,B) A &= ~B #define bit_tog(A,B) A ^= B #include <msp430.h> #include <stdio.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer //P1SEL = 0x0; P1OUT &= ~BIT0; // Clear P1.0 output latch for a defined power-on state P1DIR = 0xFF; // Set P1.0 to output direction PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings while(1) { P1OUT &= ~BIT0; __delay_cycles(100); P1OUT |= BIT0; __delay_cycles(1000); } }
我得到:
使用宏:
#define bit_tst(A,B) (A & B) #define bit_set(A,B) A |= B #define bit_clr(A,B) A &= ~B #define bit_tog(A,B) A ^= B #include <msp430.h> #include <stdio.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer //P1SEL = 0x0; P1OUT &= ~BIT0; // Clear P1.0 output latch for a defined power-on state P1DIR = 0xFF; // Set P1.0 to output direction PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings while(1) { bit_clr(P1OUT,BIT0); __delay_cycles(100); bit_set(P1OUT, BIT0); __delay_cycles(1000); } }
我得到:
也就是说、它对我来说是有效的。
P1OUT 等对象可能不是指针-它们本身可能是宏-因此您可能希望保护宏中的表达式:
#define 位集(A、B)(A)|=(B)
在 GCC 中、至少所有特殊函数寄存器都是#defines。
#define P1OUT (PAOUT_L) /*端口1输出*/
SFR_b (PAOUT_L); /*端口 A 输出*/
#define SFR_b (x) extern volatile unsigned char x
(实际上是在链接时通过链接器脚本处理地址。)
也就是说,GCC 非常满意,并输出预期的 BIC 和 bis 指令。
我曾尝试修改过我的代码、但使用了 BIT2、这样做会产生一个恒定的高电平。
现在有另一个.c 文件以及几个。 h 文件作为工程的一部分、这些文件是实际的 LCD 控制器驱动程序。 位检查这些文件没有任何直接访问端口的内容。 您可以在我的代码中看到、目前没有对这些文件中的任何内容进行调用。
ICCAVRv8。 Archimedes 对于老8051、MPLAB、这个额外代码只是内存浪费、根据我认为的正常 C 标准、额外代码不执行任何操作、除非访问了特别调用的函数。
另外、 我使用的是官方 TI LaunchPad 开发板(不是一些离岸拷贝)、而且引脚直接来自芯片
这是怎么回事?
最新动态:
我构建了一个新项目,排除这些额外的文件,并发生同样的事情,我得到一个恒定的高.
/** * main.c */ #define bit_tst(A,B) (A & B) #define bit_set(A,B) A |= B #define bit_clr(A,B) A &= ~B #define bit_tog(A,B) A ^= B #include <msp430.h> #include <stdint.h> #include <stdlib.h> /************************************************************************************************************************************************/ /* Main entry point */ /************************************************************************************************************************************************/ int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop wdt /* P1SEL = 0x0; P2SEL = 0x0; P4SEL = 0x0; P1DIR = 0xFF; P2DIR = 0x0; P4DIR = 0xFC; // P5DIR = 0xFF; P6DIR = 0xFF; // P7DIR = 0xFF; // P8DIR = 0xFF; */ P1OUT &= ~BIT2; P1DIR = 0xFF; PM5CTL0 &= ~LOCKLPM5; while(1) { bit_clr(P1OUT,BIT2); __delay_cycles(100); bit_set(P1OUT,BIT2); __delay_cycles(1000); } // return 0; }
尝试过这个,我也相信括号,有人把它称为旧学校,但我不同意。
#define bit_tst(A,B) (A & B) #define bit_set(A,B) (A |= B) #define bit_clr(A,B) (A &= ~(B)) #define bit_tog(A,B) (A ^= B)
不工作。
这应该会将 P2的 BIT7拉高并保持在那里。 但 BIT7保持在零吗?
/** * main.c */ #define bit_tst(A,B) (A & B) #define bit_set(A,B) (A |= B) #define bit_clr(A,B) (A &= ~(B)) #define bit_tog(A,B) (A ^= B) #include <msp430.h> #include <stdint.h> #include <stdlib.h> /************************************************************************************************************************************************/ /* Main entry point */ /************************************************************************************************************************************************/ int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop wdt /* P1SEL = 0x0; P2SEL = 0x0; P4SEL = 0x0; P1DIR = 0xFF; P2DIR = 0x0; P4DIR = 0xFC; // P5DIR = 0xFF; P6DIR = 0xFF; // P7DIR = 0xFF; // P8DIR = 0xFF; */ P2SEL = 0x0; P2DIR = 0xFF; P2OUT |= BIT7; PM5CTL0 &= ~LOCKLPM5; while(1) { /* // bit_clr(P1OUT,BIT2); P2OUT |= 128; __delay_cycles(100); // bit_set(P1OUT,BIT2); P2OUT &= ~(128); __delay_cycles(1000); */ } // return 0; }
我必须有损坏的芯片?
我的意思是这样保护参数:
#define BIT_TST (A、B)((A)和(B))
以防止优先级问题。
现在以这种非常基本的形式工作。 请注意、我注释掉了 PM5CTL0并且=~μ H LOCKLPM5??
/** * main.c */ #define bit_tst(A,B) (A & B) #define bit_set(A,B) (A |= B) #define bit_clr(A,B) (A &= ~(B)) #define bit_tog(A,B) (A ^= B) #include <msp430.h> /************************************************************************************************************************************************/ /* Main entry point */ /************************************************************************************************************************************************/ int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop wdt P1SEL = 0x0; P1DIR = 0xFF; P1OUT |= BIT2; // PM5CTL0 &= ~LOCKLPM5; while(1) { bit_clr(P1OUT,BIT2); __delay_cycles(100); bit_set(P1OUT,BIT2); __delay_cycles(1000); } }