初识STM32工作原理和基础编程

编程入门 行业动态 更新时间:2024-10-24 13:30:31

初识STM32<a href=https://www.elefans.com/category/jswz/34/1765046.html style=工作原理和基础编程"/>

初识STM32工作原理和基础编程

一、初识STM32如何简单的点亮一个LED灯呢?如何用一个按键控制LED灯的点亮与否呢?本文将对这些问题做一个比较详细的解答,其中还有几个比较经典的例子,希望能帮助大家更好的理解STM32的工作原理!

注:本文以STM32F103R6为例,用keil5编程,用proteus8.1来展示结果。

二、如何简单点亮一个LED黄灯?

1. 首先如图所示在proteus中画好原理图,要注意的是电阻不易过大,电阻过大,电阻上分压过多,会导致LED很暗或者点不亮!

2. 编写和讲解代码
a. 首先讲解LED配置文件,图中的led.c文件

解释如下:

void LED_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量,名字为GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIOA引脚使能,即启动PA的时钟//给结构体的成员变量赋值GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//定义GPIO引脚的模式为输出模式GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//定义操作的引脚为第0号引脚,GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率GPIO_Init(GPIOA,&GPIO_InitStruct);//PA0 对PA0进行初始化	
}

:为什么led.c中定义的是第0号引脚?
:因为原理图中LED灯接的是引脚PA0;
b.编写让LED点亮的代码:在main.c中写入

int main(void)
{int i = 0;LED_GPIO_Config();//LED初始化while(1)//死循环{		GPIO_ResetBits(GPIOA,GPIO_Pin_0);//功能 清零 PA0 LED亮main_delay(200);//延时,软件延时cpu空跑循环GPIO_SetBits(GPIOA,GPIO_Pin_0);//功能:置1 PA0 LED灭main_delay(200);//延时 }
} 

注:这里的GPIO_ResetBits()函数是清零,GPIO_SetBits()函数是置1
如此,简单的点亮LED灯就实现了!

例1:让一个黄灯和一个红灯交替闪烁

:同理先画好原理图然后在led.c中配置


解释:原理图中LED分别接在了PA0和PA6,所以在led.c中要同时定义PA0和PA6
:同时定义PA0和PA6,问什么是GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_6;这里面的GPIO_Pin_0 | GPIO_Pin_6怎么理解?
:本文中的STM32单片机有GPIOA,GPIOB,GPIOC三组引脚,每组有16个引脚,所以个引脚都是由16位2进制数来控制的。

0000000000000001,表示第0个引脚,;
0000000000000010,表示第1个引脚;
0000000000000100,表示第2个引脚;
……
1000000000000000,表示第16个引脚;
所以,同时定义PA0和PA6即GPIO_Pin_0 | GPIO_Pin_6=0000000001000001
在main.c中编写代码:

int main(void)
{int i = 0;LED_GPIO_Config();//LED初始化while(1)//死循环{		GPIO_ResetBits(GPIOA,GPIO_Pin_0);//功能 清零 PA0 黄LED亮GPIO_SetBits(GPIOA,GPIO_Pin_6);//功能:置1 PA6 红LED灭main_delay(200);//延时,软件延时cpu空跑循环GPIO_SetBits(GPIOA,GPIO_Pin_0);//功能:置1 PA0 黄LED灭GPIO_ResetBits(GPIOA,GPIO_Pin_6);//功能 清零 PA6 红LED亮main_delay(200);//延时 }
}

例2:用运4个LED,实时显示4位2进制数+1操作


对题目的解释:
如原理图中的绿灯、蓝灯、红灯、黄灯,分别对应4位2进制数的最低位到最高位。如当为0001时路灯亮,当为0011绿灯蓝灯同时亮,然而0001的十进制数是1,0011的十进制数是3,如此这样十进制数从1–>10对应的灯亮,这就是题目要求!
开始编写代码:
led.c中:

void LED_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//启动PA的时钟//给结构体的成员变量赋值GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//输出模式GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_6;//同时选中了0和6GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率GPIO_Init(GPIOA,&GPIO_InitStruct);//PA0 对PA0进行初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//启动PA的时钟//给结构体的成员变量赋值GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//输出模式GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_5;//选中了0和5GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率GPIO_Init(GPIOB,&GPIO_InitStruct);//PB0 对PA0进行初始化GPIO_ResetBits(GPIOA,GPIO_Pin_0);		
}

main.c中:

int main(void)
{int num;for(num = 0; num < 16; num++){			 //真 灯亮								//假 灯灭//第一个高位黄灯num & 8 ? GPIO_ResetBits(GPIOA,GPIO_Pin_0) : GPIO_SetBits(GPIOA,GPIO_Pin_0);//第二个 红灯num & 4 ? GPIO_ResetBits(GPIOA,GPIO_Pin_6) : GPIO_SetBits(GPIOA,GPIO_Pin_6);//第三个 蓝灯num & 2 ? GPIO_ResetBits(GPIOB,GPIO_Pin_0) : GPIO_SetBits(GPIOB,GPIO_Pin_0);//第四个 绿灯num & 1 ? GPIO_ResetBits(GPIOB,GPIO_Pin_5) : GPIO_SetBits(GPIOB,GPIO_Pin_5);}
}

三、如何使用按键控制LED灯的亮灭?

例:两个按键 点KEY1,黄灯亮 点KEY2 黄灯灭


开始代码的编写:
同样接入了按键,也需要对按键进行初始化,不同于LED的是,按键直接在main.c中初始化即可。

void keyInit()
{GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//启动PC的时钟//给结构体的成员变量赋值GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_7;//选中了1和7引脚GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率GPIO_Init(GPIOC,&GPIO_InitStruct);//PA0 对PA0进行初始化
}int main(void)
{keyInit();//按键初始化LED_GPIO_Config();//LED初始化while(1){//读取按键if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)//KEY1{GPIO_ResetBits(GPIOA,GPIO_Pin_0);//LED黄灯亮 }if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == 0)//KEY2{GPIO_SetBits(GPIOA,GPIO_Pin_0);//LED黄灯灭}}return 0;
}

例:如何实现一个按键控制一个灯的亮灭?按一下亮,按一下灭,再按一下亮,再按一下灭?

答:用flag状态标志位
代码如下:


int main(void)
{int flag = 1;//相当于标志位keyInit();//按键初始化LED_GPIO_Config();//LED初始化while(1){if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)//按了key1{if(flag)//第一次点按键,flag==1,条件成立{GPIO_ResetBits(GPIOA,GPIO_Pin_0);flag = 0;}else{GPIO_SetBits(GPIOA,GPIO_Pin_0);flag = 1;}}main_delay(200);//按键消抖}return 0;
}

以上就是本文所有内容,其中包含有经典例题,能够很好的认知STM32,希望能够帮助大家!!!

感谢您长期以来对博主冰河的支持,博主会再接再厉!

更多推荐

初识STM32工作原理和基础编程

本文发布于:2024-03-12 18:54:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732180.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:工作原理   基础

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!