|版权声明:本文为博主原创文章,转载请注明出处。https://blog.youkuaiyun.com/NeverImagine_/article/details/95517664
目前ST官方有提供两种库文件,一种是标准库,一种是HAL库,在HAL库问世之前,标准库一直被嵌入式工程师广泛使用,由于标准库的资源都是开源的,几乎所有应用网上都可以找到demo,所以无论是老工程师还是初学者都十分推崇。然而近几年开始,ST官方大力推行使用HAL库,其优势是操作方便,所有底层都封装好,用户在开发时只需调用其生成的API即可。同时,HAL库可以通过ST官方提供的STM32CubeMX图形软件生成,用户可根据不同的应用进行相应的配置,Cube可以根据用户的配置自动生成底层代码,用户只需根据需求开发自己的功能函数即可。
笔者入坑软件的时候是从标准库开始学习的,最近开始学习使用HAL库,HAL库十分冗长但功能强大(很多使用标准库需要自己完成的操作,例如简单的操作GPIO的输出,HAL库都已经封装成了现成的函数,只是初学者找起来比较麻烦。。),熟悉了HAL库的套路之后,开发就变的容易多了。笔者也是刚整明白基于HAL库的串口打印程序,在此记录。
一、使用STM32CubeMX进行引脚的相关配置
本实验为了实现两个按键的串口打印程序,在按下PA0按键时上位机显示“1”,按下PC13按键时上位机显示“2”。
这里只是为实现串口打印的功能,所以只需配置一个串口即可,但为了直观,本文还配置了一三个输出口两个输入口,作为不同的状态显示。配置如图一:
图一、本实验的引脚配置
其中:在本实验中,对于PA0和PC13两个按键来说,配置成输入模式和外部中断模式在功能上是一样的,在应用中需要根据输入的紧要程度进行判断是否设置成中断模式。
这里需要注意打开串口中断,如图二所示:
图二、打开串口中断
配置完成之后点击右上角GENERATE CODE生成代码,注意生成代码时根目录的文件夹名称不能出现中文,否则会提示错误。
二、代码分析
生成的代码目录如图三:
图三、生成的代码目录(点击编译后左边会出现“+”)
在这里,所有底层代码都已经根据配置生成好了,例如gpio.c文件中:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PH10 PH11 PH12 */
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OU