当前位置:   article > 正文

1.STM32CubeMX学习笔记一:STM32的GPIO开发基础_gpioc, gpio_pin_12

gpioc, gpio_pin_12

一、GPIO端口知识要点


1.GPIO:General Purpose Input & Output
2.STM32芯片最拥有GPIOA、GPIOB…GPIOG等7组端口,每组端口最多拥有Pin0、Pin1…Pin15共16个引脚。
3.STM32的每个I/O端口都可以自由编程,但I/O端口寄存器必须按32位字被访问。STM32的每个I/O端口都由7个寄存器来控制。
4.STM32的GPIO端口可以由软件配置成8种模式:
推挽输出、开漏输出、推挽式复用功能、开漏式复用功能;
模拟输入、浮空输入、下拉输入、上拉输入。

二、GPIO控制中常用的HAL函数


1.GPIO电平输出

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

参数1:GPIOx,端口号,如:GPIOB,GPIOF。
参数2:GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_12。
参数3:PinState,引脚输出状态。高电平----GPIO_PIN_SET;低电平----GPIO_PIN_RESET。
返回值:void,空。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

应用举例:向PB5引脚输入高电平

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
  • 1

2.GPIO电平翻转HAL库函数

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx,  uint16_t GPIO_Pin);

参数1:GPIOx,端口号,如:GPIOB,GPIOF。
参数2:GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_12。
返回值:void,空。
  • 1
  • 2
  • 3
  • 4
  • 5

应用举例:将PA3引脚输出电平翻转

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3);
  • 1

3.GPIO初始化函数源码剖析

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO端口时钟使能 */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*配置GPIO端口引脚的初始化输出电平 ,引脚为PB8,PB9,输出电平为低电平*/
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);

  /*配置GPIO端口输入引脚 : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;              //GPIO端口的引脚号是:13
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;         //GPIO的模式是:输入
  GPIO_InitStruct.Pull = GPIO_NOPULL;		  //没有上拉
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);	  //将参数结构设置到GPIOC端口

  /*配置GPIO端口输出引脚 : PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;	   //GPIO端口的引脚号是:8和9
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;	   //GPIO的模式是:输出
  GPIO_InitStruct.Pull = GPIO_NOPULL;		   //没有上拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;	   //GPIO的输出速度是:非常低速
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);	   //将参数结构设置到GPIOB端口
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

三、练习:基于STM32CubeMX的跑马灯和流水灯


在STM2F103ZET6开发板上,利用STM32CubeMX对STM32芯片的LED控制引脚进行配置并快速生产项目,在Keil5中进行代码编写,实现以下功能:
(1)跑马灯功能,即:LED0灯亮,过一会,LED1灯亮,过一会,LED0灯熄灭,过一会,LED1灯熄灭….如此循环。
(2)流水灯功能,即:LED0与LED1灯交替闪烁。

第一部分:根据开发板原理图,配置STM32CubeMX
1.开发板LED灯部分原理图如图所示:
LED灯部分原理图
由原理图不难看出,LED0的阴极与PB5引脚直接相连,LED1的阴极与PE5引脚直接相连,控制时,引脚为低电平,对应LED灯发光;引脚为高电平。对应LED灯熄灭。

2.配置STM32CubeMX
(1)实验中使用开发板通过STLink连接电脑仿真,Debug模式要选择SW模式,如果使用JTAG连接,对应连接方式选择JTAG。否则一会在Keil5中下载的时候,会提示找不到设备。
Debug模式选择SW模式
(2)时钟配置:如果需要使用外部晶振,需要再System Core菜单里选择RCC,将时钟源选择成为外部晶振
时钟源选择外部晶振
(3)观察时钟树,调节时钟频率:点击上方的Clock Configuration,在其中可以调节时钟频率,如果频率超过最大频率,会标记为红色
时钟树
(4)引脚配置:在STM32CubeMX的引脚图中,分别点击PB5和PE5两个引脚,由于STM32的芯片为引脚复用,在IO控制中,选择其模式为Output模式
引脚配置
随后可在左侧的GPIO菜单中看见这两个引脚,可以单击Modified进行设置,注意:勾选Modified才可以启用引脚
引脚信息设置
(5)导出项目,在Project Manager选项卡中设置导出的内容,包括项目位置与名称,和开发环境等,我用的是Keil5开发的,所以IDE需要选择MDF-ARM,最低支持版本为V5即可。
需要注意的是,左侧Code Generator选型卡中,第二块,第一条,Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral项需要选中。
以上内容设置好后,点右上角GENERATE CODE按钮导出即可,随后可进入Keil5项目中,进行代码的编写。

第二部分:Keil5中代码的编写
在Keil5中,可以发现,STM32CubeMX导出的项目中,结构清晰,并且留出了用户代码书写区域,用户需要将代码写入到书写区域中,这样如果后续开发需要再配置内容的时候,重新导出后,书写区的代码不会被清空;如果写入到非指定区域,代码会被清空。
本次练习为对IO口的控制,需要保证其持续运行,因此需要写到while(1)死循环中:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 while (1)
  {
  	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);  //实现PB5引脚电平的翻转
	HAL_Delay(500);  //延时500ms
	HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);  //实现PB5引脚电平的翻转
//		HAL_Delay(500);  //延时500ms,实现流水灯时,不需要对此行注释进行任何操作;如果实现跑马灯,清除掉此处注释标记即可
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

写完代码后,在Keil5里编译好后,就可以下载到单片机中。
对应源码:利用STM32F103ZET6开发板基于HAL库的STM32学习笔记一:GPIO开发基础例程

以上内容为本人学习b站小蜜蜂老师基于STM32CubeMX的嵌入式开发基础教程所做的笔记,其中有一些为个人的理解与感悟,如有疏漏之处,敬请大佬指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/219911
推荐阅读
相关标签
  

闽ICP备14008679号