OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4088|回复: 0

429ZGT6的485驱动

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-11-26
在线时间
2 小时
发表于 2016-11-26 16:28:15 | 显示全部楼层 |阅读模式
目前正在调试RS485驱动,一直有问题,硬件原理图如下:


驱动程序是按照原子开发板的例子修改的,但是就是调试不成功,代码如下:
void RS485_Init(u32 bound)
{
    //GPIO端口设置
        GPIO_InitTypeDef GPIO_Initure;

    //使能引脚初始化
    __HAL_RCC_GPIOF_CLK_ENABLE();           //开启GPIOB时钟
           

    GPIO_Initure.Pin=GPIO_PIN_8; //PB1,0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
       
    //HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8,GPIO_PIN_SET);        //PB0置1

        //////

        //PCF8574_Init();                         //初始化PCF8574,用于控制RE脚
       
        __HAL_RCC_GPIOF_CLK_ENABLE();                        //使能GPIOA时钟
        __HAL_RCC_UART7_CLK_ENABLE();                        //使能USART2时钟
       
        GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_6; //PA2,3
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;                //高速
        GPIO_Initure.Alternate=GPIO_AF8_UART7;        //复用为USART2
        HAL_GPIO_Init(GPIOF,&GPIO_Initure);                   //初始化PA2,3


    //USART 初始化设置
        USART2_RS485Handler.Instance=UART7;                                    //USART2
        USART2_RS485Handler.Init.BaudRate=bound;                        //波特率
        USART2_RS485Handler.Init.WordLength=UART_WORDLENGTH_8B;        //字长为8位数据格式
        USART2_RS485Handler.Init.StopBits=UART_STOPBITS_1;                //一个停止位
        USART2_RS485Handler.Init.Parity=UART_PARITY_NONE;                //无奇偶校验位
        USART2_RS485Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;        //无硬件流控
        USART2_RS485Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式
        HAL_UART_Init(&USART2_RS485Handler);                                //HAL_UART_Init()会使能USART2

    __HAL_UART_DISABLE_IT(&USART2_RS485Handler,UART_IT_TC);
#if EN_USART2_RX
        __HAL_UART_ENABLE_IT(&USART2_RS485Handler,UART_IT_RXNE);//开启接收中断
        HAL_NVIC_EnableIRQ(UART7_IRQn);                                        //使能USART1中断
        HAL_NVIC_SetPriority(UART7_IRQn,3,3);                                //抢占优先级3,子优先级3
#endif       
  RS485_TX_Set(0);                                        //设置为接收模式       
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
        RS485_TX_Set(1);                        //设置为发送模式
        HAL_UART_Transmit(&USART2_RS485Handler,buf,len,1000);//串口2发送数据
        RS485_RX_CNT=0;          
        RS485_TX_Set(0);                        //设置为接收模式       
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf[i]=RS485_RX_BUF[i];       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                RS485_RX_CNT=0;                //清零
        }
}
//RS485模式控制.
//en:0,接收;1,发送.
void RS485_TX_Set(u8 en)
{
        //PCF8574_WriteBit(RS485_RE_IO,en);
    if(en == 1)
    {
       HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8,GPIO_PIN_SET);
    }
    else
   {
       HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8,GPIO_PIN_RESET);
   }
}


主要就是将原子的例子中的UART2换成了UART7,同时用PF8切换485的发送和接收

求指导

485接口

485接口
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 16:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表