STM32
直播中

李超

7年用户 1343经验值
私信 关注
[问答]

基于STM32CubeMX的外部中断设计步骤有哪些呢

按键信号该如何去识别呢?
基于STM32CubeMX的外部中断设计步骤有哪些呢?

回帖(1)

赖文文

2021-11-17 15:52:21
  STM32—HAL库 笔记
  一、led点灯
  1、输出电平
  HAL_GPIO_WritePin(GPIOx,uint16_t GPIO_Pin,GPIO_PIN_SET|GPIO_PIN_RESET);
  2、翻转电平
  HAL_GPIO_TogglePin(GPIOx,uint16_t GPIO_Pin);
   注意:stm32f1103c8tx LED2 是PB9,LoRa使用的是PA3
  3、电平输入函数
  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、STM32的外部中断
  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、外部中断触发条件:上升沿触发、下降沿触发或双边沿触发。
  注意:不能配置成高电平触发和低电平触发。
  2、基于STM32CubeMX的外部中断设计步骤:
  1、在STM32CubeMX中指定引 脚,配置中断初始化参数。
  2、重写该I/O引脚对应的中断回调函数。
  3、中断初始化配置
  将GPIO设置为: GPIO_ EXTl功能。
  设置中断触发条件:上升沿、下降沿、上升沿或下降沿。
  使能相关的NVIC通道。
  四、定时器
  1、STM32常见的定时器资源
  系统滴答定时器 SysTick
  看门狗定时器 WatchDog
  实时时钟 RTC
  基本定时器:TIM6、TIM7
  通用定时器:TIM2、TIM3、TIM4、TIM5
   可以实现输出比较、输入捕获、PWM生成、单脉冲模式输出
  高级定时器:TIM1、TIM8
  2、通用定时器知识点
  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,定时时间?
  3、基于STM32CubeMX中TIM的步骤:
  1、设置Clock Source 时钟源
  2、设置Prescaler 和 Counter Period参数
  3、设置NVIC嵌套向量中断控制器
   时钟信号32MHz,每隔500ms翻转一次输出电平
  4、中断服务函数编写
  五、串口通信
  1、知识点
  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复用。。
  2、STM32CubeMX中关于USART的配置
  3、HAL库中串口发送的重要函数
  阻塞式发送函数(初学者,推荐使用)
  HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleDef**huart,*
   uint8_t*pData,
   uint16_t Size,
   uint32_t Timeout);
  非阻塞式发送函数
  HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleDef**huart,*
   uint8_t*pData,
   uint16_t Size);
  发送完毕中断回调函数
  void HAL_UART_TxCpitCallback(UART_HandleTypeDef*huart);
  void HAL_UART_TxHalfCpItCallback(UART_HandleTypeDef*huart);
   //发送一半时调用,根据需要
  4、HAL库中串口接收的重要函数
  阻塞式接收函数
  HAL_StatusTypeDef HAL_UART_Receive(UART_HandleDef**huart,*
   uint8_t*pData,
   uint16_t Size,
   uint32_t Timeout);
  非阻塞式接收函数(推荐使用)
  HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleDef**huart,*
   uint8_t*pData,
   uint16_t Size);
  接收完毕中断回调函数
  void HAL_UART_RxCpitCallback(UART_HandleTypeDef*huart);
  void HAL_UART_RxHalfCpItCallback(UART_HandleTypeDef*huart);
  六、定时器与串口综合训练
  命令帧(3个字节)的格式为:
   0xBF为帧头 0xFB为帧尾,控制字节的定义如下:
   0xA1:打开LED2,返回信息“XX:XX:XX LED2打开。”
   0xA2:关闭LED2,返回信息“XX:XX:XX LED2关闭。”
   其他:返回信息“XX:XX:XX这个一个错误命令!“
  关于sprintf()函数用法:
  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)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分