实验三 时钟与RS232串口通信实验
实验目的
-
掌握STM2系统时钟的初始化,串口参数的配置
-
会使用MDK逻辑分析仪测量系统的时钟等信号
-
使用示波器测量串口信号
实验原理
系统时钟
STM32有5个时钟源:HSI,HSE,LSI,LSE,PLL.本实验便用PLL时钟,为锁相环倍频输出,其时钟输入源.可选择为HSI/2,HSE或HSE/,倍频可选相为2-16倍,但是其输出频率最大不得超过72MH
系统时钟SYSCLK可来源干HSL、HSE与PLL时钟,STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE或系统时钟
系统加电后,系统时钟提供默认的时钟信是供CM3核及总线工作。在启动后,先对系统时钟进行设置,以保证系统各设备正常工作。STM32F103在启动时,默认采用8MHzHSIRC时钟。需要采用多个寄存器来控制各部分的参数,以获取所需的时钟
串行通信
- 串行异步通信——以字符为单位组成字符帧传送数据(每次发一个字符)
- 字符格式(字符帧格式,数据格式)
不发数据时、数据线为空闲状态“1”
以起始位“0”为信息起始标志
6/7/8数据位(由软件设置)
0~1 校验位(NUNE/OOD/EVEM)
1~2停止位(软件编程)
- 波特率——指每秒钟传送二进制码元的位数,单位为s,STM32常用波特率:1200,2400,4800,9600,38400,57600,115200.在任何情况下,收发方的波特率和字符格式必须相同方可正常通信
STM32的串行收发器USART包含3个部分:
- 控制寄存器/状态寄存器用干设置波特率、设置字符格式,管理各种标志位
- 发送器由发送寄存器和移位寄存器组成
- 接收器由移位寄存器和接收寄存器组成
STN32F103有3个串行异步收发器USART,实验箱利用USART1口形成RS232总线,PA9用于串行发送,经过电平转换器MAX232形成TXD,PA10用于串行接收,来目RXD的信号经MAX232与PA10相连。串行通信字符格式为:1位起始位,8位数据位,1位停止位。
实验任务
- 修改例程UART_LED,CPU运行在48M时钟下,波特率为9600,连续发送字符A,用示波器测量PA9发送测量点TP23信号,计算实际信号的波特率,分析误差结果
- (选作)运行例程UART_LED,选软件仿真用MDK逻辑分析仪测量PA8的脉冲宽度,测量Delay函数延时时长。
实验过程
CPU运行在48M时钟下
P L L = 48 8 = 6 PLL=\frac{48}{8}=6 PLL=848=6
则将代码修改为
unsigned char PLL=6;//六倍频
波特率为9600
48000000 16 ∗ 9600 = 312.5 \frac{48 000 000}{16*9600}=312.5 16∗960048000000=312.5
取整数部分: 312 D = 138 H 312D = 138H 312D=138H
取小数部分: 0.5 ∗ 16 = 8 , 8 D = 8 H 0.5*16=8,8D=8H 0.5∗16=8,8D=8H
因此波特率代码修改为:
USART1->BRR=0x1388;//波特率9600
程序代码
#include "usrt1.h"
void DevInit()
{
//RCC
unsigned char PLL = 6; //6倍频
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR|=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2; //抵消2个单位(因为是从2开始的,设置000就是2,0111就是9)
RCC->CFGR|=PLL<<18; //设置PLL值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x31; //FLASH 1个延时周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
//USART1
RCC->APB2ENR|= (1<<2|1<<14);//PA,USART1使能
GPIOA->CRH=0x04B0; //PA9,PA10复用设置成USART1
USART1->BRR=0x1388;//波特率9600
USART1->CR1|=(1<<13)|(1<<2)|(1<<3);
//PA8
GPIOA->CRH&=0XFFFFFFF0; //PA8输出设置
GPIOA->CRH|=0X00000003; //同上
GPIOA->ODR|=1<<8; //PA.8 设初值
}
void Delay(int n)
{
int i;
for (i=0;i<n;i++);
}
void LedFlash()
{
Delay(0x2fffff);
GPIOA->ODR|=1<<8;//LED0(ON)
Delay(0x2fffff);
GPIOA->ODR&=~(1<<8);//LED0(OFF)
}
void UartEcho()
{
if(USART1->SR&(0x1<<5))//接受R不空
if(USART1->SR&(0x1<<7))//发送R空
{
USART1->DR = USART1->DR;//发送并回显
}
}
int main()
{
DevInit();
while(1)
{
UartEcho();
LedFlash();
}
}
MDK逻辑分析显示波形
示波器测量串口信号
学习心得
-
掌握了STM2系统时钟的初始化,串口参数的配置
-
学会了使用MDK逻辑分析仪测量系统的时钟等信号