新唐cortex-m0之RS485通讯

news/2025/2/3 21:59:50/

  又有好久没有更新博客了,不要认为我又去偷懒了,因为笔者开学了,但是我的新唐的学习并没有结束。这么长时间没有写博客因为我在学习的过程中又遇到了纠结的问题,这个问题从9月1日到现在快三个星期了,就是RS485通讯,特此写下自己的错误,避免看到文章的人再走弯路。

  如果大家用的新唐的板子的话,而又要用485通讯功能,一定会去参考自带的UART_DEMO示例程序。新唐的实例程序分为两种类型,一种就是寄存器版本的,一种叫做API版本的。如果用API写程序的同仁们,一定会非常欣慰,因为这个示例程序就是485的,只要改改就行了,而用寄存器版本写程序的一定非常苦恼(笔者就是一直用寄存器版本的写程序),因为它就是一个普通的UART通讯功能,很多人会想着看看API的版本的,慢慢翻译成寄存器版本的,但是两者有些区别,经过这两天的深入,我已经把API版本改成了寄存器版本,改的是面目全非,因为我的初始化代码几乎和API的版本的一样,但是它能运行出结果,而我不行,这如何不叫人纠结呢?

  在新唐的两个版本中,有这样两个区别,大家需要注意的:

  1.   API版本中,用的UART时钟是内部的22MHZ的晶振,大家一定看到了算晶振的波特率的函数,所以没有深入看,只知道可以得出自己想要的晶振就可以了(一般用9600的波特率),而寄存器版本中用的还是外部的12MHZ晶振

  2.    第二个不同的地方也是我纠结了3个星期终于发现了,也是我的问题所在的,就是API版本中,配置了管脚为RTS0功能,而寄存器版本中没有,所以即使后面初始化和API非常相似,也出不来结果,这是一个很重要的原因!(RTS0功能就是自动方向控制,是485中用来控制收发的)

解决了这两个问题,485通讯来说,基本就可以平坦大道了,但是这样说也许很空虚,下面附上485的电路图和485初始化的寄存器版本的代码,希望对大家有帮助,只是新唐Cortex-M0的代码,如果不是这个芯片的可以看看步骤,应该也没有什么太大问题。

 

如下图就是RS85通讯的电路图:

 

下面是代码部分:

 

#define UARTClkSource_in22MHZ   (CLKSEL1 = ((CLKSEL1 & (~UART_CLK)) | UART_22M))
#define UART0_Clock_EN    APBCLK |= UART0_CLKEN   // Enable UART0 clock
 
void UART_Init(void)
{/* Step 1. GPIO initial */ P3_MFP &= ~(P31_TXD0 | P30_RXD0);   P3_MFP |= (TXD0 | RXD0);    		//P3.0 --> UART0 RX//P3.1 --> UART0 TXP0_MFP &= ~(P03_AD3_RTS0 | P02_AD2_CTS0);P0_MFP |= (RTS0 | CTS0);			//P0.3---->RTS0自动方向控制//这里就是配置的地方,笔者就是这里错了,导致了3个星期没有出来,		/* Step 2. Enable and Select UART clock source	*/UART0_Clock_EN;         //UART Clock Enable, APBCLK[16]:1//UARTClkSource_ex12MHZ;  //UART Clock is ext12MHz, CLKSEL1[25,24]: 00UARTClkSource_in22MHZ;  //使用内部22MHZ晶振CLKDIV &= ~(15<<8); 	//UART Clock DIV Number = 0;/* Step 3. Select Operation mode */IPRSTC2 |= UART0_RST;   //Reset UART0IPRSTC2 &= ~UART0_RST;  //Reset endUA0_FCR |= TX_RST;      //Tx FIFO ResetUA0_FCR |= RX_RST;      //Rx FIFO ResetUA0_FCR |= RFITL_1;		//设置为1个字节触发中断UA0_LCR &= (~SPE);UA0_LCR &= (~EPE);UA0_LCR &= (~PBE);     	//Parity Bit Disable  校验禁止UA0_LCR &= ~WLS;UA0_LCR |= WL_8BIT;     //8 bits Data Length  8位长度UA0_LCR &= NSB_ONE;     //1 stop bit          1位停止位/* Step 4. Set BaudRate to 115200*///UA0_BAUD |= DIV_X_EN;   //Mode2:DIV_X_EN = 1//UA0_BAUD |= DIV_X_ONE;  //Mode2:DIV_X_ONE =1//上面是使用12M晶振的波特率设置
  //下面的是使用22M晶振波特率的设置
   
    UA0_BAUD &= (~(1<<29));		//    UA0_BAUD |= (1<< 29);   //Mode2:DIV_X_EN = 1UA0_BAUD &= (~(1<< 28));	        //    UA0_BAUD |= (1<< 28);  //Mode2:DIV_X_ONE =1
 
    /* For XTAL = 12 MHz *///UA0_BAUD |= ((12000000 / 9600) -2);	//Set BaudRate to 115200;  UART_CLK/(A+2) = 
                                                //115200, UART_CLK=12MHz
    /*FOr 12MHz*/
    UA0_BAUD |= ( 22118400UL / 9600/16  -2);
 
     /* For XTAL = 11.0592 MHz *///UA0_BAUD |= ((11059200 / 115200) -2); //Set BaudRate to 115200;  
                                             //UART_CLK/(A+2) = 115200, UART_CLK=12MHz
}

 

void initRS485(void) {UA0_FUN_SEL = RS485_EN;      //设置为485功能UA0_FCR |= (RX_DIS);      //禁止接收器接受

 UA0_RS485_CSR |= RS485_NMM;    //设置为485普通操作模式UA0_RS485_CSR |= RS485_AUD;    //设置为控制自动方向模式

 

 /* 开启UART0中断 */UA0_IER |= RDA_IEN;       //开启可接受数据中断和UA0_IER |= RLS_IEN;       //接收器上中断状态使能,是一个错误中断,见M0手册

 NVIC_ISER |= UART0_INT; // NVIC_IPR3 |= UART0_PRI0;      //设置优先级为3(最小优先级) }


 void initRS485(void){UA0_FUN_SEL = RS485_EN;					//设置为485功能UA0_FCR |= (RX_DIS);					//禁止接收器接受UA0_RS485_CSR |= RS485_NMM; 			//设置为485普通操作模式UA0_RS485_CSR |= RS485_AUD;				//设置为控制自动方向模式//	UA0_IER |= AUTO_RTS_EN;
//	UA0_FCR  |= RTS_TRI_4;
//	UA0_MCR |= (LEV_RTS_H);				    //设置RTS为1,使能485驱动器/* 开启UART0中断 */UA0_IER	|= RDA_IEN;						//开启可接受数据中断和UA0_IER |= RLS_IEN;						//接收器上中断状态使能NVIC_ISER |= UART0_INT;
//	NVIC_IPR3 |= UART0_PRI0;		  		//设置优先级为3(最小优先级)}


 


http://www.ppmy.cn/news/137287.html

相关文章

RS485——RS485通信基础理论与STM32测试

1.优劣 优势&#xff1a;RS485的可靠传输距离远&#xff0c;接线简单成为了相对于RS232的最大优势。 不足&#xff1a;RS485总线是一种常规的通信总线&#xff0c;它不能够做总线的自动仲裁&#xff0c;也就是不能够同时发送数据以避免总线竞争&#xff0c;所以整个系统的通信…

RS485基本特性

概念 RS-485是美国电子工业协会&#xff08;EIA&#xff09;在1983年批准了一个新的平衡传输标准&#xff08;balanced transmission standard&#xff09;&#xff0c;EIA一开始将RS&#xff08;Recommended Standard&#xff09;做为标准的前缀&#xff0c;不过后来为了便于识…

UART/RS485/RS232

RS485和RS232是物理总线。 RS232 传输距离大概15米左右只允许一对一通信全双工 RS485 传输距离大概1200米总线上允许接多达32个发射器和43个接收器半双工 UART UART是基于RS485/RS232/USB等物理层上层通信协议。全双工和半双工是物理链路决定的&#xff08;有的应用层协议…

485通信详解

上边是我一直在用的485通信自动收发电路&#xff0c;不但要把电路送给你&#xff0c;还要把电路原理给你讲明白了。实测波特率9600不会有问题&#xff0c;但是&#xff0c;波特率115200的话&#xff0c;曾经出现过问题。 我们先看看普通的收发电路。 普通的485电路&#xff0…

常见通信协议之UART、RS485

UART 通用异步收发器一种通用的串行、异步通信总线&#xff0c;该总线有两条数据线&#xff0c;可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质—高低电信号并行通信—一次性传输多个位—布线难度高—存在数据干扰串行通信—逐次传输单工通信—单向通信双工…

RS485简介

▉ RS-485概述 RS-485和RS-232一样&#xff0c;都是串行通信标准&#xff0c;现在的标准名称是TIA485/EIA-485-A&#xff0c;但是人们会习惯称为RS-485标准&#xff0c;RS-485常用在工业、自动化、汽车和建筑物管理等领域。 RS-485总线弥补了RS-232通信距离短&#xff0c;速率低…

485接口

485接口 串口 串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;简单说只是物理层的一个标准。没有规定接口插件电缆以及使用的协议&#xff0c;所以只要我们使用的接口插件电缆符合串口标准就可以在实际中灵活使用&#xff0c;在串口接口标准上使用各种协议…

联想Z485安装64位ubantu

开始今天的正式写作之前不得不吐槽一下联想电脑&#xff0c;真的是很垃圾&#xff01;联想Z485使用的是AMD的处理器&#xff0c;性能差的很&#xff0c;更让人不能忍的是&#xff0c;居然不能正常安装64位ubantu。这个情况让那些想在自己笔记电脑上安装TensorFlow的人头都大了一…