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)//接收到了数据,且接收完成了

[1] [2]
关键字:stm32de  rs485  串口2  配置 引用地址:stm32de关于rs485的串口2的配置

上一篇:STM32多路adc检测
下一篇:关于时钟晶振 速率 倍频

推荐阅读

最近博主用STM32F103C8T6做了一个温度测控模块,用到PB3,PB4,PA15等引脚控制外设。发现不管怎么配置,这三个引脚都不能置零。后来发现是包括这三个引脚在内的PB3,PB4,PA13,PA14,PA15是特殊的IO口,用作JTAG/SWD仿真器的调试接口。其中PA13,PA14分别作为SWD调试的SWIO和SWCLK;PB3,PB4,PA13,PA14,PA15共同用于JTAG。这五个引脚的中英文描述如下...
还记得从前家里的那台黑白电视机吗?小编在很多年以后一直以为家里那台大屁股电视机是本田(Honda),直到后来我才知道,那不是本田,而是熊猫(Panda)。在这里给熊猫电视道个歉,记住五个字母对于年幼的我来说还是有些困难。不过以后肯定不会了。近日,拥有83年历史国民品牌熊猫电视宣布和天猫达成战略合作,焕新经典国货。熊猫电视将与天猫达成定制化合...
9月7日消息,「实在智能」半年内连续完成两轮、近亿元人民币融资,强势进入RPA赛道头部。领投方分别为「松禾资本」及「赛智伯乐」,「中赢基金」、「聚数银」等跟投。据悉,本次融资将主要应用于AI技术创新、产品迭代优化与市场复制推广。「实在智能」是一家人工智能科技公司,致力于通过AI+RPA(机器人流程自动化)技术打造应用于各行业的智能软件机器人...
具体实现功能由STC89C52单片机+二氧化碳传感器+LCD1602液晶显示屏+按键+蜂鸣器+指示灯+电源构成。具体功能:①二氧化碳传感器测得二氧化碳数据后经过单片机处理,由LCD1602实时显示,第一行显示测得的浓度值,第二行显示报警阈值;②可通过按键设置二氧化碳报警阈值;③测得的甲醛浓度在正常范围时,绿灯亮,超过报警阈值时,红灯亮,蜂鸣器响,开始声光报...

史海拾趣

问答坊 | AI 解惑

帮分析个简单的程序。。实在扛不住弄出来了

用定时器1做的简单输出,友善micro2440的板子 请帮我分析下,搞了好长时间,还是出不来 流驱动:#include "options.h" #include <windows.h> #include <types.h> #include <memory.h> #include <nkintr.h> #include < ...…

查看全部问答∨

C语言与单片机C语言(C51)有啥不同?

请问一下各位 学校里学的C语言和单片机C语言(C51)有啥子不一样的?哪个好学一点. 在学校里学了C语言后感觉没有学到啥子,挺浮浅的,现在只记得一些简单的规则和语法。 不知道现在是继续学它基础打扎实点呢,还是就开始学C51,希望大家给点建 ...…

查看全部问答∨

wince界面设计问题

请问要设计出这样的界面需要使用什么软件? 这种界面设计使用的什么方法。都是贴的图吗? 那具体设计过程是怎么样的? 好像是先设计整个界面,然后在截图。 …

查看全部问答∨

ppc2003可以直接访问sql2000 server中的数据吗?

ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?…

查看全部问答∨

立即报名预约2010吉时利新能源与新材料测试技术研讨会

2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...…

查看全部问答∨

uCADCDMA通道4中断问题!

使用uC2.86   ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...…

查看全部问答∨

问高手一个关于STM8 I2C的问题

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1    = 0x00;  &n ...…

查看全部问答∨

关于vca810的放大增益

本帖最后由 dontium 于 2015-1-23 12:51 编辑 我这两天用面包板按照vca810芯片的datasheet中的figure2 电路搭建了一个压控放大,将8脚的50欧姆电阻去掉,并在8脚加了一个vpp=30mv,f=800hz的正弦波(函数发生器产生),并在1脚直接接地。但是在Vc= ...…

查看全部问答∨

恒温控制算法问题

我最近在做一个恒温箱,使用可控硅控制加热丝加热。温度采集用的是DS1B20。想用PWM控制可控硅。 过零检测电路,输出100Hz的方波信号,触发单片机的外部中断(每10ms产生一次中断),对产生的中断次数(方波下降沿/过零点次数)进行计数,满200个为 ...…

查看全部问答∨

《TMS320C28x系列DSP》读书笔记--通用目标文件格式,段

      TMS320系列DSP的目标文件各式为通用目标文件格式 COFF (Command Object File Format,简称COFF)。 采用这种目标文件各式的优点是:将指令和数据按照段的概念进行组织和存储,这使得程序的可读性大大增强,更容易编写 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved