历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2019年09月09日 | stm32de关于rs485的串口2的配置

2019-09-09 来源:eefocus

stm32串口1的配置


if EN_USART1_RX   //如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误       

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15,    接收完成标志

//bit14,    接收到0x0d

//bit13~0,    接收到的有效字节数目

u16 USART_RX_STA=0;       //接收状态标记      

  

void uart_init(u32 bound){

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟

  

    //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX      GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

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

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置


    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_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(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1 


}


void USART1_IRQHandler(void)                    //串口1中断服务程序

    {

    u8 Res;

#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

    OSIntEnter();    

#endif

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

        {

        Res =USART_ReceiveData(USART1);    //读取接收到的数据

        

        if((USART_RX_STA&0x8000)==0)//接收未完成

            {

            if(USART_RX_STA&0x4000)//接收到了0x0d

                {

                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

                else USART_RX_STA|=0x8000;    //接收完成了 

                }

            else //还没收到0X0D

                {    

                if(Res==0x0d)USART_RX_STA|=0x4000;

                else

                    {

                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

                    USART_RX_STA++;

                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      

                    }         

                }

            }            

     } 

#if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

    OSIntExit();                                               

#endif

#endif    

 


rs485串口2的配置



#ifdef EN_USART2_RX       //如果使能了接收

//接收缓存区     

u8 RS485_RX_BUF[64];      //接收缓冲,最大64个字节.

//接收到的数据长度

u8 RS485_RX_CNT=0;             

  

void USART2_IRQHandler(void)

{

    u8 res;        

 

     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据

    {     

                  

        res =USART_ReceiveData(USART2);     //读取接收到的数据

        if(RS485_RX_CNT<64)

        {

            RS485_RX_BUF[RS485_RX_CNT]=res;        //记录接收到的值

            RS485_RX_CNT++;                        //接收数据增加1 

        } 

    }                                               

#endif                                         

//初始化IO 串口2

//pclk1:PCLK1时钟频率(Mhz)

//bound:波特率      

void RS485_Init(u32 bound)

{  

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

     NVIC_InitTypeDef NVIC_InitStructure;

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                 //PD7端口配置

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOD, &GPIO_InitStructure);

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //PA2

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽

  GPIO_Init(GPIOA, &GPIO_InitStructure);

   

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);  


    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

 

    

 #ifdef EN_USART2_RX              //如果使能了接收

    USART_InitStructure.USART_BaudRate = bound;//波特率设置

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

    USART_InitStructure.USART_StopBits = USART_StopBits_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; //使能串口2中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

    NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

 

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断

   

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


 #endif


  RS485_TX_EN=0;            //默认为接收模式

 

}


//RS485发送len个字节.

//buf:发送区首地址

//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)

void RS485_Send_Data(u8 *buf,u8 len)

{

    u8 t;

    RS485_TX_EN=1;            //设置为发送模式

      for(t=0;t    {           

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

        USART_SendData(USART2,buf[t]);

    }     

 

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

    RS485_RX_CNT=0;      

    RS485_TX_EN=0;                //设置为接收模式    

}

//RS485查询接收到的数据

//buf:接收缓存首地址

//len:读到的数据长度

void RS485_Receive_Data(u8 *buf,u8 *len)

{

    u8 rxlen=RS485_RX_CNT;

    u8 i=0;

    *len=0;                //默认为0

    delay_ms(10);        //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束

    if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了

推荐阅读

史海拾趣

Hitron公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的重要设备,具有高度的专业性和广泛的科普意义。作为信息家电的一员,机顶盒不仅实现了数模转换,让用户能够在模拟电视上观看数字电视节目,还通过接入互联网,极大地丰富了电视节目的选择,提升了观看体验。

从广义上讲,机顶盒涵盖了从模拟频道增补器到现代的数字卫星机顶盒(DVB-S)、数字地面机顶盒(DVB-T)、有线电视数字机顶盒(DVB-C)以及IPTV机顶盒等多种类型。这些机顶盒不仅接收来自有线电缆、卫星天线、宽带网络及地面广播的信号,还提供了电子节目指南、网页浏览等增值服务,使电视机成为了一个能够与用户进行互动的智能终端。

在技术层面,机顶盒的工作原理可概括为接收、解码和显示三个步骤。它首先通过内置的调谐器接收数字电视信号,随后由内部的解码器将信号转换成电视可识别的视频和音频流,最终通过电视机呈现给用户。随着技术的不断进步,机顶盒已能支持高清、甚至4K超高清视频播放,为用户带来更为细腻的画面和震撼的音效。

未来,机顶盒市场将继续保持稳定增长态势,技术创新与智能化将成为重要的发展方向。高清化、超高清化、人工智能及云计算等技术的应用,将使机顶盒不仅限于基本的电视信号接收与解码功能,而是向智能化、多功能化方向迈进,为用户提供更加便捷、智能的生活体验。

ARMKEIL Microcontroller Tools公司的发展小趣事

在ARM公司的支持下,Keil公司不断进行技术创新和产品升级。其中最具代表性的是Keil C51集成开发环境的推出。这一产品不仅继承了Keil PK51的优点,还在性能、稳定性和易用性等方面进行了大幅提升。Keil C51的推出,极大地满足了市场对嵌入式系统开发的需求,也进一步巩固了Keil公司在行业内的领先地位。

Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

Advanced Optoelectronic Technology Corp公司的发展小趣事

在追求经济效益的同时,AOTC也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术生产产品,降低对环境的影响。此外,公司还积极参与公益事业,支持教育、科研等领域的发展,为社会做出了积极贡献。

这些故事虽然是虚构的,但它们反映了一个电子行业中公司可能经历的一些典型发展阶段和挑战。在真实情况中,公司的发展路径会受到市场环境、技术变革、竞争态势等多种因素的影响。

BROTHER公司的发展小趣事

在电子行业的发展过程中,技术创新始终是BROTHER公司的重要驱动力。公司注重研发投入,拥有一支高素质的研发团队,不断推出具有创新性和竞争力的新产品。同时,BROTHER还积极与高校、科研机构等合作,开展产学研合作,推动技术创新和产业升级。通过技术创新,BROTHER不仅提升了产品质量和性能,还降低了生产成本,提高了市场竞争力。

Bipolar Integrated Technology Inc公司的发展小趣事

在市场竞争日益激烈的情况下,BIT意识到只有不断创新才能在行业中立足。于是,他们加大了在研发方面的投入,不断推出具有创新性的产品。其中,一款高性能、低功耗的双极型处理器成为了市场上的热销产品,引领了行业潮流。

问答坊 | AI 解惑

单片机基础---单片机超星格式图书下载

单片机基础---单片机超星格式图书下载 内容提要: MCS51单片机结构和原理,指令系统的使用,存储器的扩展,中断与定时的使用等等..... 此教程强烈推荐!淘宝有很多卖100元~。现为测试服务器压力提供免费下载。如果你配合这些教程,和自己的时 ...…

查看全部问答>

解读FAT32 文件系统

解读FAT32 文件系统…

查看全部问答>

如何读取 NI DIO96 中断信号

我在 弄一块DIO96板卡的驱动程序,但是不知道他的中断状态寄存器在哪里?他的板卡使用手册里面只有设置中断允许的寄存器(只写),没有状态寄存器。这种情况下怎么弄呢?卡上有四片8255 一片8253,再就是PCI接口芯片,是他们自己生产的。我想用8253 ...…

查看全部问答>

关于BeginPaint,EndPaint的问题(__security_check_cookie error)

我用VC2005下写基于pocket PC 2003的程序,在响应WM_PAINT的消息的时候,添加了Begin Paint和EndPaint的时候就编译通不过,错误应该是少了某个库,msdn里这两个函数是在Winmgr.lib里面,可是添加了这个库又说打不开,而且搜索电脑里也没有这个库, ...…

查看全部问答>

帮我看看,WINCE起动不了

我们买了一方案,Z228,他们以前是可以进入操作系统,很OK的,但是我们换了时钟芯片段和电源芯片段后,走到WINCE的欢迎界面就进不了系统了.请问怎么回事呀?谢谢 !…

查看全部问答>

仪表测试

希望能用的开发板…

查看全部问答>

请问STM8S怎么动态分配内存?

                                 如题…

查看全部问答>

易电源学习心得

100~ 易电源纳米模块 在一个微小解决方案尺寸中整合了高性能和易用性,据说简单好用且实用,我还没有用过,希望有机会摸一下~…

查看全部问答>

boost电路和上拉电路的区别

前几天在看boost电路,目的是想提高芯片I/O口的输出电压 然后,我想用上拉电阻不是也可以实现这样的功能嘛,二者有什么区别呢? 请教一下大家。。。 我只是想将芯片输出口3.3V的电压转换成5V.…

查看全部问答>