目录
1.实验目标
本实验使用串口1,实现RS485对传功能。
2.实验准备
硬件搭建:ZW-HC32F460-BZ标准版开发板1套
软件搭建:MDK5.22
3.硬件原理
这里我们使用板载的串口转RS485来实现功能。串口对应MCU的USART1,引脚使用PA2(TX)、PA3(RX)。RS485芯片是通过MCU的引脚PH2切换收发模式的。
需要注意:原理图中PA2、PA3通过J19、J20进行跳线切换连接到RS485。
4.驱动代码
RS485控制引脚初始化
将RS485控制引脚PH2设置为输出模式,引脚低电平为接收模式,高电平为发送模式。
static void RS485Int( void )
{
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT( stcPortInit ); //结构体初始化
stcPortInit.enPinMode = Pin_Mode_Out; //设置输出模式
PORT_SetFunc( PortH, Pin02, Func_Gpio, Disable);
PORT_Init( PortH, Pin02, &stcPortInit ); //初始化引脚
PORT_ResetBits( PortH, Pin02 ); //置接收模式
TovrRxInt();
uartInt();//串口初始
}
RS485数据接收函数
tvrRxs.buf数组是存储RS485接收到的数据,tvrRxs.len存储RS485接收到的数据长度。
void TovrRx( u8 ch )
{
if( tvrRxs.lock )
return;
tvrRxs.buf[ tvrRxs.len++ ] = ch;
if( tvrRxs.len > FIFO_MAX_SIZE )
{
tvrRxs.len = 0;
}
tvrRxs.flg = 1;
tvrRxs.ct = tvrRxs.tim;
}
RS485数据发送函数
通过len判断RS485是否接收数据,接收到数据就回发数据。
static void Rx485Dat( void )
{
u32 i, len;
u8 buf[ 100 ];
len = TovrRxRead( buf, 100 );
if( len == 0 )
return;
mRuns.Led2Ct = 10;
//回发数据
PORT_SetBits( PortH, Pin02 );
Ddl_Delay1ms( 5 );
for( i = 0 ; i < len; i ++ )
{
while( Reset == USART_GetStatus( M4_USART1, UsartTxEmpty ) );
USART_SendData( M4_USART1, buf[ i ] );
}
Ddl_Delay1ms( 1 );
PORT_ResetBits( PortH, Pin02 );
}
6.主流程图
与6.3节实验基本一致,主要以下三个不同
- RS485初始化加入了控制引脚初始化;
- 串口中断中加入RS485接收函数;
- 在主循环中回发接收到的RS485数据:
7.实验过程
【第一步:新建/配置工程】
将工程模板复制到实验目录下,将工程名改为RS485。
勾选FWLibCfg.h配置中的CLK_EN、EFM_EN、GPIO_EN、PWC_EN、SRAM_EN、UTILITY_EN、USART_EN选项
【第二步:添加RS485模块驱动】
将TovrRX.c和TovrRX.h复制到\实验13USART中断实验\Hardware\APP路径下,同时将TovrRX.c添加到工程中Hardware/OnBoard下
【第三步:初始化编程】
1)添加Usart头文件
在main.c文件中添加TovrRX.h头文件。
#include "TovrRX.h"
3)RS485初始化
在主函数中调用USART初始化函数RS485Int()。
RS485Int();
【第四步:功能实现】
按照主逻辑编写while(1)功能即可。
int main( void )
{
HardwareInt();
RS485Int();
while( 1 )
{
Rx485Dat();
Ddl_Delay1ms( 1 );
TovrTimCb();
}
}
【第五步:结果验证】
编译代码并下载至开发板运行程序,使用RS485转USB连接到电脑上,打开串口助手进行数据发送,串口数据接收到同样的数据。