【硬件】无线传感网实训——Keil软件使用、蜂鸣器、串口、rgb灯、STM32、ST-Link

一、Keil软件使用

1)创建一个项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引用常用的库函数
在这里插入图片描述

创建c源程序
在这里插入图片描述
在这里插入图片描述
把c源程序引入项目

在这里插入图片描述
在这里插入图片描述

2)配置运行环境

选中你需要的调试器。我的是ST-Link Debugger
在这里插入图片描述
在这里插入图片描述
查看st-link是否连接成功
在这里插入图片描述
连接成功则可以直接编译运行,否则只能编译,运行报错。
在这里插入图片描述

二、STM32 GPIO使用

操作步骤:

1.使能GPIO对应的外设时钟

例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟

/* Enable GPIOA, GPIOB and SPI1 clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_SPI1, ENABLE);
2.声明一个 GPIO_InitStructure 结构体

例如:

//必须放在main()下面,所有的初始化操作必须放在main()下面,否则编译器不通过
GPIO_InitTypeDef GPIO_InitStructure;
3.选择待设置的 GPIO 管脚

例如:

/* 选择带待设置的 GPIO 第7、8、9管脚位,中间加“|”符号 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
4. 设置选中GPIO管脚的速率

例如:

/* 设置选中GPIO管脚的速率为最高速率2MHZ,常用的就是10MHZ */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
5. 设置选中GPIO管脚的模式

例如:

/* 设置选中GPIO管脚的模式,只允许有一种,推挽输出是实训用到的 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出模式

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
6. 根据 GPIO_InitStructure 中指定的参数初始化外设 GPIOX

例如:

/* 根据GPIO_InitStructure中指定的参数初始化外设 GPIOX */
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化操作
7. 其他应用

例:

//将端口 GPIOA 的第10、15脚置1(高电平)
GPIO_SetBits(GPIOC, GPIO_Pin_7 | GPIO_Pin_9);
//将端口 GPIOA 的第10、15脚置0(低电平)
GPIO_ResetBits(GPIOC, GPIO_Pin_8);

三、实战

下面的方法都用了库函数stm32f10x.h,请参考第一部分 引用常用的库函数的图,勾选所用到的库函数。

实战一:点亮Led灯并让它闪烁
#include <stm32f10x.h>

void delay(int n){
	int i;
	while(n--){
		for(i=0;i<1000;i++);	
	}
}
int main(){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体

	//时钟給电15.2.22
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
	
	//GPIO初始化
	//10.2.3
	//对PC13的引脚进行初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;//设置13的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化操作
	
	
	
	//10.2.10
	//设置高低电平
	while(1){
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);//低电平
		delay(10000);
		GPIO_SetBits(GPIOC, GPIO_Pin_13);//可以设置多个引脚
		delay(10000);
	}
}

实战一:点亮RGB灯并让它五颜六色闪烁
#include <stm32f10x.h>
#include <stdio.h>
void GPIOA_INIT(void){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体
	
	
	//使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
	
	//GPIOA初始化赋值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 |  GPIO_Pin_2 | GPIO_Pin_3;//设置13的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化操作
}

void delay(int n){
	int i;
	while(n--){
		for(i=0;i<1000;i++);	
	}
}
//通过高低电平配合,达到显示rgb颜色的效果
//(red,green,blue)~~(GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_3)
void RGB_INIT(int color){
	switch(color){
		case 0:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 1:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 2:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 3:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 4:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 5:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 6:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;

	}
}

int main(){
	int color=0;
	GPIOA_INIT();
	
	while(1){
		RGB_INIT(color%7);
		color++;
		delay(10000);//延时
	}
}
实战二、Led灯和RGB灯同时闪烁
#include <stm32f10x.h>
#include <stdio.h>
void GPIOA_INIT(void){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体
	
	
	//使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
	
	//GPIOA初始化赋值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 |  GPIO_Pin_2 | GPIO_Pin_3;//设置13的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化操作
}
void GPIOC_INIT(void){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体

	//时钟給电15.2.22
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
	
	//GPIO初始化
	//10.2.3
	//对PC13的引脚进行初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;//设置13的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化操作
}
void delay(int n){
	int i;
	while(n--){
		for(i=0;i<1000;i++);	
	}
}

void RGB_INIT(int color){
	switch(color){
		case 0:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 1:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 2:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 3:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 4:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			break;
		case 5:
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;
		case 6:
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);
			break;

	}
	
}

int main(){
	int color=0;
	GPIOA_INIT();
	GPIOC_INIT();
	
	while(1){
		RGB_INIT(color%7);
		color++;
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);//低电平
		delay(5000);
		GPIO_SetBits(GPIOC, GPIO_Pin_13);//可以设置多个引脚
		delay(5000);
	}
	
}
实战三、蜂鸣器叫起来(几乎一模一样的代码)

单片机上的io口和随便一个引脚相连

单片机上的GND与板子上面的GND互联

单片机上的VCC和5V相连

#include <stm32f10x.h>

void delay(int n){
	int i;
	while(n--){
		for(i=0;i<1000;i++);	
	}
}
int main(){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体

	//时钟給电15.2.22
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
	
	//GPIO初始化
	//10.2.3
	//对PC13的引脚进行初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;//设置13的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置工作模式,推挽输出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化操作
	
	//10.2.10
	//设置高低电平
	while(1){
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);//低电平
		delay(1000);
		GPIO_SetBits(GPIOC, GPIO_Pin_13);//高电平
		delay(1000);
	}
}
实战4、连接串口

1、连接

连接:
串口上的 TX 连接 STM32 上的 PA10
串口上的 RX 连接 STM32 上的 PA9

GND连接G,3.3V连接3.3

在这里插入图片描述

2、创建项目

在这里插入图片描述
有个GCC忘记画框框了
请添加图片描述

3、代码

#include <stm32f10x.h>

void GPIOA_INIT(void){
	//定义的结构体变量必须放在开头
	GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体

	//1. 时钟給电
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
	
	//2. 初始化GPIO
	//PA9 输出模式 初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化操作
	
	//PA9 输入模式 初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//最高输出速率10MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化操作
	
}
//串口初始化 库函数手册21章,21.2.2
void USART1_INIT(void){
	USART_InitTypeDef USART_InitStructure;
	
	//1.使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);
	
	//2.USART1 初始化(配置项的值,根据出厂的硬件参数配置)
	USART_InitStructure.USART_BaudRate = 115200;//波特率,设置为115200
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//不要校验位,设置为no,不要校验位。
	USART_InitStructure.USART_HardwareFlowControl =
	USART_HardwareFlowControl_None;//硬件流的控制,不需要,设置为NULL
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//外设,既要输出也要输入Rx接收,Tx输出
	USART_Init(USART1, &USART_InitStructure);//初始化
	
	USART_Cmd(USART1, ENABLE);//使能串口外设
	
}
//发送数据,找发送数据的函数,21.2.12,USART_SendData()发送数据的函数
void USART1_SendData(unsigned char senddata){
	//需要一个个的发送,否则会舍弃之前的,只会发送最后一个
	USART_SendData(USART1, senddata);//USART1串口名,senddata得到的数据
	//21.2.22,获取串口标志位,防止发送数据的时候错位
	//如果一直未发送成功,则一直等待发送成功。RESET为没有发送成功的返回
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
}

//发送字符串
void USART1_SendString(char *str){
	while(*str){
		USART1_SendData(*str);
		str++;
	}
}

//接收数据
void USART1_RECVDDATA(){
	while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);
	//没有接收完成,返回RESET,为真,会等待接收完成
	//接收完成,返回SET,为假,跳出while循环
	USART_ReceiveData(USART1);
}

int main(){
	//初始化
	GPIOA_INIT();
	USART1_INIT();
	
	//发送字符串数据
	USART1_SendString("hello\n");
	
	//发送单个字符数据
	USART1_SendData('T');
	USART1_SendData('a');
	USART1_SendData('n');
	USART1_SendData('g');
	
}
//我还那么认真的记录课后作业,结果老师还是吧设备收回去了。平时很少有人能帮到我,非常感谢老师带我硬件入门,开心。
//扩展任务:
//怎么让接收的数据感受到
//思路:接收到数据、发送数据,通过RGB灯来做响应。
//发送一个1、2、3,得到数据,RGB灯给相应的回馈

3、看效果

1、通过st-link把代码写到stm32上,再通过串口,把stm32连接到电脑上,此时设备管理器可以看到多了一个端口。

在这里插入图片描述

2、通过串口调试助手操作,设备没了,只能单纯的截图记录操作了。

在这里插入图片描述

四、单片机&我的小手手图解

1、STM32

正面&插面有3个G。

GPIO:A、B、C,有好多引脚。

有3个可以給电的引脚,3.3、3.3、5V。

绿色在亮的是led灯,这个灯需要写入程序才会亮

红色的在亮,说明有电压
在这里插入图片描述
在这里插入图片描述

2、ST-Link

在这里插入图片描述

3、RGB灯

有红绿蓝三种基本颜色,连接 STM32上的三个引脚,一个GND
在这里插入图片描述

4、蜂鸣器

UCC表示电压入口,I/O与控制该蜂鸣器的引脚连线。
在这里插入图片描述

5、串口

在这里插入图片描述

TXD为输出,RXD为输入

串口与STM32是交叉连接,串口的接收与STM32的发送相连。

在这里插入图片描述
在这里插入图片描述

环境、工具地址:

链接:https://pan.baidu.com/s/1HPu1tY968-8rglpws0L_mg
提取码:360k
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值