【STM32学习笔记】#002 GPIO设置练习

系列文章目录

-【STM32学习笔记】#001 前期准备



前言

参考ST的导入教程(STM32マイコン体験実習(導入編)GPIO実習編)来进行GPIO设置相关的练习。


一、目标功能

通过SW的按压操作对LD(发光二极管)进行点亮/熄灭操作。
在这里插入图片描述

二、CubeMX设置

1 端口设置1(Port Setting)

使用Cube的【Pinout & Configuration】功能对MCU端口的特性进行下面的设置。
 - PC13: UserSwitch GPIO_EXTI13
 - PA5: LED(LD2) GPIO_Output

端口设置

所谓的端口设置,就是从端口能实现的众多功能中选定某一项功能拿来使用。比如说PC13端口,能够实现GPIO输入(Input)、输出(Output)、模拟量输入(analog input, 不知道是不是这个中文翻译)以及本应用所选定的EXTI等功能,通过端口设置(Cube:鼠标单击对应端口)将端口与内部的相应模块进行连结。具体的实现过程就是,通过设置对应的寄存器,控制CMOS或者其他半导体开关使得相应模块和端口形成通路。
EXTI这个词,我也是第一次见到,就查了一下 datasheet,上面是这样说明的。大概内容就是,通过对外部信号的上升沿、下降沿的检测来实现中断或者产生事件。

External interrupt/event controller (EXTI)
The external interrupt/event controller consists of 19 edge detector lines used to generate interrupt/event requests. Each line can be independently configured to select the trigger event (rising edge, falling edge, both) and can be masked independently. A pending register maintains the status of the interrupt requests. The EXTI can detect an external line with a pulse width shorter than the Internal APB2 clock period.

2 端口设置2(Port Setting)

设置好端口功能后,对具体的动作模式进行如下设置。

在这里插入图片描述

3 时钟设置(Clock Setting)

使用Cube的【Clock Configuration】功能对MCU时钟频率进行设置。
STM32F103的系统时钟可由下面三种时钟源驱动。
  ① HSI(High Speed Internal) oscillator clock
  ② HSE(High Speed External) oscillator clock
  ③PLL(Phase Locked Loop, 锁相环) clock
①是直接使用内部晶振(8MHz)所产生的时钟信号。
②是使用外部的时钟信号,可以是信号源,也可以是晶振回路。我买的板子Nucleo-64没有外置信号源,所以不可用。
③的时钟信号来源也是内部晶振,通过PLL回路对频率(晶振频率的一半)进行倍增,103最高是16倍。

参考教程使用的芯片型号是F104, 时钟特性与F103有一些差别,不能设置到84MHz。鉴于F103的最高频率是72MHz,而且还必须是4的倍数,作如下设置。
  - HCLK 16 → 64 [MHz]

4 中断设置(Interrupt Setting)

在NVIC里对中断进行设置。
 - enable “EXTI line[15:10] interrupts”
 - 优先度(Preemption Priority)降低到1

在这里插入图片描述

5 文件保存和代码生成

简单记录一下注意事项。
 - 文件名不能含有汉语、空白、空格字符;
  代码生成时可以选择"Copy only the necessary library files"以减少储存占用。

二、写代码

1 流程图

在这里插入图片描述

2 代码


/* USER CODE BEGIN 0 /
/
USER CODE END 0 */

代码行之间添加如下代码:

__IO uint8_t Pushed;


/* USER CODE BEGIN 3 /
/
USER CODE END 3 */

代码行之间添加如下代码:

Pushed = 0;
while (Pushed == 0);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

–> 函数完整代码:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Pushed = 0;
	  while (Pushed == 0);
	  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }

  /* USER CODE END 3 */
}


/* USER CODE BEGIN 4 /
/
USER CODE END 4 */

代码行之间添加如下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_13)
	{
		Pushed = 1;
	}
}

–> 函数完整代码:

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

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : B1_Pin */
  GPIO_InitStruct.Pin = B1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : LD2_Pin */
  GPIO_InitStruct.Pin = LD2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_13)
	{
		Pushed = 1;
	}
}
/* USER CODE END 4 */

3 库函数说明

  • HAL_GPIO_TogglePin
HAL_GPIO_TogglePin
Function name void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
Function description Toggles the specified GPIO pin. 对选定的GPIO引脚电平进行翻转
Parameters GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
GPIO_Pin: Specifies the pins to be toggled.
Return values None
  • HAL_GPIO_EXTI_Callback
HAL_GPIO_EXTI_Callback
Function name void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
Function description EXTI line detection callbacks. 外部中断服务函数,清除中断标志位
Parameters GPIO_Pin: Specifies the pins connected EXTI line.
Return values None

总结

很简单的功能,但还是花了不少时间。虽然时间花了不少,但也熟悉了CubeMX、Keil软件的使用,同时也对固件库有了初步的一些了解。
还有为了写这个学习笔记,对markdown的使用,特别是表格相关的使用也积累了一些经验。


参考资料/拓展阅读

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值