gd32f130 G8U6RS485 实现串口接收数据

本文介绍了如何在GD32F130单片机上使用RS485进行串口数据接收。详细讲述了RS485串口初始化、定时器配置、串口1中断服务函数和RS485接收函数的实现,并提供了主函数及完整代码示例,以实现lora通信网关的RS485串口通信功能。
摘要由CSDN通过智能技术生成

最近在实现lora通信网关的代码,用到了RS485实现串口接收数据,其主要代码及完整代码如下:

RS485串口初始化:


/*串口1初始化*/
void rs485_usart_init(){
   
    rcu_periph_clock_enable(RCU_USART1); //使能串口时钟

    usart_disable(USART1);
    usart_baudrate_set(USART1, baudrate); //波特率
    usart_parity_config(USART1, parity);  //奇偶校验位
    usart_word_length_set(USART1, wlen);  //数据位
    usart_stop_bit_set(USART1, stblen);   //停止位

    usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE); //禁用RTS
    usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);//无硬件数据流控制

    usart_receive_config(USART1, USART_RECEIVE_ENABLE);   //使能接收
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);//使能发送
    usart_enable(USART1);
    drv_usart_nvic_init();
    usart_interrupt_enable(USART1, USART_INT_RBNE);
	
}

定时器初始化

void Timer_init(void)
{
   
   
		timer_parameter_struct timer_initpara;
		/*使能时钟*/
    rcu_periph_clock_enable(RCU_TIMER1);
		
     timer_deinit(TIMER1);
    /* TIMER0 configuration */
    timer_initpara.prescaler         = 99;   //分频系数
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP; //计数方式
    timer_initpara.period            = 7199; //重载周期
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1; //时钟分频因子
    timer_initpara.repetitioncounter = 0; 
    timer_init(TIMER1,&timer_initpara);  //初始化
	  timer_interrupt_enable(TIMER1,TIMER_INT_UP);//允许中断
		nvic_irq_enable(TIMER1_IRQn , 1, 1);
    timer_disable(TIMER1);
}

串口1中断服务函数

void USART1_IRQHandler(void)
{
   
  uint32_t res; 
		
  if( RESET != usart_flag_get(USART1, USART_FLAG_RBNE)) //接收到数据
    {
   
		
      res=usart_data_receive(USART1);
				
		if ((RS485_RX_STA & (1<<15)) == 0)		//接收完的一批数据,还没有被处理,则不再接收其他数据
		{
    
			if (RS485_RX_STA <rs485_rx_max)	//串口1接收缓冲区还没满,还可以接收数据
			{
   
				timer_counter_value_config(TIMER1,0); //计数器清空
			    			
				if(RS485_RX_STA == 0) 			//一次接收的开始时USART3_RX_STA = 0;
				{
   
					 timer_enable(TIMER1);    		//使能定时器1
				}
				 RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
				 RS485_RX_STA++; //接收数据增加 1 
				 RS485_RX_CNT++;
				
			}
			else          						//定义的最大缓冲区满了
			{
   
				RS485_RX_STA |= 1<<15;			//强制标记接收完成
			
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值