工具与软件:
您好:
提前感谢您提供的任何帮助。 我在 MSP-EXP430G2 Launchpad 开发套件上运行一个应用、但使用的是较旧的 CircuitCo 教育版 BoosterPack。 应用程序使用霍尔效应传感器来确定主轴的速度、并在我调试应用时将其显示在 BoosterPack LCD 上、但当我退出调试器时、LCD 上显示的最后一位信息会在退出之前保留、并且主轴速度不会更新。 当我移除仿真板的跳线并通过 J6从外部电源为器件供电时、该应用也无法正常工作。 上电后、我必须按下复位按钮、然后只能看到开始启动界面、不显示主轴速度。
我已经查看过各种论坛中的一些使用调试器运行代码的示例、而不是在调试器关闭时运行代码、但我在这些示例中看不到与我的情况相关的内容。
您对如何解决此问题有什么建议吗? 再次感谢。
设置:
Code Composer Studio 版本:11.1.0.00011、运行 Windows 10的 PC。
观看安装在 launchpad 板上的晶体并移除 EDU BoosterPack 上的白色 LED (我将使用该引脚13作为霍尔效应传感器电路的输入)。
霍尔效应传感器电路。
和我的代码。
#include <msp430.h> #include <string.h> #include <stdio.h> #include <stdint.h> #include <intrinsics.h> #define EBP_CS BIT0 //chip select #define EBP_CLK BIT5 //clock #define EBP_MOSI BIT7 //data line #define EBP_RS BIT3 //command vs data #define SENSOR_PIN BIT5 //attach key to P2_5 TA1.2 #define AFTER_BUSY_DELAY 40 //used to wait additional time after UCBUSY clears void InitBPLCD(void); void InitSPI(void); void InitPorts(void); void InitHallSensor(void); void itoa(long unsigned int value, char *result, unsigned int base); unsigned int WriteCommand(unsigned int cmd); void WriteData(void); void ClearHome(void); void SetRowLine(unsigned int row, unsigned int line); char charsToLCD[32] = {'\0'}; uint32_t timerDiff = 0; uint8_t computeSpeed = 0; uint8_t speedCount = 0; volatile unsigned int cntOvrFloTAR = 0; volatile unsigned int sendData = 0; volatile uint16_t currTimerCounts = 4; volatile uint16_t prevTimerCounts = 0; /** * main.c */ int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer //set up Basic Clock Module BCSCTL1 |= DIVA_3; //this write clears all other bits; divide ACLK/8 BCSCTL3 |= XCAP_3; //sets internal capacitance for watch crystal InitPorts(); InitSPI(); InitHallSensor(); InitBPLCD(); __delay_cycles(1000); strcpy(charsToLCD, "0123456789012345testing testing!"); WriteData(); __delay_cycles(1000); //Set up Timer1A // capture on rising edge, CCI2B input, synchronous cap, capture mode, ints enabled TA1CCTL2 = CM_1 | CCIS_1 | SCS | CAP | CCIE; // Continuous, divide clock by 1, ACLK, clear, enable TA1CTL = MC_2 | ID_0 | TASSEL_1 | TACLR | TAIE; __enable_interrupt(); for(;;){ // do nothing if (computeSpeed > 0){ computeSpeed = 0; timerDiff = currTimerCounts - prevTimerCounts; //clear buffer charsToLCD[0] = '\0'; itoa(timerDiff, charsToLCD, 10); WriteData(); } /* if (sendData == 2) { sendData = 0; charsToLCD[0] = '\0'; strcpy(charsToLCD, "0123456789012345running testing!"); WriteData(); } */ } return 0; } #pragma vector = TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR (void){ switch (__even_in_range(TA1IV, 10)){ case 0: break; case TA1IV_TACCR2: TA1CCTL2 &= ~CCIE; // disable further CCIE interrupts prevTimerCounts = currTimerCounts; currTimerCounts = TA1CCR2; ++speedCount; if (speedCount > 3){ computeSpeed = 1; speedCount = 0; } cntOvrFloTAR = 0; //reset TAR rollover counter TA1CCTL2 &= ~CCIFG; // clear the CCRO flag TA1CCTL2 |= CCIE; //enable interrupts break; case TA1IV_TAIFG: ++cntOvrFloTAR; /*if (cntOvrFloTAR > 2){ // been idle //set flag to go to sleep cntOvrFloTAR = 0; sendData = 2; }else{ sendData = 1; }*/ break; default: for (;;){ //Should not be possible } } } void InitBPLCD(void){ //copying bp_LCD.cpp from Energia sketch WriteCommand(0x30); //function set __delay_cycles(27); WriteCommand(0x30); //function set __delay_cycles(27); WriteCommand(0x30); //function set __delay_cycles(27); WriteCommand(0x14); //cursor/display shift __delay_cycles(27); WriteCommand(0x0c); //display on/off __delay_cycles(27); WriteCommand(0x06); //entry mode set __delay_cycles(27); WriteCommand(0x39); //function set (2 lines, instruction table 1) __delay_cycles(27); ClearHome(); //clear WriteCommand(0x57); //power/ICON control/contrast set upper bits __delay_cycles(27); WriteCommand(0x6b); //follower control __delay_cycles(27); WriteCommand(0x72); //contrast set lower bits __delay_cycles(1000); } unsigned int WriteCommand(unsigned int cmd){ if (UC0IFG & UCB0TXIFG){ //ready for new data? P2OUT &= ~(EBP_RS + EBP_CS); // need to clear _SS and RS LOW for command __delay_cycles(10); UCB0TXBUF = cmd; //begin transaction while(UCB0STAT & UCBUSY); //wait for transfer to finish __delay_cycles(AFTER_BUSY_DELAY); P2OUT |= EBP_RS + EBP_CS; } __delay_cycles(5); return 1; } void ClearHome(void){ unsigned int wait = WriteCommand(0x01); if (wait == 1){ WriteCommand(0x02); } } void WriteData(void){ ClearHome(); SetRowLine(0,0); char *ptr_lcdUp = charsToLCD; char *ptr_lcdLow = charsToLCD + 16; unsigned int i; for(i = 0; i < 16 && *ptr_lcdUp != '\0'; ++i, ++ptr_lcdUp){ if (UC0IFG & UCB0TXIFG){ //ready for new data? P2OUT &= ~EBP_CS; __delay_cycles(10); UCB0TXBUF = *ptr_lcdUp; //load shift register for transfer while(UCB0STAT & UCBUSY); //wait for transfer to finish __delay_cycles(AFTER_BUSY_DELAY); P2OUT |= EBP_CS; // need to set _SS HIGH } } SetRowLine(0,1); for(i = 0; i < 16 && *ptr_lcdLow != '\0'; ++i, ++ptr_lcdLow){ if (UC0IFG & UCB0TXIFG){ //ready for new data? P2OUT &= ~EBP_CS; __delay_cycles(10); UCB0TXBUF = *ptr_lcdLow; //load shift register for transfer while(UCB0STAT & UCBUSY); //wait for transfer to finish __delay_cycles(AFTER_BUSY_DELAY); P2OUT |= EBP_CS; // need to set _SS HIGH } } } void SetRowLine(unsigned int row, unsigned int line){ //NewHaven LCD with 2 lines 16 rows, expect line (0,1) row (0,15) if ((row < 16) && (line < 2)) WriteCommand(0x80 | (line * 0x40) | row); } void InitSPI(void){ P2OUT |= (EBP_CS | EBP_RS); //start off high ( P1SEL |= (EBP_CLK | EBP_MOSI); //select primary peripheral USCI_B P1SEL2 = (EBP_CLK | EBP_MOSI); //SPI mode 3 needs CPOL=CKPL=1, CPHA=1 -> CKPH=0; msb first, master, //8 bit (default), 3-wire (default, mode 0), synchronous UCB0CTL0 = UCCKPH | UCMSB | UCMST | UCMODE_0 | UCSYNC; UCB0CTL1 = UCSSEL1 | UCSWRST; //clock from SMCLK; hold in reset UCB0BR1 = 0; //upper byte of divider word UCB0BR0 = 60; //Clock = SMCLK/60 = 100KHz UCB0STAT = UCLISTEN; //Internal loopback; try this since no MISO pin UCB0CTL1 &= ~UCSWRST; //release from reset } void InitPorts(void){ P1OUT = 0; P1DIR = 0xFF; P2OUT = 0; P2DIR = 0xFF; } void InitHallSensor(void){ P2DIR &= ~SENSOR_PIN; //Set pin as input P2SEL |= SENSOR_PIN; //Set pin for Timer1_A CCI1A capture } void itoa(long unsigned int value, char* result, unsigned int base){ // check that the base is legit if (base < 2 || base > 36) { *result = '\0';} char *ptr = result, *ptr1 = result, tmp_char; unsigned int tmp_value; do{ tmp_value = value; value /= base; *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; } while (value); //Apply negative sign if(tmp_value < 0) *ptr++ = '-'; *ptr-- = '\0'; while(ptr1 < ptr){ tmp_char = *ptr; *ptr-- = *ptr1; *ptr1++ = tmp_char; } }