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)。

        在下方高级设置中,第一项Prescaler为预分频器根据定时器挂载的总线配置通常分频为1MHz(如L052定时器的在APB1总线上,APB1频率为32MHz,故这里填32-1),第三项自动重装载值(ARR),频率的计算方式为Prescaler/ARR,这里设置为500-1。这样设置后可得一个2KHz周期(0.5ms)的PWM脉冲信号。// 通过改变高速频率的占空比可调整LED的亮度

        在PWM Generation Chanel4的配置中,第一项将PWM Mode的区分如下图第二项为Pulse的初始值这里可以通过程序设置也可以填写可能简单理解为高电平持续时间,这里的值不能大于ARR。如我需要配置占空比为50%,这里该填写为250。

下图为模式1和模式2的区别(主要为高低电平相反)

\\ 通过调节CCR的值可以控制高或低电平的持续时间

-----此时CubeMX图形化配置完成-----

        在程序中先调用HAL_TIM_Base_Start(&hitm2),启动定时器。HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); 初始化定时器产生PWM,这里的两个参数第一项为句柄表示哪个定时器,第二项为通道口这个为通道四。

之后可以调用__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,val);修改CCR的值(也就是CubeMX中的Pulse),这里前两个参数同上,第三个参数就是CCR的值,可以是常数也可以是变量。

下方是通过两个变量来控制CCR值的大小,实现呼吸灯的例子:

die 用来控制 val 递增或递减,val 要有uint16_t 定义

__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,val);

九、ADC

    1.ADC单通道DMA采集

        首先选择一条通道,使能ContinuousConversionMode(连续转换模式)和DMAContinuousRequests(DMA请求)。DMA设置中模式选择Cirular(循环模式)如上图配置。

-----此时CubeMX图形化配置完成-----

        在代码中先定义uint16_t ADC_Values[5]={0};存放ADC值,只需调用HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Values,5);使能DMA就能自动更新数值。

本节还未总结可以先移步至此,这篇写的很详细。STM32 ADC详细篇(基于HAL库) - 东小东 - 博客园https://www.cnblogs.com/dongxiaodong/p/14355843.html

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值