系列文章目录
文章目录
前言
参考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的使用,特别是表格相关的使用也积累了一些经验。