打印
[ZLG-MCU]

485通信程序不能进中断

[复制链接]
2596|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lujiang006|  楼主 | 2008-4-2 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位工程师帮忙啊!一个485发送数据的程序折磨几天了,都不见发出数据。前辈提点意见吧

#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "interrupt.h"
#include "sysctl.h"
#include "uart.h"

#define RE_DE      GPIO_PIN_7
#define UART1_PIN  GPIO_PIN_2|GPIO_PIN_3

static volatile const unsigned char *g_pucBuffer = 0;        // 发送数据缓冲区指针
static volatile unsigned long g_ulCount = 0;            // 发送数据个数
static const unsigned char g_pucString[] = "123456789ABCDE";

void WaitJTAG(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2);
  if (GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2) == 0X00)
  {
    for (;;);
  }
  SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOA);
}

void UART1_ISR(void)                        // UART1中断服务函数
{
    unsigned long ulStatus;
    ulStatus = UARTIntStatus(UART1_BASE, true);           // 获得中断状态。
    UARTIntClear(UART1_BASE, ulStatus);                 // 清除等待响应的中断。
    if(ulStatus & UART_INT_TX)                          // 检查是否有未响应的传输中断。
    {
        while(g_ulCount && UARTSpaceAvail(UART1_BASE))             // 处理传输中断。
        {
           UARTCharNonBlockingPut(UART1_BASE, *g_pucBuffer++);  // 发送下一个字符。
           g_ulCount--;                                         // 发送字符数自减。
        }
    }
}


void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount) // 发送数据处理函数
{  
    while(g_ulCount);                        // 等待,直到之前的字符串发送完毕。
    g_pucBuffer = pucBuffer;                              // 保存待传输的数据缓冲。
    g_ulCount = ulCount;                    // 保存计数值。
    while(UARTSpaceAvail(UART1_BASE)&&g_ulCount)                        // 处理传输中断。
    { 
        UARTCharNonBlockingPut(UART1_BASE, *g_pucBuffer++);    // 发送下一个字符。
        g_ulCount--;                        // 发送字符数自减。  
    }                                                    // 使能UART发送。
}

int main(void)
{
    WaitJTAG(); 
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);                              // 设置晶振为时钟源。
      
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPinTypeUART(GPIO_PORTD_BASE, UART1_PIN);                   // 设置PD2,PD3为RXD,TXD 
    GPIODirModeSet(GPIO_PORTC_BASE, RE_DE, GPIO_DIR_MODE_OUT);     // 设置PC7为输出
    GPIODirModeSet(GPIO_PORTD_BASE, UART1_PIN, GPIO_DIR_MODE_HW); // 设置PD2和PD3为UART引脚输出
                                                                   // (PD2->RXD,PD3->TXD) 
    
    UARTConfigSet(UART1_BASE, 9600, (UART_CONFIG_WLEN_8 |         // 配置UART 为 9600波特率,     
                                     UART_CONFIG_STOP_ONE |       //  8-N-1模式发送数据。
                                     UART_CONFIG_PAR_NONE) & 0xFFFFFFEF);   
    IntMasterEnable();                                            // 使能处理器中断
    GPIOPinWrite(GPIO_PORTC_BASE, RE_DE, 0);                      // 设置PC7为低电平
                                                                    
    UARTIntEnable(UART1_BASE, UART_INT_TX);                       // 使能UART1发送中断
    IntEnable(INT_UART1);
//    UARTEnable(UART1_BASE);    
    GPIOPinWrite(GPIO_PORTC_BASE, RE_DE, RE_DE);                  // 将RS485设置为发送模式
    UARTSend(g_pucString, sizeof (g_pucString) - 1);              // 向UART发送一个字符串。  
}

相关帖子

沙发
zlgmcu| | 2008-4-3 08:34 | 只看该作者

main()函数最后要加个死循环

(zlgmcu_wdx)

使用特权

评论回复
板凳
molink| | 2011-8-28 14:52 | 只看该作者
mark!

使用特权

评论回复
地板
FVJFIFE| | 2011-8-30 16:28 | 只看该作者
这个应该是常识吧

使用特权

评论回复
5
年轻不再| | 2011-9-21 21:59 | 只看该作者
围观了。

使用特权

评论回复
6
明天我还来| | 2011-9-27 12:28 | 只看该作者
多接触就好了。

使用特权

评论回复
7
coco11| | 2011-10-24 14:18 | 只看该作者
:handshake

使用特权

评论回复
8
爱在2012| | 2011-10-25 21:36 | 只看该作者
路过学习一下。

使用特权

评论回复
9
jingbaobao| | 2011-11-24 21:06 | 只看该作者
mark 多看多看,jiuok。

使用特权

评论回复
10
FVJFIFE| | 2011-11-24 22:02 | 只看该作者
好多年前的帖子了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

0

粉丝