新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32之串口通信

        STM32之串口通信

        作者: 時間:2016-11-24 來源:網絡 收藏
        實驗目的:

        實現利用串口1 不停的打印一個信息到電腦上,同時接收從串口發過來的數據,把發送過來的數據直接送回給電腦。

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

        實驗平臺:

        基于STM32F103C8T6的彩屏開發板

        硬件接口:

        注意:因為我的開發板上的串口和LED共用了PA9和PA10,所以在使用USART1時務必屏蔽LED,不然兩者會互相影響而導致實現現象無法呈現。

        相關寄存器:

        1,串口時鐘使能。串口作為STM32 的一個外設,其時鐘由外設時鐘使能寄存器控制,這

        里我們使用的串口1 是在APB2ENR 寄存器的第14 位。

        2,串口復位。串口1 的復位是通過配置APB2RSTR 寄存器的第14 位來實現的。。通過向該位寫1來復位串口1,寫0 結束復位。

        3,串口波特率設置。每個串口都有一個自己獨立的波特率寄存器USART_BRR

        波特率的計算,STM32 的串口波特率計算公式如下:


        上式中, 是給串口的時鐘(PCLK1 用于USART2、3、4、5,PCLK2 用于USART1);USARTDIV 是一個無符號定點數。我們只要得到USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR 的值。

        4,串口控制。STM32 的每個串口都有3 個控制寄存器USART_CR1~3,串口的很多配置

        都是通過這3 個寄存器來設置的

        5,數據發送與接收。STM32 的發送與接收是通過數據寄存器USART_DR 來實現的,這是

        一個雙寄存器,包含了TDR 和RDR。

        6,串口狀態。串口的狀態可以通過狀態寄存器USART_SR 讀取。

        (注:詳細的介紹使用請參考ST公司的數據手冊)

        程序設計:

        (注:本人的usart.c usart.h delay.c delay.h sys.c sys.h是引用網上一位網友整理的)

        usart.h

        #ifndef __USART_H

        #define __USART_H

        #include

        #include "stdio.h"

        extern u8 USART_RX_BUF[64]; //接收緩沖,最大63個字節.末字節為換行符

        extern u8 USART_RX_STA; //接收狀態標記

        //如果想串口中斷接收,請不要注釋以下宏定義

        #define EN_USART1_RX //使能串口1接收

        void uart_init(u32 pclk2,u32 bound);

        #endif

        usart.c

        #include "sys.h"

        #include "usart.h"

        //加入以下代碼,支持printf函數,而不需要選擇use MicroLIB

        #if 1

        #pragma import(__use_no_semihosting)

        //標準庫需要的支持函數

        struct __FILE

        {

        int handle;

        };

        FILE __stdout;

        //定義_sys_exit()以避免使用半主機模式

        _sys_exit(int x)

        {

        x = x;

        }

        //重定義fputc函數

        int fputc(int ch, FILE *f)

        {

        while((USART1->SR&0X40)==0);//循環發送,直到發送完畢

        USART1->DR = (u8) ch;

        return ch;

        }

        #endif

        //end

        //////////////////////////////////////////////////////////////////

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

        //串口1中斷服務程序

        //注意,讀取USARTx->SR能避免莫名其妙的錯誤

        u8 USART_RX_BUF[64]; //接收緩沖,最大64個字節.

        //接收狀態

        //bit7,接收完成標志

        //bit6,接收到0x0d

        //bit5~0,接收到的有效字節數目

        u8 USART_RX_STA=0; //接收狀態標記


        上一頁 1 2 下一頁

        關鍵詞: STM32串口通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长沙市| 双辽市| 灵川县| 遂溪县| 金平| 红桥区| 镇巴县| 荥经县| 峡江县| 建始县| 三门县| 吉安市| 应城市| 成武县| 新兴县| 东源县| 新化县| 南漳县| 金乡县| 方城县| 金坛市| 扎鲁特旗| 无为县| 花莲县| 新和县| 浮梁县| 巩留县| 郧西县| 崇礼县| 张家界市| 资兴市| 乌恰县| 凌源市| 米易县| 顺平县| 新密市| 巩义市| 青海省| 彰化市| 五大连池市| 龙泉市|