Day5
目录
一、串口概述
1.异步、全双工通信协议
初始化时,要设置以下参数:字长、波特率、奇偶校验位、停止位
2.波特率控制
向波特率寄存器USART_BRR写入参数
串口时钟分频值USARTDIV分为两部分,分别是DIV_Mantissa,DIV_Fraction,计算公式USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
串口的时钟源经过USARTDIV分频后分别作为发送器时钟及接收器时钟,控制发送和接收的时序
3.数据存储转移
发送数据:内核或DMA外设——数据寄存器TDR——移位寄存器——串口线Tx——发送出去、
接收数据:接到数据——串口线Rx——移位寄存器——接受数据寄存器RDR——DMA或内核读取到内存中
/****************穿插一段复用功能的要求***************/
复用功能(AF)
使用默认复用功能前必须对端口位配置寄存器编程。
● 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。
● 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
● 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。
/*************************************************************/
4.代码部分
【main.c】
#include "stm32f10x.h"
#include "stdio.h"
#include "usart1.h"
int main(void)
{
/*USART1 config 115200 8-N-1*/
USART1_Config();
printf("\r\n this is a printf demo \r\n");
printf("\r\n 要好好学习单片机:) \r\n");
USART1_printf(USART1,"\r\n this is a printf demo \r\n");
USART1_printf(USART1,"\r\n (" _DATE_ " - " _TIME_" ) \r\n");
for(;;)
{
}
}
【usart1.c】
#include "stm32f10x.h"
/**
* @brief描述:USART GPIO配置,工作模式配置。115200 8-N-1
* @param输入:/
* @retval返回值:/
* @调用方式:外部调用
*/
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/*config USART1 clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);
/*USART1 GPIO config*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*Configure USART1 Rx(PA.10) as input floating
将USART1 Rx(PA.10)配置为浮动输入*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*USART1 mode config*/
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
【usart1.h】
#ifndef __USART1_H__
#define __USART1_H__
void USART1_Config(void);
#endif
二、代码中具体函数说明
1.GPIO初始化
由表格,Tx为发送端,输出引脚,GPIO是复用功能要把它配置成复用推挽模式
Rx引脚为接收端,输入引脚,配置为浮空输入模式
2.USART初始化
USART_InitStructure.USART_BaudRate=115200; 设置波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; 配置串口传输的字长,这里配置为常用的8位字长
USART_InitStructure.USART_Parity=USART_Parity_No; 配置停止位,把停止位设置为1位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;配置奇偶校验位 不设置
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; 配置硬件流控置 不设置
USART_Init(USART1,&USART_InitStructure); 配置串口的模式,为了配置双线圈双控模式,需要把RxTx都打开
USART_Cmd(USART1,ENABLE);调用USART_Cmd使能USART1外设
3.printf()函数重定向
printf("\r\n this is a printf demo \r\n");
printf("\r\n 要好好学习单片机:) \r\n");
USART1_printf(USART1,"\r\n this is a printf demo \r\n");
USART1_printf(USART1,"\r\n (" _DATE_ " - " _TIME_" ) \r\n");
为了实现重定向我们需要重写fputc()这个函数,因为printf在C语言库是个宏,最终调用fputc()这个函数,在usart1.c里重写
4.USART1_printf()函数
关于USART1_ printf (USART_ TypeDef* USARTx, uint8_ t *Data...)这个函数的实现,它调用了itoa (int value, char *string, int radix)函数。关于这两个函数的具体实现请看usart.c中的源代码。这两个函数中有些变量是定义在stdarg.h这个头文件中的,所以在usart.c中我们需要把这个头文件包含进来,这个头文件位于KDE的根目录下。我们可以在这个路径下找到它:C:\Keil\ARMARV31\INC。
三、预期效果
四、今日总结:
后面必须提一提速度了,另外后面也会多注意博客的排版的。
今天学习了stm32的串口,这是一个基本却十分重要的功能,在配置上来说,32单片机的串口配置比51单片机复杂很多,但是硬件原理基本是类似的,而初始化的格式和点亮LED灯也是类似的,这就是把握了所谓的规律性吧
新买的dap到了,终于成功烧录点亮之前的led程序了,后面也会继续手敲代码,自己做出实验现象的