原创 STM32F103的简易串口驱动(查询方式)

2008-7-30 01:43 6857 3 3 分类: MCU/ 嵌入式

    对于各个模块的学习,开始通常是只使用最简单的功能。这里将给出一个STM32F103的最基本的串口收、发驱动。要使用串口,就需要对串口的波特率、数据格式等进行设置。这里给出的例子是使用的USART1,它的时钟是连接在APB2上的,在计算波特率时应该使用APB2的输出时钟。另外,使用查询方式的话,还需要禁止掉串口的相关中断,以防止程序跑飞。由于STM32F103的串口引脚是跟普通IO口复用的,所以在使用之前,一定要记得初始化对应的IO口,选择为相应的第二功能,否则串口将无法正常工作。
    首先对照STM32F103的数据手册,将相关寄存器的定义写好,放在USART.h头文件中。然后增加对串口的初始化、串口读写操作的函数即可。本测试程序功能很简单,开机时通过串口发送一个"System start..."的字符串,然后等待串口接收数据。当接收到数据后,将数据通过串口返回,然后流水灯工作一次,又继续等待接收数据。


    本测试程序设置的波特率为9600,由宏BIT_RATE定义,然后在程序中计算需要设置的分频值。小数部分中的值为实际的小数部分乘以16。


 


从这里下载整个测试包:rar


部分代码如下:


#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)
 {
  Usart1PutChar(pString);
  i++;
 }
}


 

文章评论0条评论)

登录后参与讨论
相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
广告
我要评论
0
3
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /2 下一条