你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32CubeMX】+外部中断

[复制链接]
xwl3190217171 发布时间:2020-3-6 17:02
1新建工程
1.1New Project
  • 1 搜索芯片型号
  • 2选择芯片
  • 3创建工程
1.2设置RCC  
  • 1 点击RCC
  • 2高速时钟(HSE)选择外部晶振
  • 3 软件自动配置管脚
1.3GPIO初始化
LED:4个GPIO_OUTPUT (输出模式)
按键:2个GPIO_EXITx(外部中断模式)
  • 1 点击对应管脚
  • 2 设置对应模式
GPIO的各种模式设置
  • GPIO output level   引脚电平设置   高/低
  • GPIO mode   GPIO模式     推挽输出/开漏输出
  • GPIO Pull-up/Pull-dowm   上拉下拉电阻      上拉电阻/下拉电阻/无上拉或下拉
  • Maxinum output speed   引脚速度设置   低速/中速/高速
  • User Label    用户标签   给引脚设置名称  如LED0
这里可以看出看和我们使用库函数的时候配置是一样的,但我们只需要动几下鼠标便可以完成操作,这正是STM32CubeMX的强大之处
GPIO_EXIT的6种模式
我们的按键选择下降沿触发

1.4设置NVIC(嵌套向量中断控制器)
  • 1点击NVIC2 勾选EXIT Line
  • 2 interrupt 和 EXIT Line[15:12] interrupt 使能中断
1.5时钟源设置
  • 1选择外部时钟HSE 8MHz
  • 2PLL锁相环倍频9倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2
32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》
1.6项目文件设置
  • 1 设置项目名称
  • 2 设置存储路径
  • 3 选择所用IDE
1.7创建工程文件
然后点击GENERATE CODE  创建工程
随后我们可以在stm32f1xx_it.c中看到我们所配置的中断服务函数  并且可以看到gpio的初始化分到了gpio.c里面
我们看到他有一个HAL_GPIO_EXTI_IRQHandler();函数
Go To Definition 查看一下函数代码
和我们库函数配置差不多,就是清除中断标志位,之后进入中断回调函数中
在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中,


配置下载工具
新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行
所有自己编写的代码请放在/* USER CODE BEGIN XXX */   /* USER CODE END XXX */之间
这样我们修改工程的时候你自己写的代码就不会被删除
HAL库 GPIO函数库讲解
在正常使用中,除了STM32CubeMX配置之外,我们有时候还需要自己配置一些东西,学习并理解HAL库,也是我们必须要学习的一个地方
首先打开stm32f4xx_hal_gpio.h  发现一共定义有8个函数
  • voidHAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
  • voidHAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
  • GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
  • voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
  • voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

voidHAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
voidHAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值
实例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写0或1
实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态   
实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。
实例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);   
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
功能:  外部中断服务函数,清除中断标志位
实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);   
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);   

GPIO_InitTypeDef结构体定义
  1. typedefstruct
  2. {
  3. uint32_t Pin; /*!< 选择引脚*/
  4. uint32_t Mode; /*!< 设置引脚模式*/
  5. uint32_t Pull; /*!< 引脚是否上拉或下拉*/
  6. uint32_t Speed; /*!< 设置引脚速度*/
  7. } GPIO_InitTypeDef;
复制代码

同时,不管是标准库还是HAL库,都是基于寄存器开发的,寄存器编程在哪个库都是适用的
GPIO的相关配置寄存器
STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:
GPIOx_CRL:端口配置低寄存器(32位)
GPIOx_CRH:端口配置高寄存器(32位)
GPIOx_IDR:端口输入寄存器(32位)
GPIOx_ODR:端口输出寄存器(32位)
GPIOx_BSRR:端口位设置/清除寄存器(32位)
GPIOx_BRR:端口位清除寄存器(16位)
GPIOx_LCKR:端口配置锁存寄存器(32位)
具体我们这里就不讲了,篇幅有限,可以到《STM32中文参考手册》中查看
关于GPIO的八种模式请参看 《STM32 GPIO八种模式及工作原理详解》
按键消抖:


  1. /**
  2. * 函数功能: 按键外部中断回调函数
  3. * 输入参数: GPIO_Pin:中断引脚
  4. * 返 回 值: 无
  5. * 说 明: 无
  6. */
  7. voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  8. {
  9. if(GPIO_Pin==KEY1_GPIO_PIN)
  10. {
  11. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
  12. if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
  13. {
  14. BEEP_TOGGLE;
  15. LED1_ON;
  16. LED2_ON;
  17. LED3_ON;
  18. }
  19. __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
  20. }
  21. elseif(GPIO_Pin==KEY2_GPIO_PIN)
  22. {
  23. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
  24. if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
  25. {
  26. BEEP_TOGGLE;
  27. LED1_OFF;
  28. LED2_OFF;
  29. LED3_OFF;
  30. }
  31. __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
  32. }
  33. }
复制代码


评分

参与人数 1 ST金币 +50 收起 理由
STMCU + 50 赞一个!

查看全部评分

1 收藏 2 评论3 发布时间:2020-3-6 17:02

举报

3个回答
飞跃-344154 回答时间:2020-3-10 21:22:25

写的不错,互支持一下。已点。

【STM32CubeMX】工欲善其事必先利其器之最强四大技巧
https://www.stmcu.org.cn/module/forum/thread-623621-1-1.html
ldptest 回答时间:2020-3-11 09:08:22
如何设置多个工程用同一个位置的库?
每个工程都拷一堆库,太浪费空间了,想把库统一放在工程外同一个位置。
mangge2020-2538 回答时间:2020-3-16 23:27:44
这个软件功能强大,使用方便。但是这个可以生成一个初始化好了的代码后,剩下的用库做功能实现就抓瞎了。比如我生成了定时器PWN输出的初始化代码,用户代码怎么用库函数实现启动定时器PWM输出、怎么调节PWN的脉宽、怎么停止等等???:

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版