STM32L052系列Hal库笔记—基础篇
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X, GPIO_PIN_SET/RESET);
//HAL库写入引脚电平函数,GPIOX为引脚的组,GPIO_PIN_X为引脚号,GPIO_PIN_SET/RESET为高电平或低电平
例:HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_ReadPin(GPIOX,GPIO_PIN_X);
//HAL库读取引脚的电平函数,GPIOX为引脚的组,GPIO_PIN_X为引脚号。
例:HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
一、中断的配置
1.在CubeMX中选择需要的中断引脚
2.配置中断的触发方式,第一项为上升沿触发,第二项为下降沿触发,第三项为双边沿触发,第五六七项为软件的触发。
3.配置中断优先级
勾选Enabled为使能中断,后面数字越小表示中断优先级越高。
—–此时CubeMX图形化配置完成—–
在编程界面直接调用void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
可以按如下方式处理中断 ( 若用按键中断注意消抖 )
二、串口通信轮询方式
1.串口发送
在CubeMX中配置需要的串口
在Mode中选择当前串口的模式:
Disable为关闭,Asynchronous为异步通信,Synchronous为同步通信。
下方为串口的高级设置,默认为115200,8为数据位,1为停止位,无校验位
—–此时CubeMX图形化配置完成—–
在程序中调用 HAL_UART_Transmit 发送数据
HAL_UART_Transmit(&huartX,&Date,Size,Time);
&huartX 为串口的句柄,若串口1为&huart1,串口2为&huart2。
&Date 为指向发送数据的地址,若发送单个变量则加&,发送数组则不加。
Size 为发送数据的长度,若发送数组可以填入sizeof(Date)。
Time 为中间的阻塞时间。
例:HAL_UART_Transmit(&huart1,sendbuf,sizeof(sendbuf),1000);
!!!用Printf串口打印的方式!!!
将以下代码复制到usart.c文件中,注意修改句柄(对应串口号)
——————————————————————————-
#include "stdio.h" // 移动到usart.h中
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
return (ch);
}
——————————————————————————-
勾选Use MicroLIB
此时就能使用printf打印了
若有警告在mian.c中包含#include <stdio.h>,不能打印中文。
2.串口接收
串口接收直接调用HAL_UART_Receive函数即可
HAL_UART_Receive(&huart1,revbuf,sizeof(revbuf),HAL_MAX_DELAY);
参数同上方串口发送函数,HAL_MAX_DELAY为最大的阻塞时间,意思为只有接收到指定长度的数据(根据缓冲区数组定义的长度)才进行下一步操作,若填写1000为1秒内没接收到数据就进行下一步操作。
三、串口通信中断方式
如上方轮询方式在CubeMX中配置好串口后,使能串口中断并设置优先级。
—–此时CubeMX图形化配置完成—–
程序中在主循环外调用HAL_UART_Receive_IT来初始化串口中断
HAL_UART_Receive_IT(&huart1,revbuf,sizeof(revbuf));
// 这三个参数和轮询串口接收相同,句柄、接收缓存区、长度,不过中断不能阻塞,故没有阻塞时间的参数
这是串口中断回调函数的例子:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
huart->Instance
四、独立看门狗
在CubeMX中的独立看门狗界面勾选Activated使能,将下方第一项独立看门狗预分频系数改为合适的值。
下图为不同预分频系数的最大超时时间
4095为设置的上限,可根据下方公式改变上限,调整溢出时间
—–此时CubeMX图形化配置完成—–
在程序中调用HAL_IWDG_Refresh(&hiwdg); 进行喂狗。
这是检测独立看门狗是否触发的例子,在主循环前调用。
__HAL_RCC_GET_FLAG(); 用来检测状态是否触发
RCC_FLAG_IWDGRST 为独立看门狗的复位标志
__HAL_RCC_CLEAR_RESET_FLAGS(); 用来清除复位标志为之后判断
五、窗口看门狗
在CubeMX中窗口看门狗界面,勾选Activated使能,下方第一项为窗口看门狗的预分频系数改为8,第二项为窗口期的上限值改为95,第三项为总的上限值这里改为127,第四项为窗口看门狗的中断使能本节暂不演示。
—–此时CubeMX图形化配置完成—–
程序中调用 HAL_WWDG_Refresh(&hwwdg); 进行喂狗
// 窗口看门狗为喂狗时机非常严格,必须在窗口期内喂狗才有效,在窗口期前喂狗或未进行喂狗会使系统复位。根据公式计算,如上设置在32.67ms<X<65.53ms 为正确喂狗时机。
在主循环前检测窗口看门狗是否触发,下方为例子:
__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)
__HAL_RCC_CLEAR_RESET_FLAGS();
六、窗口看门狗的中断
在窗口看门狗界面使能窗口看门狗中断,其他设置同上。
使能中断并配置窗口看门狗中断的优先级
—–此时CubeMX图形化配置完成—–
窗口看门狗的中断会在总倒计时溢出前进入中断,可以在中断里喂狗或者进行其他的操作。以下是在中断里喂狗的例子:
HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
HAL_WWDG_Refresh(hwwdg);
七、基本定时器
在CubeMX中的定时器界面选择基本定时器Tim6,勾选Activated 使能定时器,下方第一项为自动预分配器,第二项为向上计数,第三项为自动自动重装载的上限值(需小于65536),按图片设置即为500ms总时长的定时器
在中断界面使能中断,并配置中断优先级
—–此时CubeMX图形化配置完成—–
在程序中调用HAL_TIM_Base_Start_IT(&htim6); 使能定时器。
下方是中断回调函数的例子:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
八、通用定时器输出PWM波
这里以PA3为例,PA3属于通用定时器2中的通道四,所以我们在CubeMX界面中的定时器2界面
先将Clock Source(时钟源)选择 Internal Clock(内部时钟源),在通道是选择 PWM Generation CH4(PWM生成脉宽调制信号 通道4)。
在下方高级设置中,第一项预分频器配置为31,第三项自动重装载值为499。这样设置后可得一个2KHz周期(0.5ms)的PWM脉冲信号。// 通过改变高速频率的占空比可调整LED的亮度
在PWM通道四的配置中,第一项将PWM mode设置为模式2,第二项为CCR的初始值这里设为0(通过程序里设置)
下图为模式1和模式2的区别(主要为高低电平相反)
\\ 通过调节CCR的值可以控制高或低电平的持续时间
—–此时CubeMX图形化配置完成—–
在程序中先调用HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); 初始化定时器产生PWM,这里的两个参数第一项为句柄表示哪个定时器,第二项为通道口这个为通道四。
之后可以调用__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,val);修改CCR的值,这里前两个参数同上,第三个参数就是CCR的值,可以是常数也可以是变量。
下方是通过两个变量来控制CCR值的大小,实现呼吸灯的例子:
die 用来控制 val 递增或递减,val 要有uint16_t 定义
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,val);
九、ADC
本节还未总结可以先移步至此,这篇写的很详细。STM32 ADC详细篇(基于HAL库) – 东小东 – 博客园https://www.cnblogs.com/dongxiaodong/p/14355843.html
未完待续…
作者:蓝色是智慧的颜色