本帖最后由 mouxiang 于 2014-12-10 11:06 编辑
想请教大家一个问题。
使用了MSP430的两个串口,UART0和UART1。上位机通过UART0与MSP430通信,根据其发送过来的指令,MSP430会启动UART1发送相应的指令去查询一个485设备,然后将查询到的值通过UART0回送给上位机。UART0和UART1的波特率都设定为115200,这样一个通信周期为7.5~8ms。
使用了定时器A,其中,A0的周期为2ms,A1的周期为100us。在A0中我打开了总中断,这样A1的中断能够打断A0的中断,从而使得100us定时器能够准确定时。在A0的中断服务程序中,我放了一些判断代码和IO操作的代码,例如获取光电管状态的代码,但是不多。现在的问题是,MSP430运行一段时间后会发生复位。如果我将获取光电管状态的代码放在main中执行,就不会复位了。
我比较迷惑的是,造成复位的原因是定时器呢还是UART通信?或者是两者共同造成的?因为我放在定时器中断服务中的代码的执行时间应该是很短的,不会超过1ms,照理说那段代码放在定时器里和放在main中是没什么区别的。
各位朋友如果有这方面的经验,还请指点一下,十分感谢!
整个代码比较复杂,各种命名的含义也不太好解释,我贴出来大家也不一定看得明白。所以我后面会陆续将一些函数做一些简化修改会贴出来。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- //初始化串口通信UART0, UART0为控制板与PC机的通信
- void InitUART0(void)
- {
- P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
-
- ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
-
- UCTL0 |= CHAR; // 8-bit character, USART0
- UTCTL0 |= SSEL1; // UCLK = SMCLK, USART0
- if( ((P4IN&0x04)>>2) == 1){//根据工作模式确定波特率,如果MODE_INPUT0为0,即P4.2为1,则采用57600波特率
- UBR00 = 0x8A;//0x45; // USART0,波特率:57600
- UBR10 = 0x00;//0x00; //
- UMCTL0 = 0xDE;//0xAA; // Modulation
- }
- else{//否则采用115200波特率
- UBR00 = 0x45;//0x45; // USART0,波特率:115200
- UBR10 = 0x00;//0x00; //
- UMCTL0 = 0x4A;//0xAA; // Modulation
- }
- UCTL0 &= ~SWRST; // USART0,SWRST复位
- IE1 |= URXIE0; // USART0,接收中断允许
- }
- //初始化串口通信UART1
- void InitUART1(void)
- {
- P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXD
-
- ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
-
- UCTL1 |= CHAR; // 8-bit character, USART1
-
- UTCTL1 |= SSEL1; // UCLK = SMCLK, USART0
-
- if( ((P4IN&0x04)>>2) == 1){//根据工作模式确定波特率,如果MODE_INPUT0为0,即P4.2为1,则采用57600波特率
- UBR01 = 0x8A;//0x45; // USART0,波特率:57600
- UBR11 = 0x00;//0x00; //
- UMCTL1 = 0xDE;//0xAA; // Modulation
- }
- else{//否则采用115200波特率
- UBR01 = 0x45;//0x45; // USART0,波特率:115200
- UBR11 = 0x00;//0x00; //
- UMCTL1 = 0x4A;//0xAA; // Modulation
- }
-
- UCTL1 &= ~SWRST; // USART1,SWRST复位
-
- IE2 |= URXIE1; // USART1,接收中断允许
- }
- void UART0_LONG_CMD_Send(void)//附加协议长指令发送函数,一条指令24个字节
- {
- unsigned i;
- COM2_DE_HIGH();//P4.0输出高电平,使能COM2的MAX485的DI口用于输出数据
- for(i=0; i<MAX_BYTES_LONG_CMD; i++)
- {
- TXBUF0=UART0_Long_CMD_buffer[i];
- while((UTCTL0&0x01)==0);
- if(UART0_Long_CMD_buffer[i]==CMDEND_EXTRA)
- {
- COM2_DE_LOW();//P4.0输出低电平,禁止COM2的MAX485的DI口,等待数据传入
- return;
- }
- }
- }
- void UART1_Send(unsigned * UARTRX_buf)
- {
- unsigned i;
- COM1_DE_HIGH();//P4.1输出高电平,使能COM1的MAX485的DI口用于输出数据
- for(i=0; i<Max_bytes_UART1; i++)
- {
- TXBUF1=UARTRX_buf[i];
- while((UTCTL1&0x01)==0);
- }
- COM1_DE_LOW();//P4.1输出低电平,禁止COM1的MAX485的DI口,等待数据传入
- }
复制代码一周热门 更多>