历史上的今天
返回首页

历史上的今天

今天是:2025年08月13日(星期三)

正在发生

2018年08月13日 | stm32 485串口数据的收发

2018-08-13 来源:eefocus

//串口初始化:

 

#define EN_USART2_RX  1

 

void RS485_Init(u32 bound)

{  

    GPIO_InitTypeDef GPIO_InitStructure;

   USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     //  RE

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOG, &GPIO_InitStructure);

 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2    TX

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

    GPIO_Init(GPIOA, &GPIO_InitStructure);

   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3    RX

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 

    GPIO_Init(GPIOA, &GPIO_InitStructure);  

 

 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);

 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//í£?1?′??

 

 

 #ifdef EN_USART2_RX //

 USART_InitStructure.USART_BaudRate = 9600;//波特率9600;

 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位

 USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位

 USART_InitStructure.USART_Parity = USART_Parity_No;//奇偶校验无

 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//串口配置为收发模式

 

    USART_Init(USART2, &USART_InitStructure); ; 

 

 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //指定中断

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //中断抢占优先级

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //′中断响应优先级

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 中断函数使能

  NVIC_Init(&NVIC_InitStructure);

 

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收终端使能

   

    USART_Cmd(USART2, ENABLE);                    //串口使能

 

 #endif

 

 RS485_TX_EN=0; //默认配置为接收模式  这里可以用GPIO_ResetBits(GPIOG,GPIO_Pin_9),同样置1可用GPIO_SetBits(),

}

 

//串口的中断函数:

 

void USART2_IRQHandler(void)

{

 u8 res;   

 

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 

 {

     

  res =USART_ReceiveData(USART2); 

  RS485_TX_EN = 1;

// 此处发送数据主要是为了检验中断是否进行触发

  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

  USART_SendData(USART2,0xff);

  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

  RS485_TX_EN = 0;

  if(RS485_RX_CNT<64)

  {

   RS485_RX_BUF[RS485_RX_CNT]=res;、

   RS485_RX_CNT++; 

  }

 }  

}

好吧,今天又被串口虐的死去活来,最开始一直怀疑是自己的程序写的有问题,纠结串口配置是不是出问题了,最后找个demo自己找问题,发现收发数据是需要控制复位引脚,进行收发控制,我这里是复位引脚置为1,则可以进行发,为0,则表示收数据,当然如果你觉得设置好复位引脚的值就可以进行发送送数据了,呵呵,你看到的还是一片白,我的数据呢??在发送数据之前你需要写这样一条代码

while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET),这样我们就用USART_Send(USARTx,data); 发送数据了,之后我们同样还需要用while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET)来处理自己发送的内容,看上去复杂吧,呵呵。

下面给出具体步骤:

1. 像配置232串口一样配置rs485的引脚,使能相应的时钟。

            RX: GPIO_Mode_IN_FLOATING/GPIO_Mode_IPD

            TX: GPIO_Mode_Out_PP

            RE: GPIO_Mode_Out_PP

2. 进行中断配置

3. 记得使能中断和串口。

具体还是看代码吧。


推荐阅读

史海拾趣

Globaltech Semiconductor Co Ltd公司的发展小趣事

为了保持技术领先地位,Globaltech持续加大研发投入,建立了先进的研发中心和测试实验室。公司不断引进国内外顶尖的研发人才,并与多所知名高校和研究机构建立产学研合作关系。这些努力使得Globaltech在电源管理IC领域取得了多项技术突破,并成功拓展了产品线,涵盖了ESD保护器件、MOSFET等多个领域。这些新产品不仅丰富了公司的产品线,也为客户提供了更加全面的解决方案。

Barnbrook Systems Limited公司的发展小趣事

为了保持技术上的领先地位,Barnbrook积极寻求与高校、研究机构的合作。通过与这些机构的深入合作,Barnbrook不仅获得了最新的科研成果和人才支持,还成功研发出了一系列具有创新性的电子产品。这些产品不仅提升了公司的技术实力,也为公司的长期发展注入了新的活力。

Frequency Electronics Inc公司的发展小趣事

高频电子深知技术创新是企业持续发展的核心动力。因此,公司一直保持着对研发的持续投入,不断推出新产品、新技术和新服务。同时,高频电子还积极与高校、科研机构等合作,共同开展前沿技术的研发和应用。这些努力使得高频电子在技术创新方面始终保持着领先地位,为公司的长期发展奠定了坚实的基础。

综上所述,高频电子通过战略转型、技术创新、全球化布局、多元化业务布局以及持续投入研发等举措,实现了从一家小型国防合同制造商到全球领先的高科技供应商的华丽蜕变。这些故事不仅展现了高频电子的发展历程和成就,也为我们揭示了企业成功背后的关键因素。

Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors公司成立于电子行业的蓬勃发展时期。创立初期,公司就明确了以传感器技术为核心的发展方向。公司聚集了一批优秀的工程师和科学家,致力于研发高精度、高稳定性的传感器产品。经过数年的技术积累和产品研发,Cornerstone Sensors逐渐在传感器领域崭露头角,其产品质量和技术水平得到了行业的广泛认可。

ETA Electric Industry Co Ltd公司的发展小趣事

在二十世纪末,ETA Electric Industry Co Ltd还只是一个小型的电子设备制造商,专注于生产简单的电子元器件。当时,公司的创始人李先生看到了电子行业快速发展的潜力,并决定投身于这一行业。最初,公司面临着资金紧张、技术落后、市场竞争加剧等诸多挑战。然而,李先生凭借其敏锐的市场洞察力和不懈的努力,逐渐打开了市场局面。他们通过与小型科技企业合作,为其提供定制化的电子元器件,逐渐在市场上站稳了脚跟。

Hitachi (Renesas )公司的发展小趣事

进入新世纪,ETA Electric Industry Co Ltd意识到技术创新是企业发展的关键。于是,公司开始加大研发投入,引进了一批高素质的研发人员。他们专注于开发新型电子元器件,特别是在微型化、高性能方面取得了显著成果。其中,他们研发的一种新型微型电容器,因其体积小、性能稳定而广受好评。这一技术创新不仅提升了公司的市场竞争力,还为公司赢得了更多的合作机会。

问答坊 | AI 解惑

uboot烧写问题

我用的是omap5910,我准备重新烧写uboot,不过我擦除falsh之后,重启系统就没有反映了(应该是这样的吧),我打开超级终端,重启开发办,发送uboot文件,不成功,应该怎么办?是不是先把uboot送入sdram,再利用sdram烧写到flash,不过具体应该怎么 ...…

查看全部问答>

EasyArm1138学习笔记(一)——IO操作

IO操作中我准备做两个实验 (1)       用IO口点亮LED,这就是让IO输出低电平(注板上的LED是阴极接在IO口,阳极由VCC串电阻上拉),这个实验是IO输出的实验。目的是熟悉工程配置,IAR的环境很熟悉,第一次做ARM ...…

查看全部问答>

微芯的协议栈说明书上有这么一句 RTOS and application independent

这是什么意思啊?操作系统和应用程序独立?老夫怎么觉得老夫写的应用程序是嵌入到他的操作系统框架里面的呢…

查看全部问答>

用LM331做压频转换出现的问题

如果用LM331做压频转换,当电压为0时,输出频率是否也为0,谢谢!…

查看全部问答>

死区时间的问题

图中对应的时间需不需要TBCLK对应多少HZ,还是只要符合SYSCLKOUT/1,SYSCLKOUT/2,SYSCLKOUT/4就可以查出时间来了?…

查看全部问答>

(cyclone4)助学版_v120之数码管一

准备重新编辑一下的,结果全部都是乱码,还是重新截图吧undefined [ 本帖最后由 Leo417love 于 2013-8-6 21:21 编辑 ]…

查看全部问答>

买的开发板包装胶布被弄断,不是自己签收的,问题是我还弄不清倒是是卖家少邮东西....

不知道发在这里合不合适,心里很是疑惑想问问大家,我在淘宝上买的别人的开发板,全新的两套,之后呢东西今天到了,因为我去上课,是别人签收的,我租的旅店的一个房间,回来之后店主把快件给我了,我惊奇的发现箱子一边的胶布被弄开了,我打开看里 ...…

查看全部问答>

新手求教 cc2541 sensortag 外加sensor的方案讨论

各位大神,小弟正在纠结于学校的一project 需要了解如何外接而外sensor通过sensortag帮助蓝牙发送数据去PC端,该如何实现呢? 现在的想法是通过sensortag上的P1-1-6的端口用I2C OR UART 连接?是否可行,求教具体的操作 感激不敬!…

查看全部问答>

最大困惑

请问各位,我们在做项目时,为什么主要指标都看什么频率啊,阻抗啥的,我就想问为啥要测这些指标,这些指标有什么用,这些指标决定着什么,哪位爱心人士能尽快系统详细的解答一下,真的很纠结…

查看全部问答>

LM386中文资料 电路图及引脚封装图

      LM386是专为低损耗电源所设计的功率放大器集成电路。它的内建增益为20,透过pin 1 和pin8脚位间电容的搭配,增益最高可达200。LM386可使用电池为供应电源,输入电压范围可由4V~12V,无作动时仅消耗4mA电流,且失真低。LM ...…

查看全部问答>