新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2016-11-26
- 在线时间
- 2 小时
|
目前正在调试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接口
|