新唐cortex-m0之RS485通讯

STM32外围电路硬件解析 复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时, 阅读详情

  又有好久没有更新博客了,不要认为我又去偷懒了,因为笔者开学了,但是我的新唐的学习并没有结束。这么长时间没有写博客因为我在学习的过程中又遇到了纠结的问题,这个问题从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 TX

    P0_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]: 00
    UARTClkSource_in22MHZ;  //使用内部22MHZ晶振
    CLKDIV &= ~(15<<8); 	//UART Clock DIV Number = 0;
														  
    /* Step 3. Select Operation mode */
    IPRSTC2 |= UART0_RST;   //Reset UART0
    IPRSTC2 &= ~UART0_RST;  //Reset end
    UA0_FCR |= TX_RST;      //Tx FIFO Reset
    UA0_FCR |= RX_RST;      //Rx FIFO Reset
    UA0_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 = 1
    UA0_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(最小优先级)
 }


 

基于新塘51单片机的485通信 基于新塘51单片机的485通信 序言 最近有一个项目用新塘的51FB9A单片机做时控开关(上位机控制)控制继电器,但是我原来也没整过485啊,本来以为这玩意很难。没想到才了一些坑之后还觉得挺简单的。这玩意就是串口嘛。没啥难的,485都已经20年了基本上,很多资料都是大把的多。 485介绍 1. Modbus总线协议的一种。相比于232,485有更好的传输速度和更远的传输距离,更好的抗干扰性。 2. 基本上很多的远距离串行通信都是用的CANBUS和RS485,我因为工作原因所以也使用的是485。 3.回顾一下 阅读详情

相关推荐

灵思科电子科技—新唐 Cortex - m0 RS-485的使用

最近在完成一个modbus网关的项目需要将服务端下发的数据流用485接口和从机进行通讯。 带485接口的物联网网关 作为一枚入行两年的资深小白,开发的第一步当然是打开Demo,拷贝它学习它。 从注释来看样例程序使用的是自动方向控制模式(AUD)。再看一下DataSheet的介绍,我了解到IC的UART控制器本身支持的模式共三种:RS-485 普通多点操作模式(NMM),RS-48...

Leanthink的博客 1366

嵌入式开发--RS-485通讯的问题

RS-485一般简称485总线,是最常用的工业总线之一,一般采用2线的半双工模式,用差分方式收发信息。最高速度可达10M BPS。单片机使用485总线时,是用UART或USART接口,通过RS-485收发器完成信号的输入和输出。常用的芯片有MAX485,MAX3485,SP3485等等。 硬件很简单,RO和DI连接到单片机的UART接口,是数据的收发引脚,RE和DE连通,接到单片机的GPIO,以控制数据流的方向,是输入还是输出。 连接到UART2,具体设置如下: 这些参数需要根据你的设置要求进行,异步模式

深圳五月花--老李的森林 4422

基于单片机的modbus从机程序

基于新唐M031的modbus从机程序 一 、开发思路 我这里开发的平台是新唐M031,它是Cortex-M0的内核、32位单片机。因为要和上位机进行RS485通讯,所以选用了Modbus-RTU来作为通讯协议。我这是用串口接收中断+定时器中断来接收一帧数据,然后modbus从机程序自己手撸。 二、 Modbus介绍 modbus没什么好介绍的,熟悉下功能码就ok了。上链接 https://www.cnblogs.com/endv/p/8650491.html 三、 串口初始化及...

qq_42989787的博客 6513

UART接口说明

UART

m0_37349613的博客 1293

Elfin-EW11 WiFi转RS485模块工业应用解析

串口通信与网络协议转换是工业物联网的核心技术,通过将RS485等传统工业总线协议转换为TCP/IP网络协议,实现设备远程监控与数据采集。Modbus TCP作为工业领域广泛应用的通信协议,其网关设备需要兼顾实时性、稳定性和安全性。Elfin-EW11系列模块采用ARM Cortex-M3处理器,支持-40°C~85°C宽温工作,具备6kV静电防护和1500Vrms隔离设计,在楼宇自动化、能源监控等场景中表现优异。该模块支持Modbus TCP协议转换和透明传输模式,通过WiFi连接实现RS485设备无线组网

weixin_30562507的博客 459

嵌入式Modbus TCP通讯模块设计

摘要:本文迎合PLC应用网络化发展的需求,提出一种基于嵌入式的Modbus RTU转Modbus TCP协议转化的通讯模块设计方法。该设计能简单、低成本、便捷、可靠的把现有支持Modbus RTU协议的PLC应用于以太网互联。 关键字:PLC;Modbus RTU;Modbus TCP     一、引言 Modbus应用层协议由美国Modicon公司(现为施耐德电气旗下品牌)于1979年

liguangyong的专栏 3722

新唐cortex-m0 RS485的简单通讯

转载:http://chenbin28.blog.163.com/blog/static/59928674201042895310243/ RS485收发流硬件自动控制电路   这是RS485硬件流自动控制,只要你的控制器UART支持RTS功能,即可。 RTS0电平控制,牵扯到一个修改触发电平的问题! 需要设置UA_MCR这个寄存器的LEV_RT

xingyuan1hao的专栏 3119

从协议转换网关看工业通信的融合与创新:以EtherCAT与RS485互通为例

本文深入解析EtherCAT与RS485协议转换网关的技术原理与应用实践。通过分层架构设计和智能数据映射,网关实现了高速工业以太网与可靠串行通信的无缝融合,为智能仓储等工业自动化系统提供了高效、稳定的通信解决方案,并探讨了其配置优化与未来发展趋势。

java5的博客 624

新唐cortex-m0,RS485通讯(二),一个硬币的作用

最近笔者画的PCB板子回来了,但是调试485功能的时候,出现了问题     用过485的朋友们都知道,485芯片有两个引脚是控制收发方向的,如果把新唐m0串口配置成485功能,它内部就会有RTS0来控制收发方向:如图: 上图是个实验电路,新唐M0中RTS0的方向正好和485的收发控制方向一致,即RTS0为低,485为接受功能   而笔者的PCB板子上用的是下图:   我们可以看到

memoryjs的专栏 4305

CortexM3的UART

UART的定义Universal Asynchronous Receiver/Transmitter 通用异步收发器 UART是一种典型的异步穿行通信接口,支持双向通信,可以实现全双工数据传输 串口与通用串行通信口是两回事 (USB通用串行接口与老串口(也叫COM口,通讯口)不是一个意思,老串口在很老的机器上或现在的电脑上都有,主要用于低速设备通讯用,多用于MODEM——电话调制解调器,已

ethenQQQ的博客 908

爱思控无刷电机驱动器选型与RS485/CANopen实战调试指南

无刷电机驱动器是现代运动控制系统的核心执行单元,其本质是将上位机指令转化为精准的电流、速度与位置控制信号的智能功率接口。工作原理基于三闭环控制架构(电流环为内环、速度环居中、位置环为外环),依赖高精度采样、实时PWM调制与低延迟通信反馈。技术价值体现在响应带宽、同步精度与抗干扰鲁棒性三大维度,直接决定产线节拍稳定性、多轴协同一致性及设备长期可靠性。典型应用场景涵盖自动化装配线、光伏跟踪支架、精密绕线设备及包装机械等对动态性能与通讯确定性要求严苛的工业现场。本文聚焦国产工业级代表——爱思控AQMDBLS系列,

weixin_34238633的博客 380

DMA+串口空闲中断实现RS485不定长数据接收和发送

首先此篇文章仅作为对RS485不定长数据的接收与发送的一种探讨,方式不止一种,本文是我的一种愚见罢了。其次,单片机开发并不难,我们只是要要了解到有这么一种方式可以实现想要的功能,那么就基本离成功不远了,耐心看手册耐心调试程序,没有不能完成的事情的。

C_white_llj的博客 4127

STM32H743VIT6 KEIL RS485DMA发送和接受

本文介绍了RS485通信的全双工和半双工模式特点,以及基于STM32CubeMX的USART2配置过程。详细说明了代码实现,包括发送/接收缓冲区定义、DMA传输配置及回调函数处理。测试结果表明,该系统实现了RS485通信功能,支持数据收发与中断处理,适用于工业控制等场景。通过STM32CubeMX图形化配置工具简化了硬件初始化流程,提高了开发效率。

zq4132的专栏 226

MCU中RS485接口设计

RS485接口具有抗干扰性强,适合长距离传输和多站点通讯等特点,因此在工业控制中被普遍使用。MCU只有UART接口,如果需要使用RS485通讯,需要外面加一个Transceiver。由于RS485工作在半双工模式,因此发送和接收的方向切换是设计过程中的一个重要问题。通常的接口电路有以下三种: 1)第一种方式是将MCU的UART TXD端通过控制三极管进行信号反转,然后接到Transceiver

Wuya Blog 1万+

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1898

SVG绘制圆环进度条

在我们的大屏可视化项目中,经常会用到各种各样的图表。与传统的表格展示、枯燥的文字阐述相比,图表展示则使用户看起来更加直观、数据的展示则更加一目了然。本文基于svg绘图技术结合前端技术栈vue,以工作中常用的环形进度条为例,简单阐述一下绘制进度条的一些思路。............

qq_40289557的博客 8361

【北京迅为】《STM32MP157开发板使用手册》- 第二十九章Cortex-M4串口实验

TTL电平是就是指我们的处理器上具有串口功能的引脚直接引出来,他的电平就是TTL的(高电平表示1,低电平表示0)。选择完成之后,点击右下角的Debug按钮,点击之后,会进行再一次的编译,编译完成之后会弹出如下内容(作者用的是J-LinK),这里弹出的是J-link关于设备的选择,不同调试器的弹窗可能会不同。由于现在的电脑基本都没有外接串口了,但是串口设备在我们嵌入开发中非常常用,为了解决这个问题,市面上出现了很多的usb转串口模块,他们用到的usb转串口芯片有ch340,pl2303等等。

BeiJingXunWei的博客 1858

【GPT】Coze使用开放平台接口-【7】Dify 比较篇

coze 用于社交,dify 用来内部构建。抛开工作流,机器人,工具,coze 最大的区别在于可以直接发布到社交媒体上。所以,coze 对操作体验上也花了不少功夫,而 dify 就专注在帮助使用者打磨工作流。coze 各个大模块之前可以联动的机制也比较多,所以侧重点各不相同。

非晓为骁的博客 7615

【Cortex-M0】11串口控制器

RS232是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)”和“数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS232接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D型插座,25芯插头座已很少采用。现在的台式

程序男孩 1228

工程师必读一次性讲明白系列(十三)眼图、阻抗匹配、信号一致性、射频匹配、电磁感应

概念主要作用影响因素解决方法眼图评估信号质量,显示失真和噪声噪声、信号失真、时序抖动改善信号源、使用低噪声组件阻抗匹配避免信号反射,提高传输效率阻抗不匹配、传输线路特性使用匹配电路、适配器信号一致性保证信号稳定准确传输传输线路、噪声干扰使用屏蔽、滤波器,选择合适线路射频匹配确保射频信号高效传输天线设计、阻抗不匹配使用射频匹配器、调整天线设计电磁感应防止电磁干扰对信号的影响设备之间的电磁干扰(EMI)屏蔽、接地、滤波器。

weixin_43199439的博客 161

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 641

iTOP-i.MX8M mini开发板支持Android9.0系统

iTOP-i.MX8M mini 核心板采用先进的 14LPC FinFET 工艺,采用四核Cortex-A53 + 单核 Cortex-M4 架构,主频 1.8GHz,2G DDR4 内存、8G EMMC 存储。核心板支持 H564、VP8 视频硬编码,H.264、H.265、VP8、VP9 视频硬解码,采用 PCA9450A电源管理,保证核心板的低功耗运行。核心板采用邮票孔链接方式,8 层PCB沉金设计,192PIN CPU 功能全部引出,通过了电磁兼容性检测、电磁辐射标准检测、安规检测、高低温坏...

mucheni的博客 327

嵌入式NuttX RTOS面试题及参考答案

NuttX 的板级支持包(BSP)是一组软件组件,用于将 NuttX 操作系统适配到特定的硬件平台上。BSP 提供了硬件抽象层,使得 NuttX 能够与硬件进行交互,包括初始化硬件设备、提供设备驱动程序等。BSP 的主要作用是隐藏硬件细节,为上层应用程序和操作系统内核提供统一的接口,从而提高软件的可移植性和可维护性。开发 NuttX 的 BSP 通常需要以下步骤:硬件分析:首先需要对目标硬件平台进行详细的分析,了解硬件的架构、处理器类型、外设接口等信息。

大模型大数据攻城狮的专栏 1306
上一篇: I2C和AT24C256的应用
下一篇: 空调红外编码正确,空调为什么打不开
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值