久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1765|回復: 2
打印 上一主題 下一主題
收起左側

stm32 RS485實現

[復制鏈接]
跳轉到指定樓層
樓主
ID:495918 發表于 2019-3-22 10:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "rs485.h"
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_rcc.h"

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

u8 RS485_RX_BUF[64]; //接收緩沖區
u8 RS485_RX_CNT=0;


//串口1中斷服務函數

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++;
                }
        }
}
#endif

void delay(u32 nTimer)
{   int k,j;
        for (k=0;k<nTimer;k++)
              for (j=0;j<100;j++);
}

//初始化串口
//bound 波特率
void RS485_Init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA時鐘
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘
       
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //PA4為推挽輸出
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //PA2復用推挽
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//PA3浮空輸入
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
       
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE); //復位串口2
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止復位

        USART_InitStructure.USART_BaudRate=bound;  //波特率
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件數據流控制
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;  //收發模式
        USART_InitStructure.USART_Parity=USART_Parity_No;  //無奇偶校驗
        USART_InitStructure.USART_StopBits=USART_StopBits_1;//一個停止位
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;//八位數據長度
        USART_Init(USART2,&USART_InitStructure);
        USART_Cmd(USART2,ENABLE);  //使能串口
        USART_ClearFlag(USART2, USART_FLAG_TC);//清除標志位
       
       
        #ifdef EN_USART2_RX  //如果使能了接收
       

        //USART2 NVIC配置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷分組2 16個優先級,高兩位搶占式,低兩位響應
        NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;  //使能串口2中斷
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優先級3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子優先級3
        NVIC_Init(&NVIC_InitStructure);
       
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  //開啟中斷
       
       
        #endif

    GPIO_ResetBits(GPIOA,GPIO_Pin_4);  //默認為接收模式 ,即端口輸出低電平
       

}


//RS485發送len個字節,其中buf為發送首地址,len為發送字節數(不要超過64個)
void RS485_Send_data(u8 *buf,u8 len)
{
        u8 t;
        GPIO_SetBits(GPIOA,GPIO_Pin_4); //設置為發送模式
        for(t=0;t<len;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;
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);  //設置為接收模式
       
}

//RS485查詢接受到的數據,其中buf為接收緩存首地址,len為讀到的數據長度
void RS485_Receive_data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;
        delay(5000);  //這里還要改???  //等待10ms,連續超過10ms沒有接收到一個數據,就定義為接收結束
        if(rxlen==RS485_RX_CNT&&rxlen)
        {
                for(i=0;i<rxlen;i++)
                {
                buf[i]=RS485_RX_BUF[i];
                }
        }
        *len=RS485_RX_CNT;
        RS485_RX_CNT=0;
       

}       

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-3-23 03:29 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:714728 發表于 2020-3-24 14:11 | 只看該作者
學習一下,謝謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产色综合久久不卡蜜臀 | 国产yw851.c免费观看网站 | 久久精品99| 最新国产精品视频 | 日韩视频高清 | 日日干综合 | 中文字幕乱码视频32 | 黄色片网站国产 | 亚洲视频一 | 黄色永久免费 | 久久美女视频 | 亚洲免费福利视频 | 少妇特黄a一区二区三区88av | 欧美影院 | 久草.com| 欧美成人h版在线观看 | 精品自拍视频 | 婷婷在线网站 | 日韩毛片在线观看 | 男女污网站| 欧美性久久久 | 亚洲成人一级 | 久久免费香蕉视频 | 涩涩视频网站在线观看 | 国产精品黄色 | 亚洲综合在线视频 | 成人欧美一区二区三区在线播放 | 国产一区二区影院 | 99免费精品视频 | 国产精品久久久久久妇女 | av片网| av大片 | 欧美在线视频网 | 久久精品小视频 | 日韩成人在线网站 | 亚洲精品一区二三区不卡 | 国产在线观看一区二区 | 日韩在线视频一区二区三区 | 中文字幕视频在线观看免费 | 国产精品久久久久久婷婷天堂 | 偷拍亚洲色图 |