一、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,操作更方便哦