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

【STM32CubeMX】+外部中断

[复制链接]
神圣雅诗人 发布时间:2020-3-6 17:02
1新建工程
1.1New Project
  • 1 搜索芯片型号
  • 2选择芯片
  • 3创建工程
    7 Y. a! `1 o0 L' c
1.2设置RCC  
  • 1 点击RCC
  • 2高速时钟(HSE)选择外部晶振
  • 3 软件自动配置管脚5 O5 W( K* {# [$ {# g
1.3GPIO初始化
LED:4个GPIO_OUTPUT (输出模式)
按键:2个GPIO_EXITx(外部中断模式)
  • 1 点击对应管脚
  • 2 设置对应模式" Y. C/ S: I* U
GPIO的各种模式设置
  • GPIO output level   引脚电平设置   高/低
  • GPIO mode   GPIO模式     推挽输出/开漏输出
  • GPIO Pull-up/Pull-dowm   上拉下拉电阻      上拉电阻/下拉电阻/无上拉或下拉
  • Maxinum output speed   引脚速度设置   低速/中速/高速
  • User Label    用户标签   给引脚设置名称  如LED0
    ! \% s8 u: b8 }) l9 c7 m: j
这里可以看出看和我们使用库函数的时候配置是一样的,但我们只需要动几下鼠标便可以完成操作,这正是STM32CubeMX的强大之处
GPIO_EXIT的6种模式
我们的按键选择下降沿触发

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

$ D5 K$ R+ r5 }7 a( s* r配置下载工具
新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行
所有自己编写的代码请放在/* 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);
    # m# X' m. P5 `
3 y6 G) ?3 |. ]  S' m' L" y
voidHAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);9 ~0 `: L. b$ O1 N1 |% ]9 [. ?
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
voidHAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);0 b5 q% e! |: w# f, |/ _. M) x
功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值
实例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);1 w* }* @3 I3 a& P* P2 G' F  s
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);: `' ?0 f: T( W6 r
功能:引脚写0或1
实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);  ^- P3 T0 h7 \+ m+ |- r: ^; n
翻转引脚的电平状态   
实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
6 L3 c  ^: D0 y$ v
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。
实例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);   
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
5 F# V2 X/ J# x9 K& ^
功能:  外部中断服务函数,清除中断标志位
实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);   
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);2 D8 V6 O- `* x" t; M- g+ k
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);   
" {* M' m- ^0 ~4 i  n
GPIO_InitTypeDef结构体定义
  1. typedefstruct; H: f( L" [! a( |! F
  2. {! z& }, a3 |4 {# b" B" v2 F9 L
  3. uint32_t Pin; /*!< 选择引脚*/2 L# k( ?3 h' I1 q9 G4 \
  4. uint32_t Mode; /*!< 设置引脚模式*/9 P" @$ |& q; j3 ]) B6 o5 a
  5. uint32_t Pull; /*!< 引脚是否上拉或下拉*/
    8 W0 R% S1 Y  l5 l& I# M4 x
  6. uint32_t Speed; /*!< 设置引脚速度*/$ t* P% w) g' Y$ s8 i! T
  7. } GPIO_InitTypeDef;
复制代码
5 D" h4 a, X$ q9 u- O* h8 v# D, e
同时,不管是标准库还是HAL库,都是基于寄存器开发的,寄存器编程在哪个库都是适用的
GPIO的相关配置寄存器
STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:
GPIOx_CRL:端口配置低寄存器(32位)
4 ?: e& q- U- u+ y; a! J3 ]4 l8 qGPIOx_CRH:端口配置高寄存器(32位)
9 {. o; U; E5 {9 _+ S( V+ t9 A3 kGPIOx_IDR:端口输入寄存器(32位)
% m. M) N- _. y: a( b( @GPIOx_ODR:端口输出寄存器(32位)- M3 W7 M( e" R) X1 H6 c) P3 e# n
GPIOx_BSRR:端口位设置/清除寄存器(32位)
3 R- D" K4 v9 BGPIOx_BRR:端口位清除寄存器(16位)4 l+ e/ H: b& U6 Q6 l( X" I
GPIOx_LCKR:端口配置锁存寄存器(32位)
具体我们这里就不讲了,篇幅有限,可以到《STM32中文参考手册》中查看
9 F& }1 `; m4 `0 Y+ A4 M
关于GPIO的八种模式请参看 《STM32 GPIO八种模式及工作原理详解》
按键消抖:
  1. # J1 I1 L3 e0 Z7 {0 ^: S2 W

  2. ! ?" o" m- `2 W; A
  3. /**
    8 z' C# A! }9 m" X. a* U- n5 y
  4. * 函数功能: 按键外部中断回调函数4 E% L* ^9 b$ g2 ?. w
  5. * 输入参数: GPIO_Pin:中断引脚
    ' ~3 h4 \0 @7 F" h. i  i
  6. * 返 回 值: 无
    : s6 O8 S0 N+ b' s
  7. * 说 明: 无
    5 l8 }* K6 @- S. A, E
  8. */
    : S7 P8 h7 n7 \4 _+ t
  9. voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)2 D' f* k  o% ~' S* y+ j
  10. {/ r( q, h9 ~' ~& z6 u
  11. if(GPIO_Pin==KEY1_GPIO_PIN)
    3 ?" w9 _: Z; x' m- F* O  x9 ~
  12. {
    - N2 a7 i; i& u6 o- a2 H
  13. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    9 D% B8 ^4 p2 l8 W$ Q1 P6 E
  14. if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)2 {/ ]; ?4 _+ ?1 q
  15. {5 J) M4 m. K$ g/ C# R5 g
  16. BEEP_TOGGLE;
    4 b7 ~0 n6 F) T( B- Y
  17. LED1_ON;- i0 v, l, [4 O
  18. LED2_ON;
    ) ?  L- {, T0 q7 C9 t7 [2 v
  19. LED3_ON;) ]- M1 i) p9 d3 D1 y2 O' _& ]
  20. }
    6 E% j. M% z3 C, g0 t: D  I) L4 g2 e
  21. __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
    ( J. f* S( W! x' R/ t& N2 }  L/ q% A  A( U4 p
  22. }
    1 b+ y8 I9 \# k* M; R- _
  23. elseif(GPIO_Pin==KEY2_GPIO_PIN): ^+ l2 U4 e3 I" L3 C2 l: Y, E
  24. {
    3 F/ I0 e0 W, q7 b1 |" c  F; M4 W3 _
  25. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    + g% @% n% y0 N) U. ?
  26. if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
      R1 n" s- z) z/ t
  27. {* `8 k6 Y3 k0 j9 Y2 S
  28. BEEP_TOGGLE;' T8 ~+ [- l" o5 W# X: \: L( N
  29. LED1_OFF;
    $ H7 M/ a6 [" X9 {& u0 r# C0 R5 [
  30. LED2_OFF;
    6 j9 B, F. L" _: F9 k1 d
  31. LED3_OFF;
    - _2 ~% o& S* H; N+ ]
  32. }
    / d$ t4 ^% p0 D
  33. __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
      R' m, v6 l4 D$ e2 u
  34. }! u- C/ l9 {7 d, c$ J
  35. }
复制代码
* D3 X" `. m6 i8 x  u  a9 H

3 ]& `8 O7 i  V) j

评分

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

查看全部评分

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

举报

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

- f! R; C. A1 y写的不错,互支持一下。已点。+ z5 u9 g7 O6 x4 @! g

$ Z: l6 Q. i; f& w  j( L/ ?- {8 {【STM32CubeMX】工欲善其事必先利其器之最强四大技巧" `! c: y: t8 w  P5 h3 T5 X8 J) |, h+ v
https://www.stmcu.org.cn/module/forum/thread-623621-1-1.html
网络孤客 回答时间:2020-3-11 09:08:22
如何设置多个工程用同一个位置的库?
: k* C! y/ O- I% z3 X3 L8 m每个工程都拷一堆库,太浪费空间了,想把库统一放在工程外同一个位置。
mangge2020-2538 回答时间:2020-3-16 23:27:44
这个软件功能强大,使用方便。但是这个可以生成一个初始化好了的代码后,剩下的用库做功能实现就抓瞎了。比如我生成了定时器PWN输出的初始化代码,用户代码怎么用库函数实现启动定时器PWM输出、怎么调节PWN的脉宽、怎么停止等等???:

所属标签

相似分享

官网相关资源

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