STM32 task5学习记录

本文详细介绍了STM32串口通信的基础知识,包括异步全双工协议、波特率控制、数据存储转移和GPIO初始化。通过代码示例展示了如何配置USART1,实现了printf函数的重定向,并提供了USART1_printf()函数的使用。博主还分享了学习心得,提到新买的调试设备已到,成功烧录并运行了LED程序。
摘要由CSDN通过智能技术生成

Day5

目录

一、串口概述

1.异步、全双工通信协议

2.波特率控制

3.数据存储转移

4.代码部分

二、代码中具体函数说明

1.GPIO初始化

2.USART初始化

3.printf()函数重定向

4.USART1_printf()函数

三、预期效果

四、今日总结:


一、串口概述

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程序了,后面也会继续手敲代码,自己做出实验现象的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值