STM32初识---概念了解(上)

单片机概念

单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处 理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功 能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成 到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

STM系列单片机的命名规则

ST -- 意法半导体

M -- Microelectronics 微电子

32 -- 总线宽度

STM32F103C8T6

STM旗下的一款芯片,也是我现在学习的STM32芯片:

寄存器,标准库与HAL库:

三种方式都可以对单片机进行控制,但是每种方式都有各自的特点:

1. 寄存器(底层控制,直接但繁琐)

- 寄存器众多,需要经常翻阅芯片手册,费时费力;

- 更大灵活性,可以随心所欲达到自己的目的;

- 深入理解单片机的运行原理,知其然更知其所以然。

2. 标准库(每款芯片的专用库,简单但不易移植)

- 将寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用;

- 每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的;

- 配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能;

-大大降低单片机开发难度,但是在不同芯片间不方便移植。

3. HAL库(所有芯片的统一库,较简单且兼容性高但效率低)

- ST公司目前主力推的开发方式,新的芯片已经不再提供标准库;

- 为了实现在不同芯片之间移植代码;

- 为了兼容所有芯片,导致代码量庞大,执行效率低下。

 

GPIO口概念

GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与 外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。

简单来说我们可以控制GPIO引脚的电平变化,达到我们的各种目的。

GPIO口的命名规则:

组编号+引脚编号

组编号:GPIOA, GPIOB, GPIOC, GPIOD .. GPIOG

引脚编号:0,1,2,3,4...15

组合起来: PA0, PA1, PA2 .. PA15 PB0, PB1, PB2 .. PB15 PC0, PC1, PC2 .. PC15 ...

有一些特殊功能的引脚是不能用作IO的:例如,我使用的STM32F103C8T6有48个引脚,但只有37个GPIO口,而剩下的都是用作特殊功能的,比如VCC,BOOT等...

内部框架图(了解即可):

 推挽输出和开漏输出:

推挽输出 可以真正的输出高电平和低电平

开漏输出开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完 成对外驱动

点亮LED

其实点亮LED的操作在上节已经实现了,这里在深入了解一下相关函数:

1. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); 

效果是对一个GPIO口写入1或者0,第一个参数是GPIO的组第二个参数是GPIO的引脚第三个参数是GPIO_PIN_RESET(0)或GPIO_PIN_SET(1)

2. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

效果是初始化GPIO口,第一个参数是GPIO的组第二个参数是一个结构体指针,可以通过跳转查看具体信息:

typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
} GPIO_InitTypeDef;

因此在执行GPIO的初始化之前需要自己定义一个结构体 GPIO_InitTypeDef GPIO_InitStruct = {0};

并对其中的成员进行赋值:

 /*Configure GPIO pins : PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

3. void HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);

效果是反转GPIO口的状态,第一个参数是GPIO的组第二个参数是GPIO的引脚

使用轮询法实现按键点亮LED灯

1. 查看单片机的PCB图中的KEY:

可见, 如果按钮SW1,2被按下,会对应KEY1,2被拉低,所以可以通过观察A0和A1是否被拉低来判断按钮是否被按下。

2. 那么首先要涉及到PA0,PA1的初始化,所以可以打开上节编辑到一半的CubeMX软件来配置:

2.1 将PA0和PA1设计成“GPIO_Input”:

 2.2 将PB8,9的初始值设置为高电平,这样程序烧录之后灯不会立刻亮起来:

2.3 由于是在上节的工程基础上改的,所以不需要在设置Project Manager里面的内容

2.4 点击“GENERATE CODE”生成代码:

 3. 如果我希望按钮1被按下时,LED1亮,再次按下熄灭;如果按钮2被按下时,LED2亮,再次按下熄灭

  在Keil中,写入代码并烧写进入单片机:

#define KEY_ON 0
#define KEY_OFF 1

uint8_t key_scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //返回值是一个无符号整型
{
	if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET){//读管脚数据,如果为GPIO_PIN_RESET,则为0,此时按键摁下
		while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);//按键消抖
		return KEY_ON;		
	}else{//按键松开
		return KEY_OFF;
	}
}

int main(void)
{
  
  SystemClock_Config();

  MX_GPIO_Init();

  while (1)
  {
      if(key_scan(GPIOA, GPIO_PIN_0) == KEY_ON){ //如果A0对应的按钮按下
	      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8); //反转LED1的状态
	  }
		
	  if(key_scan(GPIOA, GPIO_PIN_1) == KEY_ON){ //如果A1对应的按钮按下
	      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9); //反转LED2的状态
      }

   }
}

4. 观察效果:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值