本人小白一个,最近对硬件很感兴趣,便买来一块秉火的STM32开发板,使用了STM32F103VET6芯片。
学习数天以后,获得了一点心得,现作一篇学习笔记,以作记录。
本人硬件小白一个,也是第一次写博客,文章多有纰漏和不当之处,还请大家多多关照。
下面正文开始。
首先,USART是什么呢?
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。(来自百度)
这是官方解释,而我对它的通俗解释是:这是一个用于和其他设备(如电脑、单片机等)通信(交换数据、信息等)的端口,就像手机数据线那样。
当然,这只是我的一种通俗看法,大家经过了深入的学习之后,一定会产生更为准确、成熟的看法。
我所学习的,就是通过这个模块来实现单片机和电脑之间的通信,并以此为基础,实现利用电脑来简单地控制单片机的目的。
那么,我们来简单地看一看我们这段代码由哪几部分组成:
1. 用于存储相关配置的结构体。
2. 变量Temp,用于存储从电脑接收到的信息。
3. 配置TX、RX、时钟、串口、LED灯。
4. 预先设置LED灯关闭的一段代码。
5. 主函数,实现接收数据、改变灯的亮灭状态。
好了,代码结构就是这样了,下面我们来具体地分析一下代码。
1. 结构体:
GPIO_InitTypeDef GPIO_LED_InitStructure;
GPIO_InitTypeDef GPIO_USART_TX_InitStructure;
GPIO_InitTypeDef GPIO_USART_RX_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 配置USART_TX
GPIO_USART_TX_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_USART_TX_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_USART_TX_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_USART_TX_InitStructure);
// 配置USART_RX
GPIO_USART_RX_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_USART_RX_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_USART_RX_InitStructure);
// 配置串口
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
//配置灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_LED_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_LED_InitStructure);
//关闭灯
GPIO_SetBits(GPIOB, GPIO_Pin_0);
while (1)
{
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
temp = USART_ReceiveData(USART1);
USART_SendData(USART1,temp);
GPIOB->ODR ^=GPIO_Pin_0;
}
}
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_LED_InitStructure;
GPIO_InitTypeDef GPIO_USART_TX_InitStructure;
GPIO_InitTypeDef GPIO_USART_RX_InitStructure;
USART_InitTypeDef USART_InitStructure;
int main()
{
unsigned short int temp;
// 配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 配置USART_TX
GPIO_USART_TX_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_USART_TX_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_USART_TX_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_USART_TX_InitStructure);
// 配置USART_RX
GPIO_USART_RX_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_USART_RX_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_USART_RX_InitStructure);
// 配置串口
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
//配置灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_LED_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_LED_InitStructure);
//关闭灯
GPIO_SetBits(GPIOB, GPIO_Pin_0);
while (1)
{
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
temp = USART_ReceiveData(USART1);
USART_SendData(USART1,temp);
GPIOB->ODR ^=GPIO_Pin_0;
}
}
}