新聞中心

        STM32之串口通信

        作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/201611/320972.htm

        void USART1_IRQHandler(void)

        {

        u8 res;

        if(USART1->SR&(1<<5))//接收到數(shù)據(jù)

        {

        res=USART1->DR;

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

        {

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

        {

        if(res!=0x0a)

        USART_RX_STA=0;//接收錯(cuò)誤,重新開(kāi)始

        else

        USART_RX_STA|=0x80; //接收完成了

        }else //還沒(méi)收到0X0D

        {

        if(res==0x0d)

        USART_RX_STA|=0x40;

        else

        {

        USART_RX_BUF[USART_RX_STA&0X3F]=res;

        USART_RX_STA++;

        if(USART_RX_STA>63)USART_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開(kāi)始接收

        }

        }

        }

        }

        }

        #endif

        //該函數(shù)的重點(diǎn)就是判斷接收是否完成,通過(guò)檢測(cè)是否收到0X0D、0X0A 的連續(xù)2 個(gè)字節(jié)//(0X0D 后跟0X0A 表示回車(chē)鍵)來(lái)檢測(cè)是否結(jié)束。當(dāng)檢測(cè)到這個(gè)結(jié)束序列之后,就會(huì)置//位USART_RX_STA 的最高為來(lái)標(biāo)記已經(jīng)收到了一次數(shù)據(jù)。之后等待外部函數(shù)清空該位//之后才開(kāi)始第二次接收。所接收的數(shù)據(jù)全部存放在USART_RX_BUF 里面,一次接收數(shù)//據(jù)不能超過(guò)64個(gè)字節(jié),否則被丟棄。

        //初始化IO 串口1

        //pclk2:PCLK2時(shí)鐘頻率(Mhz)

        //bound:波特率

        //CHECK OK

        //091209

        void uart_init(u32 pclk2,u32 bound)

        {

        float temp;

        u16 mantissa;

        u16 fraction;

        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV

        mantissa=temp; //得到整數(shù)部分

        fraction=(temp-mantissa)*16; //得到小數(shù)部分

        mantissa<<=4;

        mantissa+=fraction;

        RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘

        RCC->APB2ENR|=1<<14; //使能串口時(shí)鐘

        GPIOA->CRH&=0XFFFFF00F;

        GPIOA->CRH|=0X000008B0;//IO狀態(tài)設(shè)置

        RCC->APB2RSTR|=1<<14; //復(fù)位串口1

        RCC->APB2RSTR&=~(1<<14);//停止復(fù)位

        //波特率設(shè)置

        USART1->BRR=mantissa; // 波特率設(shè)置

        USART1->CR1|=0X200C; //1位停止,無(wú)校驗(yàn)位.

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

        //使能接收中斷

        USART1->CR1|=1<<8; //PE中斷使能

        USART1->CR1|=1<<5; //接收緩沖區(qū)非空中斷使能

        MY_NVIC_Init(3,3,USART1_IRQChannel,2);//組2,最低優(yōu)先級(jí)

        #endif

        }

        主函數(shù)

        #include

        #include"common.h"

        int main(void)

        {

        u8 t;

        u8 len;

        u16 times=0;

        Stm32_Clock_Init(9); //系統(tǒng)時(shí)鐘設(shè)置

        delay_init(72); //延時(shí)初始化

        uart_init(72,9600); //串口初始化為9600

        while(1)

        {

        if(USART_RX_STA&0x80)

        {

        len=USART_RX_STA&0x3f;//得到此次接收到的數(shù)據(jù)長(zhǎng)度

        printf("n您發(fā)送的消息為:n");

        for(t=0;t

        {

        USART1->DR=USART_RX_BUF[t];

        while((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束

        }

        printf("nn");//插入換行

        USART_RX_STA=0;

        }else

        {

        times++;

        if(timesP00==0)

        {

        printf("n 簡(jiǎn)單的串口實(shí)驗(yàn)n");

        }

        if(times 0==0)printf("請(qǐng)輸入數(shù)據(jù),以回車(chē)鍵結(jié)束n");

        delay_ms(10);

        }

        }

        }

        實(shí)驗(yàn)現(xiàn)象:




        上一頁(yè) 1 2 下一頁(yè)

        關(guān)鍵詞: STM32串口通

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 正镶白旗| 筠连县| 怀宁县| 玉树县| 遵化市| 昭通市| 舒兰市| 砚山县| 同德县| 隆化县| 遂昌县| 溧水县| 贵溪市| 鹿邑县| 忻城县| 武汉市| 邹平县| 武宁县| 介休市| 绥芬河市| 甘谷县| 新宁县| 永泰县| 蛟河市| 元阳县| 德州市| 德惠市| 新龙县| 安化县| 定西市| 泰和县| 夹江县| 佳木斯市| 南溪县| 鄂伦春自治旗| 甘孜| 休宁县| 潜山县| 阳山县| 牟定县| 镇巴县|