STM32F103的簡易串口驅(qū)動(dòng)(查詢方式)
首先對照STM32F103的數(shù)據(jù)手冊,將相關(guān)寄存器的定義寫好,放在USART.h頭文件中。然后增加對串口的初始化、串口讀寫操作的函數(shù)即可。本測試程序功能很簡單,開機(jī)時(shí)通過串口發(fā)送一個(gè)"System start..."的字符串,然后等待串口接收數(shù)據(jù)。當(dāng)接收到數(shù)據(jù)后,將數(shù)據(jù)通過串口返回,然后流水燈工作一次,又繼續(xù)等待接收數(shù)據(jù)。
本測試程序設(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++;
}
}
評論