我的测试证明,MSP430FR5739中的PxSELC寄存器是个废品,没有意义的存在着。
不知手中有5739板子的同僚们,你们的PxSELC是否起作用了呢?
我的结论并不权威,甚至可能是谬论,不知道坛子里是否有权威人士出来解释一下,是我不会用还是这个片子确实存在这样的问题,强烈要求TI的专家出来给个解释。
举个例子:
按手册的描述,PxSELC是用来同时置位PxSEL0和PxSEL1的
例如可以用P2SELC |= BIT0;来代替下面这两句
P2SEL0 |= BIT0;
P2SEL1 |= BIT0;
但实际情况操作PxSELC却没有任何的反应。(测试环境:IAR for MSP430 5.30)
言归正传,我写了个用TB2产生PWM控制LED8的测试程序,让LED8一闪一闪。
FR5739共有5个Timer(TA0,TA1,TB0,TB1,TB2),每个Timer包含3个捕获/比较寄存器,作为比较寄存器的时候,可以用来PWM输出,一般每个定时器有可以有两路PWM输出。夜深了,不多写了,上程序了。
/*******************************************************************************
* Author : lcofjp
* Date : 2011-12-11
* Description : test the EXP430FR5739 board
*******************************************************************************/
#include <msp430.h>
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
CSCTL0_H = 0xA5;
CSCTL1 |= DCOFSEL0 + DCOFSEL1; // Set max. DCO setting
CSCTL2 = SELA_1 + SELS_3 + SELM_3; // set ACLK = VLO; MCLK = DCO
CSCTL3 = DIVA_0 + DIVS_3 + DIVM_3; // set all dividers
//init LED, TB2.2 / LED8
P3SEL1 &= ~BIT7;
P3SEL0 |= BIT7;
P3DIR |= BIT7;
//init TB2
TB2CCTL0 = CCIE; // TB2CCR0 interrupt enabled
TB2CCTL2 = OUTMOD_3; // Set/Reset Mode
TB2CCR0 = 1000;
TB2CCR2 = 1;
TB2CTL = TBSSEL_2 + MC_1; // SMCLK, up mode
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
#pragma vector = TIMER2_B0_VECTOR
__interrupt void TIMER2_B0_ISR(void)
{
static int cnt = 1, dir = 0;
//dir: 0, increase; 1, decrease
if (dir)//decrease
{
TB2CCR2 = --cnt;
if (cnt == 0)
dir = 0;
}
else
{
TB2CCR2 = ++cnt;
if (cnt == 1000)
dir = 1;
}
}