新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32F103的簡易串口驅動(查詢方式)

        STM32F103的簡易串口驅動(查詢方式)

        作者: 時間:2016-11-18 來源:網絡 收藏
        對于各個模塊的學習,開始通常是只使用最簡單的功能。這里將給出一個STM32F103的最基本的串口收、發驅動。要使用串口,就需要對串口的波特率、數據格式等進行設置。這里給出的例子是使用的USART1,它的時鐘是連接在APB2上的,在計算波特率時應該使用APB2的輸出時鐘。另外,使用查詢方式的話,還需要禁止掉串口的相關中斷,以防止程序跑飛。由于STM32F103的串口引腳是跟普通IO口復用的,所以在使用之前,一定要記得初始化對應的IO口,選擇為相應的第二功能,否則串口將無法正常工作。
        首先對照STM32F103的數據手冊,將相關寄存器的定義寫好,放在USART.h頭文件中。然后增加對串口的初始化、串口讀寫操作的函數即可。本測試程序功能很簡單,開機時通過串口發送一個"System start..."的字符串,然后等待串口接收數據。當接收到數據后,將數據通過串口返回,然后流水燈工作一次,又繼續等待接收數據。
        本測試程序設置的波特率為9600,由宏BIT_RATE定義,然后在程序中計算需要設置的分頻值。小數部分中的值為實際的小數部分乘以16。
        部分代碼如下:
        #include "USART.H"
        #include "gpio.h"
        #define BIT_RATE 9600
        #define USART_CLK 72000000UL
        //串口初始化,波特率為9600
        void Usart1Init(void)
        {
        //設置波特率分頻器
        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;
        //禁止奇偶校驗
        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發送
        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引腳設置(連接在PA9上)
        GPIOA_MODE9=3; //50MHz輸出模式
        GPIOA_CNF9=2;//第二功能推挽輸出模式
        //RXD引腳設置(連接在PA10上)
        GPIOA_MODE10=0; //輸入模式
        GPIOA_CNF10=1;//高阻輸入
        }
        //從串口1等待1字節數據
        unsigned char Usart1GetChar(void)
        {
        while(!pbUSART1_SR->RXNE);
        return pbUSART1_DR->DR;
        }
        //往串口1發送1字節
        void Usart1PutChar(unsigned char Value)
        {
        while(!pbUSART1_SR->TXE);
        pbUSART1_DR->DR=Value;
        }
        //往串口1發送一個字符串
        void Usart1PutString(unsigned char *pString)
        {
        unsigned int i;
        i=0;
        while(pString[i])
        {
        Usart1PutChar(pString[i]);
        i++;
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 榕江县| 会东县| 姚安县| 台南市| 松原市| 永德县| 宜兴市| 万年县| 会同县| 淮北市| 延长县| 鹤庆县| 陆良县| 甘孜县| 华宁县| 长沙市| 荔波县| 云南省| 海口市| 汝州市| 佛山市| 根河市| 策勒县| 江西省| 牙克石市| 麟游县| 华容县| 都安| 乐陵市| 托里县| 绩溪县| 郴州市| 甘孜| 通化县| 桂平市| 岫岩| 灵寿县| 徐汇区| 文成县| 大田县| 洪雅县|