STM32 task5学习记录

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

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

我很高兴为您解答有关STM32F407学习笔记的问题。根据引用和引用中的内容,学习STM32F407可以使用CubeMax和Keil这两款软件。CubeMax是一个方便易用的工具,可以帮助您进行单片机的开发和编程。Keil是一款集成开发环境(IDE),可以用于编写、调试和下载嵌入式软件。 在学习过程中,您可以根据引用的建议,收藏您经常使用的芯片,例如STM32F407,以便下次使用更加方便。 对于学习STM32F407的详细内容和步骤,我建议您参考引用中提到的PPT和引用中提到的学习笔记。这些资料可能包含了关于STM32F407的基本知识、GPIO和按键的使用等内容。您可以根据这些资料逐步学习和实践。 在学习过程中,如果您遇到问题或有任何疑问,可以向您的学长们求助或在实验室中寻求帮助。他们可以提供补充的知识和指导,并纠正您可能存在的错误。 最后,我希望您的STM32F407学习之旅能够顺利进行,并祝您在电赛国赛中取得优异的成绩!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32F407学习笔记(1)基于hal库,CubeMX以及keil5的基本使用。](https://blog.youkuaiyun.com/qq_63466056/article/details/127707521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值