-
tiankai001 发表于 2019-3-15 15:40
ADC里面,你把REF寄存器关闭应该可以
ADC问题已经解决
-
tiankai001 发表于 2019-3-15 15:53
LCDVCTL = LCDSELVDD + LCDCPEN; // Mode 2 设置 降低LCD 功耗 片上电荷泵
这句话去 ...
FR6972 LCD显示功耗近20UA,FR4133 LCD显示功耗只有6UA;
MSP430FR4133设置没问题!
-
void CLOCK_Config()// MSP430FR4133
{
P4SEL0 |= BIT1 + BIT2; // Select pin4.1 pin4.2 as crystal function
do
{
CSCTL7 &= ~(XT1OFFG + DCOFFG); // Clear XT1 and DCO fault flag 清除 XT1 DCO 失效标志
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1 & OFIFG); // Test oscillator fault flag 如果失效标志存在
CSCTL4 = SELA__XT1CLK; // IMPORTANT. Select ACLK = XT1 = 32768Hz
}
void LCD_Config(void) // MSP430FR4133
{
uint8_t ui8Cnt;
uint8_t *pLCD = (uint8_t *)&LCDM0;
for (ui8Cnt = 13; ui8Cnt > 0; ui8Cnt--) // Clear LCD memory
*pLCD++ = 0x00; // CLR LCD
SYSCFG2 |= LCDPCTL; // R13/R23/R33/LCDC1/LCDC2 pins selected 设置 LCD功耗
LCDPCTL0 = 0xFFFF;
LCDPCTL1 = 0x01FF; //设置 LCD管脚 L0~L24 pins selected
LCDVCTL = LCDSELVDD + LCDCPEN; // Mode 2 设置 降低LCD 功耗 片上电荷泵
LCDCSSEL0 = 0x000F; // 设置 公共极 COM0~3
LCDCSSEL1 = 0x0000;
LCDM0 = 0x21; // L0 = COM0, L1 = COM1
LCDM1 = 0x84;
LCDCTL0 |= LCD4MUX + LCDLP + LCDON; // 打开LCD: 4-mux 模式
}
-
ADC功耗问题已经找到
ADC12CTL0 &= ~ADC12ENC;
REFCTL0 &= ~REFON;
ADC12CTL0 &= ~ADC12ON; //AD 关闭
-
void CLOCK_Config()// MSP430FR4133
{
P4SEL0 |= BIT1 + BIT2; // Select pin4.1 pin4.2 as crystal function
do
{
CSCTL7 &= ~(XT1OFFG + DCOFFG); // Clear XT1 and DCO fault flag 清除 XT1 DCO 失效标志
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1 & OFIFG); // Test oscillator fault flag 如果失效标志存在
CSCTL4 = SELA__XT1CLK; // IMPORTANT. Select ACLK = XT1 = 32768Hz
}
void LCD_Config(void) // MSP430FR4133
{
uint8_t ui8Cnt;
uint8_t *pLCD = (uint8_t *)&LCDM0;
for (ui8Cnt = 13; ui8Cnt > 0; ui8Cnt--) // Clear LCD memory
*pLCD++ = 0x00; // CLR LCD
SYSCFG2 |= LCDPCTL; // R13/R23/R33/LCDC1/LCDC2 pins selected 设置 LCD功耗
LCDPCTL0 = 0xFFFF;
LCDPCTL1 = 0x01FF; //设置 LCD管脚 L0~L24 pins selected
LCDVCTL = LCDSELVDD + LCDCPEN; // Mode 2 设置 降低LCD 功耗 片上电荷泵
LCDCSSEL0 = 0x000F; // 设置 公共极 COM0~3
LCDCSSEL1 = 0x0000;
LCDM0 = 0x21; // L0 = COM0, L1 = COM1
LCDM1 = 0x84;
LCDCTL0 |= LCD4MUX + LCDLP + LCDON; // 打开LCD: 4-mux 模式
}
-
还有不执行LCD显示,电流就降到8.5UA,那就差不多,LCD显示攻耗近20UA太大了,我现在这样设置有错吗?电路差不多,区别就在R23/LCDCAP 接4.7uF,而FR4133 接0.1uF
VSS--4.7uF -| R23/LCDCAP
VSS--0.1uF -|R03
VSS--0.1uF -|R13
VSS--0.1uF -|R23
程序设置有错吗?
void CLOCK_Config() // MSP430FR6972
{
PJSEL0 = BIT4 | BIT5; // For LFXT
// Configure LFXT 32kHz crystal
CSCTL0_H = CSKEY >> 8; // Unlock CS registers
CSCTL4 &= ~LFXTOFF; // Enable LFXT
do
{
CSCTL5 &= ~LFXTOFFG; // Clear LFXT fault flag 清除 LFXT 失效标志
SFRIFG1 &= ~OFIFG;
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag 如果失效标志存在
CSCTL0_H = 0; // Lock CS registers
}
void LCD_Config(void) // MSP430FR6972
{
//Initialize LCD segments 0 - 15; 18 - 21; 24 ; 28 - 30
LCDCPCTL0 = 0xFFFF;
LCDCPCTL1 = 0x713C;
LCDCPCTL2 = 0x0000; //设置LCD管脚 L0 - L15; L18 - L21; L24 ; 28 - 30 pins selected
// Initialize LCD_C
// ACLK, Divider = 1, Pre-divider = 16; 4-pin MUX
LCDCCTL0 = LCDDIV__1 | LCDPRE__16 | LCD4MUX | LCDLP;
// VLCD generated internally,
// V2-V4 generated internally, v5 to ground
// Set VLCD voltage to 2.60v
// Enable charge pump and select internal reference for it
LCDCVCTL = VLCD_2_96 | VLCDREF_0 | LCDCPEN;
LCDCCPCTL = LCDCPCLKSYNC; // Clock synchronization enabled
LCDCMEMCTL = LCDCLRM; // Clear LCD memory
//Turn LCD on
LCDCCTL0 |= LCDON; // 打开LCD
}
-
void ADC10_Config() // MSP430FR4133
{
CSCTL8 |= MODCLKREQEN;
PMMCTL0 = SVSHE + PMMPW;
PMMCTL2 |= INTREFEN; // 1.5V voltage reference generate
ADCCTL0 = ADCSHT_8 + ADCON; // 256 ADCCLK cycles
ADCCTL1 = ADCSHS_0 + ADCSHP + ADCSSEL_0 + ADCCONSEQ_0; // ADCSC bit SHS,
// MODCLK
// SC-SC 单通道单次
ADCCTL2 |= ADCRES + ADCSR; // 10 bit resolution, 50ksps
ADCMCTL0 = ADCSREF_0 + ADCINCH_13; // Reference AVCC+/AVSS-, Channel 13
ADCIE |= ADCIE0; // Interrupt enable
__delay_cycles(400);
}
ADC中断
case 12: // MSP430FR4133
。。。
PMMCTL2 &= ~INTREFEN; // 关闭内部参考电压 为低功耗
ADCCTL0 &= ~ADCON; //AD 关闭
break;
-
结贴,是常量地址定义有错,FRAM读写没有问题!
-
uint8_t i;
uint32_t *pAddress;
for(i=0;i
-
我读写8 16 32 64都根据他改的
-
由于开发进度很紧,我直接用TI 《MSP430FR4xx 实现的水表》中的程序
其中FRAM读写,只是他用的是程序区FRAM
void FRAMWrite_Long(uint32_t *pFRAM_write_ptr, uint32_t ui32data)
{
SYSCFG0 &= ~PFWP;
*pFRAM_write_ptr = ui32data;
SYSCFG0 |= PFWP;
}
void FRAMWrite_Char(uint8_t *pFRAM_write_ptr, uint8_t ui8data)
{
SYSCFG0 &= ~PFWP;
*pFRAM_write_ptr = ui8data;
SYSCFG0 |= PFWP;
}
pAddress = (uint8_t *)(FRAM_RECORD_BASE + (tRTCData.ui8Year - 13)*120 + (tRTCData.ui8Month - 1)*10);
FRAMWrite_Char(pAddress++,tRTCData.ui8Year);
FRAMWrite_Long((uint32_t *)FRAM_RECORD_ADDRESS,ui32Sum);
ui32Sum = *((uint32_t *)FRAM_RECORD_ADDRESS);
// Fram record address
#define FRAM_RECORD_ADDRESS 0xFF00 // Refresh every 1 second
#define FRAM_RECORD_CHECK 0xFF40 // First record check address
#define FRAM_RECORD_BASE 0xFA00 // Monthly record in stand-alone address
-
while(1)
{
__bis_SR_register(LPM3_bits + GIE); // 进入 LPM3 w/ interrupt
WDTCTL = WDTPW + WDTCNTCL + WDTSSEL0 + WDTIS1; // clear watchdog 4m16s
if(bWorking_flag)
{
…..
}
#ifdef Comm_RS485
_DELAY_CYCLES(1000);
if(bRX_finished)
{
// rs485
Spi_uart2_rx_deal(ui8RX_buffer,ui8TX_buffer);
bRX_finished = false;
}
#endif
}
在程序中加了 _DELAY_CYCLES(1000);差不多30秒后,就通讯正常,比原来快了很多
我有点不明白,平常串口始终在接收状态,一有信号来,就唤醒,晶振和时钟如何稳定下来,延时一小也就对发送启作用
-
昨天写了个测试程序 只有有收到数据,就上传数据01 02 03 04 05 06 00 00
01 02 03 04 05 06固定数据 00 00 是收到的数据,相同数据发两次
刚上电收到是
01 19 74 10 A0 81 0E 01 07 FE
01 19 74 10 A0 81 0E 01 80
01 19 34 18 A0 81 07 00 00
01 09 36 18 A0 81 07 00 00
01 02 03 04 05 06 80 80
最后才收到正确数据,感觉波特率不同步
-
void CLOCK_Config()
{
P4SEL0 |= BIT1 + BIT2; // Select pin4.1 pin4.2 as crystal function
do
{
CSCTL7 &= ~(XT1OFFG + DCOFFG); // Clear XT1 and DCO fault flag 清除 XT1 DCO 失效标志
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1 & OFIFG); // Test oscillator fault flag 如果失效标志存在
CSCTL4 = SELA__XT1CLK; // IMPORTANT. Select ACLK = XT1 = 32768Hz
}
void eUSCIA0_Config()
{
UART_PORT_SEL |= UART_BIT_TXD + UART_BIT_RXD; // set pin as UART function
UCA0CTLW0 |= UCSWRST; // Put eUSCI in reset
UCA0CTLW0 |= UCSSEL__SMCLK; // 8-e-1 LSB SMCLK
UCA0BR0 = 6; // 9600 baud
UCA0BR1 = 0;
UCA0MCTLW = 0x2200 + UCOS16 + UCBRF_13; // 1.04MHz/9600
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
UCA0IE |= UCRXIE; //开接收中断
//UCA0IE &= ~UCTXIE; //关闭发送中断
}
uint8_t Uart_SendFrame(uint8_t *pPtr, uint8_t ui8Length)
{
if(UCA0IE & UCTXIE) return 0; // Last frame hasn't been sent out
if(ui8Length > TXBUF_SIZE) return 0; // Length overflow the buffer
ui8TX_counter = 0; // Clear transfer counter
UCA0TXBUF = pPtr[ui8TX_counter++];
ui8TX_number = ui8Length; // Number of bytes to be sent
UCA0IE |= UCTXIE; // Enable transfer interrupt
return 1; // Send successfully
}
void Spi_uart2_rx_deal(uint8_t *rx_pbuf,uint8_t *tx_pbuf)
{
………
Uart_SendFrame(ui8TX_buffer,Buffcn);
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,USCI_UART_UCTXCPTIFG))
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG:
{ //接收数据
ui8RX_buffer[ui8RX_counter]= UCA0RXBUF;
……..
if(uart2_crc_flag)
{
uart2_crc_flag=false;
if((CRC16_verify(ui8RX_buffer, ui8RX_counter+1))==1)
{
//UCA0IE&=~UCRXIE;//关闭接收中断
bRX_finished = true;//允许发送
}else ui8RX_counter=0;
}
}
break;
case USCI_UART_UCTXIFG:
UCA0TXBUF = ui8TX_buffer[ui8TX_counter++];
if(ui8TX_counter>=ui8TX_number)
{
UCA0IE &= ~UCTXIE; //关闭发送中断
//UCA0IE |= UCRXIE; //开接收中断
ui8RX_counter=0;
}
break;
case USCI_UART_UCSTTIFG: break;
case USCI_UART_UCTXCPTIFG: break;
}
}
void main(void)
{
WM_Initialize(); // System initialize
#ifdef Comm_RS485
HAL_RS485_INIT();
#endif
……
while(1)
{
__bis_SR_register(LPM3_bits + GIE); // 进入 LPM3 w/ interrupt
WDTCTL = WDTPW + WDTCNTCL + WDTSSEL0 + WDTIS1; // clear watchdog 4m16s
if(bWorking_flag)
{
…..
}
#ifdef Comm_RS485
if(bRX_finished)
{
// rs485
Spi_uart2_rx_deal(ui8RX_buffer,ui8TX_buffer);
bRX_finished = false;
}
#endif
}
}
-
MSP430FR4133 code example1有用过,可以
但他晶振用DCO=8MHZ分频
我直接用外部32768
-
FET430UIF仿真,外部供电 串口通信RS232正常
写入MSP430FR4133 就会出现乱码,工作一段时间才正常
LPM3模式下,唤醒通信
-
如果RTC关掉只有7UA
-
查出来,外部参考电压,改用内部参考电压,现在功耗是 19UA到7UA跳变
平常只开RTC,1秒钟定时,LPM3,只在外部中断才唤醒。
这样正常吗?
-
本帖最后由 QIHAO74 于 2016-5-16 16:12 编辑
主要原因找到,是I/O口设置问题MSP430FR4133
现在LMP3模式下在80uA
正常吗?
-
clls2080000 发表于 2016-5-14 17:23
有最新的BSL软件吗
没有