在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F103的簡(jiǎn)易串口驅(qū)動(dòng)(查詢方式)

            STM32F103的簡(jiǎn)易串口驅(qū)動(dòng)(查詢方式)

            作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
            對(duì)于各個(gè)模塊的學(xué)習(xí),開始通常是只使用最簡(jiǎn)單的功能。這里將給出一個(gè)STM32F103的最基本的串口收、發(fā)驅(qū)動(dòng)。要使用串口,就需要對(duì)串口的波特率、數(shù)據(jù)格式等進(jìn)行設(shè)置。這里給出的例子是使用的USART1,它的時(shí)鐘是連接在APB2上的,在計(jì)算波特率時(shí)應(yīng)該使用APB2的輸出時(shí)鐘。另外,使用查詢方式的話,還需要禁止掉串口的相關(guān)中斷,以防止程序跑飛。由于STM32F103的串口引腳是跟普通IO口復(fù)用的,所以在使用之前,一定要記得初始化對(duì)應(yīng)的IO口,選擇為相應(yīng)的第二功能,否則串口將無(wú)法正常工作。
            首先對(duì)照STM32F103的數(shù)據(jù)手冊(cè),將相關(guān)寄存器的定義寫好,放在USART.h頭文件中。然后增加對(duì)串口的初始化、串口讀寫操作的函數(shù)即可。本測(cè)試程序功能很簡(jiǎn)單,開機(jī)時(shí)通過串口發(fā)送一個(gè)"System start..."的字符串,然后等待串口接收數(shù)據(jù)。當(dāng)接收到數(shù)據(jù)后,將數(shù)據(jù)通過串口返回,然后流水燈工作一次,又繼續(xù)等待接收數(shù)據(jù)。
            本測(cè)試程序設(shè)置的波特率為9600,由宏BIT_RATE定義,然后在程序中計(jì)算需要設(shè)置的分頻值。小數(shù)部分中的值為實(shí)際的小數(shù)部分乘以16。
            部分代碼如下:
            #include "USART.H"
            #include "gpio.h"
            #define BIT_RATE 9600
            #define USART_CLK 72000000UL
            //串口初始化,波特率為9600
            void Usart1Init(void)
            {
            //設(shè)置波特率分頻器
            pbUSART1_BRR->DIV_Mantissa=(USART_CLK/16/BIT_RATE);
            pbUSART1_BRR->DIV_Fraction=(USART_CLK/BIT_RATE);
            //使能串口1
            pbUSART1_CR1->UE=1;
            //0: 1 Start bit, 8 Data bits, n Stop bit
            pbUSART1_CR1->M=0;
            //禁止奇偶校驗(yàn)
            pbUSART1_CR1->PCE=0;
            //禁止串口1的所有中斷
            pbUSART1_CR1->PEIE=0;
            pbUSART1_CR1->TXEIE=0;
            pbUSART1_CR1->TCIE=0;
            pbUSART1_CR1->RXNEIE=0;
            pbUSART1_CR1->IDLEIE=0;
            //使能串口1發(fā)送
            pbUSART1_CR1->TE=1;
            //使能串口1接收
            pbUSART1_CR1->RE=1;
            //1位停止位
            pbUSART1_CR2->STOP=0;
            //禁止LIN Break Detection Interrupt
            pbUSART1_CR2->LBDIE=0;
            pbUSART1_CR3->CTSIE=0;
            pbUSART1_CR3->CTSE=0;
            pbUSART1_CR3->RTSE=0;
            pbUSART1_CR3->DMAT=0;
            pbUSART1_CR3->DMAR=0;
            pbUSART1_CR3->SCEN=0;
            pbUSART1_CR3->NACK=0;
            pbUSART1_CR3->HDSEL=0;
            pbUSART1_CR3->IRLP=0;
            pbUSART1_CR3->IREN=0;
            pbUSART1_CR3->EIE=0;
            //TXD引腳設(shè)置(連接在PA9上)
            GPIOA_MODE9=3; //50MHz輸出模式
            GPIOA_CNF9=2;//第二功能推挽輸出模式
            //RXD引腳設(shè)置(連接在PA10上)
            GPIOA_MODE10=0; //輸入模式
            GPIOA_CNF10=1;//高阻輸入
            }
            //從串口1等待1字節(jié)數(shù)據(jù)
            unsigned char Usart1GetChar(void)
            {
            while(!pbUSART1_SR->RXNE);
            return pbUSART1_DR->DR;
            }
            //往串口1發(fā)送1字節(jié)
            void Usart1PutChar(unsigned char Value)
            {
            while(!pbUSART1_SR->TXE);
            pbUSART1_DR->DR=Value;
            }
            //往串口1發(fā)送一個(gè)字符串
            void Usart1PutString(unsigned char *pString)
            {
            unsigned int i;
            i=0;
            while(pString[i])
            {
            Usart1PutChar(pString[i]);
            i++;
            }
            }


            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉