實驗?zāi)康模?/p>
實現(xiàn)利用串口1不停的打印一個信息到電腦上,同時接收從串口發(fā)過來的數(shù)據(jù),把發(fā)送過來的數(shù)據(jù)直接送回給電腦。
實驗平臺:
基于STM32F103C8T6的彩屏開發(fā)板
硬件接口:
注意:因為我的開發(fā)板上的串口和LED共用了PA9和PA10,所以在使用USART1時務(wù)必屏蔽LED,不然兩者會互相影響而導(dǎo)致實現(xiàn)現(xiàn)象無法呈現(xiàn)。
相關(guān)寄存器:
1,串口時鐘使能。串口作為STM32 的一個外設(shè),其時鐘由外設(shè)時鐘使能寄存器控制,這
里我們使用的串口1 是在APB2ENR 寄存器的第14 位。
2,串口復(fù)位。串口1 的復(fù)位是通過配置APB2RSTR 寄存器的第14位來實現(xiàn)的。。通過向該位寫1來復(fù)位串口1,寫0 結(jié)束復(fù)位。
3,串口波特率設(shè)置。每個串口都有一個自己獨立的波特率寄存器USART_BRR
波特率的計算,STM32 的串口波特率計算公式如下:
上式中, 是給串口的時鐘(PCLK1 用于USART2、3、4、5,PCLK2 用于USART1);USARTDIV是一個無符號定點數(shù)。我們只要得到USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值。
4,串口控制。STM32 的每個串口都有3 個控制寄存器USART_CR1~3,串口的很多配置
都是通過這3 個寄存器來設(shè)置的
5,數(shù)據(jù)發(fā)送與接收。STM32 的發(fā)送與接收是通過數(shù)據(jù)寄存器USART_DR 來實現(xiàn)的,這是
一個雙寄存器,包含了TDR 和RDR。
6,串口狀態(tài)。串口的狀態(tài)可以通過狀態(tài)寄存器USART_SR 讀取。
(注:詳細的介紹使用請參考ST公司的數(shù)據(jù)手冊)
程序設(shè)計:
(注:本人的usart.c usart.h delay.cdelay.h sys.c sys.h是引用網(wǎng)上一位網(wǎng)友整理的)
#ifndef __USART_H
#define __USART_H
#include<stm32f10x_lib.h>
#include"stdio.h"
extern u8USART_RX_BUF[64];
extern u8USART_RX_STA;
//如果想串口中斷接收,請不要注釋以下宏定義
#define EN_USART1_RX //使能串口1接收
void uart_init(u32 pclk2,u32 bound);
#endif
#include "sys.h"
#include "usart.h"
//加入以下代碼,支持printf函數(shù),而不需要選擇useMicroLIB
#if 1
#pragmaimport(__use_no_semihosting)
//標準庫需要的支持函數(shù)
struct __FILE
{
};
FILE__stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
}
#endif
//end
//////////////////////////////////////////////////////////////////
#ifdefEN_USART1_RX
//串口1中斷服務(wù)程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8USART_RX_BUF[64];
//接收狀態(tài)
//bit7,接收完成標志
//bit6,接收到0x0d
//bit5~0,接收到的有效字節(jié)數(shù)目
u8USART_RX_STA=0;
void USART1_IRQHandler(void)
{
}
#endif
//該函數(shù)的重點就是判斷接收是否完成,通過檢測是否收到0X0D、0X0A 的連續(xù)2 個字節(jié)//(0X0D 后跟0X0A表示回車鍵)來檢測是否結(jié)束。當檢測到這個結(jié)束序列之后,就會置//位USART_RX_STA的最高為來標記已經(jīng)收到了一次數(shù)據(jù)。之后等待外部函數(shù)清空該位//之后才開始第二次接收。所接收的數(shù)據(jù)全部存放在USART_RX_BUF里面,一次接收數(shù)//據(jù)不能超過64個字節(jié),否則被丟棄。
//初始化IO 串口1
//pclk2:PCLK2時鐘頻率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{
#ifdefEN_USART1_RX
#endif
}
#include<stm32f10x_lib.h>
#include"common.h"
int main(void)
{
}
實驗現(xiàn)象:
聯(lián)系客服