STM32—HAL库 笔记
HAL_GPIO_WritePin(GPIOx,uint16_t GPIO_Pin,GPIO_PIN_SET|GPIO_PIN_RESET);
HAL_GPIO_TogglePin(GPIOx,uint16_t GPIO_Pin);
注意:stm32f1103c8tx LED2 是PB9,LoRa使用的是PA3
GPIO_PinState HAL_GPIO_ReadPin(GPIOx,uint16_t GPIO_Pin);
按键信号的识别:一般来说,按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。
在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平。
1、为什么去抖动:按键的输入引脚有低电平产生不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
2、如何去抖动:首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
3、以STM32f103zet6为例
KEY0--------设置为上拉
KEY1--------设置为上拉
KEY2--------设置为上拉
KEY_UP--------设置为下拉
在未知按键电路时建议设置为浮空输入
1、中断、中断源、中断向量、中断优先级、中断服务函数…
2、ARM Cortex M3内核支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别。
3、STM32的中断通道可能会由多个中断源共用。这就意味着,某一个中断服务函数也可能被多个中断源所共用。所以,在中断服务函数的入口处,需要有一个判断机制,用以辨别是那个中断触发了中断。
4、STM32中有2个优先级**的概念:抢占优先级和响应优先级,每个中断都需要指定这两种优先级。
5、Cortex M3内核中有一个称为嵌套向量中断控制器(NVIC )的设备,对中断进行统一的协调和控制。其中最主要的工作就是控制中断使能和确定中断优先级。
1、外部中断EXTl是STM32芯片实时处理外部事件的一种机制,由于中断请求来自GPIO端口的引脚,所以称为外部中断。
2、STM32芯片有16个外部中断源EXTI0~EXT|15, 分别对应着7个中断向量,也就是对应着7个中断服务函数。
EXTI0、EXTl1、EXT|2、 EXTI3、 EXTI4:专用。
EXTI5~EXTI9:共用。
EXTl10~EXTI15:共用。
3、EXTI0的连接引脚是: PA0~PG0,即每个端口组的0号引脚。以此类推。
4、外部中断触发条件:上升沿触发、下降沿触发或双边沿触发。
注意:不能配置成高电平触发和低电平触发。
1、在STM32CubeMX中指定引 脚,配置中断初始化参数。
2、重写该I/O引脚对应的中断回调函数。
将GPIO设置为: GPIO_ EXTl功能。
设置中断触发条件:上升沿、下降沿、上升沿或下降沿。
使能相关的NVIC通道。
系统滴答定时器 SysTick
看门狗定时器 WatchDog
实时时钟 RTC
基本定时器:TIM6、TIM7
通用定时器:TIM2、TIM3、TIM4、TIM5
可以实现输出比较、输入捕获、PWM生成、单脉冲模式输出
高级定时器:TIM1、TIM8
STM32的通用定时器是一个通过可编程预分频器( Prescaler )驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
通用定时器的基本工作原理:
首先,定时器时钟信号送入16位可编程预分配器(Prescaler) ,该预分配器系数为0~65535之间的任意数值。预分配器溢出后,会向16位的主计数器(Counter Period)发出-一个脉冲信号。
预分频器,本质上是一个加法计数器,预分频系数实际上就是加计数的溢
出值。.
定时器发生中断时间的计算方法:
定时时间= (Prescaler+1 ) X (Counter Period+1) X 1/定时器时钟频率
时钟信号1KHz,Prescaler为9 ,Counter Period为999,定时时间?
1、设置Clock Source 时钟源
2、设置Prescaler 和 Counter Period参数
3、设置NVIC嵌套向量中断控制器
时钟信号32MHz,每隔500ms翻转一次输出电平
1、并行通信和串行通信
2、单工、半双工、全双工
3、 异步串行通信:通信双方在没有同步时钟的前提下,将-一个字符(包括特定的附加位)按位进行传输的通信方式。波特率:每秒钟传输的二进制位数,如9600bps.
4、波特率:每秒传输的二进制位数,如9600bps
5、TTP电平<----->RS232:MAX3232 SP3232
串口<------->USB接口:CH340 CP2012
STM32芯片的串口UASRT功能十分强大,但对于日常编程而
言,使用最多的还是异步串行通信。
USART1_ TX与PA9复用,USART1_ RX与PA10复用。
USART2_ TX与PA2复用,USART2_ RX与PA3复用。.
阻塞式发送函数(初学者,推荐使用)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleDefhuart,*
uint8_t*pData,
uint16_t Size,
uint32_t Timeout);
非阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleDefhuart,*
uint8_tpData,
uint16_t Size);
发送完毕中断回调函数
void HAL_UART_TxCpitCallback(UART_HandleTypeDefhuart);
void HAL_UART_TxHalfCpItCallback(UART_HandleTypeDef*huart);
//发送一半时调用,根据需要
阻塞式
阻塞式接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleDefhuart,*
uint8_t*pData,
uint16_t Size,
uint32_t Timeout);
非阻塞式接收函数(推荐使用)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleDefhuart,*
uint8_tpData,
uint16_t Size);
接收完毕中断回调函数
void HAL_UART_RxCpitCallback(UART_HandleTypeDefhuart);
void HAL_UART_RxHalfCpItCallback(UART_HandleTypeDef*huart);
0xBF为帧头 0xFB为帧尾,控制字节的定义如下:
0xA1:打开LED2,返回信息“XX:XX:XX LED2打开。”
0xA2:关闭LED2,返回信息“XX:XX:XX LED2关闭。”
其他:返回信息“XX:XX:XX这个一个错误命令!“
sprintf(),指的是字符串格式化函数,把格式化的数据写入某个字符串中。
int sprintf(char string, char format [,argument…]);
引入头文件#include “stdio.h”
例:有一个表示温度的整型变量tmp,现在要将其格式化为字符串“温度是: XX摄氏度”,并将其通过串口1发送出去。
uint8_ t Str_ buff[64];
sprintf((char)Str_ buff, “温度是: %d摄氏度”, tmp);
HAL_ UART_ Transmit(&huart1, Str_ buff, sizeof(Str_ _buff), 0xFFFF);
定时器、串口 、LED闪灯
步骤:
1、宏定义 LED输出电平 翻转电平
2、定义 数组 时间变量 字符串缓冲数组 串口接收缓冲区
3、灯光检测
4、串口发送 HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);
5、打开定时器 HAL_TIM_Base_Start_IT(&htim2);
6、串口发送回调函数 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
7、串口接收 HAL_UART_Receive_IT(&huart1,Rx_data,3);非阻塞式
串口接收缓冲区
3、灯光检测
4、串口发送 HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);
5、打开定时器 HAL_TIM_Base_Start_IT(&htim2);
6、串口发送回调函数 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
7、串口接收 HAL_UART_Receive_IT(&huart1,Rx_data,3);非阻塞式
8、串口接收回调函数 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)