历史上的今天
返回首页

历史上的今天

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

2019年09月07日 | stm32串口1和RS485通信的串口2的配置

2019-09-07 来源: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;//接收数据错误,重新开始接收      
                    }         
                }
            }            
     } 

 

 

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)//接收到了数据,且接收完成了
    {
        for(i=0;i        {
            buf[i]=RS485_RX_BUF[i];    
        }        
        *len=RS485_RX_CNT;    //记录本次数据长度
        RS485_RX_CNT=0;        //清零
    }
}

推荐阅读

史海拾趣

City_Technology公司的发展小趣事

随着市场的不断变化和需求的日益增长,City Technology并未满足于已有的成就。在1980年代末至1990年代初,公司积极扩展产品线,相继开发了电化学有毒气体传感器和可燃气体传感器。这些新产品的推出,不仅丰富了公司的产品线,也进一步巩固了其在气体传感领域的领先地位。同时,公司还不断对已有产品进行优化升级,以满足客户日益多样化的需求。

Bliley Technologies Inc公司的发展小趣事

随着全球化趋势的加速,Bliley也开始积极实施全球化战略。公司不仅在美国本土建立了先进的制造工厂和研发中心,还积极拓展海外市场,与全球客户建立紧密的合作关系。通过全球化战略的实施,Bliley不仅扩大了其市场份额,也提升了其品牌影响力和国际竞争力。如今,Bliley的产品已经广泛应用于各个领域,包括航空航天、军事国防、移动通信、5G蜂窝和电信等。

这五个故事共同展现了Bliley Technologies Inc.在电子行业中的发展历程。从一家小型压电公司起步,通过不断创新和拓展,Bliley逐渐成长为晶振行业的领军企业,并在全球化市场中取得了显著成就。这些故事不仅反映了Bliley的辉煌历史,也预示着其未来更加广阔的发展前景。

CIPS公司的发展小趣事

在2015年,跨境银行间支付清算有限责任公司(CIPS Co., Ltd.)正式成立,并随之推出了人民币跨境支付系统(CIPS)。这一系统的诞生,标志着中国电子支付行业在跨境支付领域迈出了坚实的一步。CIPS系统的建立,不仅满足了国内外金融机构对高效、安全、便捷的跨境支付服务的需求,更为人民币国际化进程提供了有力支持。

Aavid Niagra公司的发展小趣事

近年来,电子行业正经历着深刻的变革,新兴技术的不断涌现对传统散热技术提出了严峻挑战。Aavid Niagra公司面对这一变革,积极调整战略方向,加大在新兴技术领域的研究力度。通过与高校、研究机构的合作,公司成功研发出了一系列适应新兴技术需求的散热产品,成功应对了行业变革带来的挑战。

Fine Products Microelectronics Corp公司的发展小趣事

Aavid Niagra公司在成立之初,面临着资金短缺、市场竞争激烈以及技术壁垒等多重挑战。然而,创始人凭借对电子散热技术的深刻理解和前瞻性的市场洞察,成功研发出了一款高效能的散热解决方案,赢得了行业内的初步认可。通过与几家大型电子设备制造商的合作,公司逐渐在市场上站稳脚跟,为后续的发展奠定了坚实基础。

Acculin Inc公司的发展小趣事

Acculin Inc最初是一家专注于电子元器件研发的小型企业。随着物联网和智能家居的兴起,公司敏锐地捕捉到了市场的机遇,开始研发一款低功耗、高集成度的传感器芯片。经过数年的努力,Acculin成功推出了这款芯片,并凭借出色的性能获得了市场的认可。随后,公司逐渐扩大了产品线,涵盖了多个电子领域,成为行业内技术创新的领军者。

问答坊 | AI 解惑

【藏书阁】电子学计算手册

目录: 第一章 技术数学复习 第二章 直流电路分析 第三章 交流电路分析 第四章 R、L、C元件的选择 第五章 半导体器件的选择 第六章 音频放大器 第七章 调谐放大器 第八章 反馈 第九章 振荡器 第十章 电源 第十一章 电池的使用及特种元 ...…

查看全部问答>

pic代理

pic代理 禾琦商贸(原立奇国际)为Microchip全系列产品授权代理。公司于2002年获得Microchip(美国微芯公司)年度杰出服务奖。禾琦商贸亚洲区最大的代理商,全球前五大代理商之一。总年度营业额超过十亿美金。 公司具多位研发出身的专职应用工程 ...…

查看全部问答>

挑战史上最全UART驱动,哈哈。。。。

zhaojun_xf 同学写了个史上最全uart实验,但是却遇到了spritf的问题,偶要挑战之,哈哈!!为什么会出这个问题呢?因为内存不够用啦。那怎么办呢? 重写sprintf函数嘛?怎么重写呢?google or baidu 嘛。。。。。。。。。哈哈,以下程序参考printf- ...…

查看全部问答>

信息产业部—硬件设计工程师培训火爆报名中!!!!!

目前全国的计算机硬件教育还处于起步阶段,由于实操环境和实验室的要求,大部分的培训机构和职业学校的硬件教育滞后于软件教育,导致学生技能水平低,不能满足就业的需求,同时对学生从事软件开发等高级职业造成了短腿的现象。    近 ...…

查看全部问答>

PIC UART通讯接收问题,附带程序

我想用UART接收四组8位数据,总共是四个字符,看芯片介绍,缓冲区最多可以存储2个字符,怎样才能接收四个字符,求帮助 void uart(void) {         RCSTA=0x90;//接收状态和控制寄存器         SPBRG= ...…

查看全部问答>

【兼职】找人写一本【Arduino】教程----版主留情

目前Arduino越来越火了,国家一级出版社,想出版一本【Arduino】入门教程,有项目经验又有写作兴趣的可以联系我 QQ 453172580,验证:Arduino。 写作要求: (1)务必有Arduino项目经验 (2)有扎实的理论基础,了解技术的后台原理。 (3)有 ...…

查看全部问答>

MATLAB帮忙设计一种16-QAM调制解调方案

设计一种16-QAM调制解调方案,信源速率、码元数、调制频率、采样频率等参数自定,信道噪声为高斯分布白噪声,均值为0,方差自定。完成三种信噪比条件下的调制和解调计算机仿真,给出调制器输出、解调器主要节点信号波形和误码率等仿真结果,并做必 ...…

查看全部问答>

MSP430单片机内存被改写如何修改

请教论坛各位前辈一个问题,最近有个项目是用MSP430F1121A和CC1101的遥控器。接收那端的MSP430单片机定义在内存Memory的数据被莫名其妙改写,不知道由什么引起。 这是仿真时,出错时候的内存数据。图中的relay1_flag和relay2_flag原来是用下面的bi ...…

查看全部问答>

【TI DLP创意征集】+全息互动

如今,vr ar技术的逐渐成熟,从Google的 glass,到Microsoft 的hololens。 不过他们仍然需要“眼镜”的支持,借助于DLP,使得我们可以脱离“眼镜” 看电影,玩游戏,做设计。不论在享受上还是效率上都带来极大的提升 …

查看全部问答>

我爱DIY---简易CNC

说起雕刻机,我在大学的时候就打算弄了,但是当时的资金有限,没有能力搞起来,当时打算自己DIY的,但是考虑到精度问,时间,物力,人力等方面原因,还是直接购买一台吧,在网上看了下,从几百块到几十万的加工中心都有,我终于选定了一款1W左右 ...…

查看全部问答>