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

【STM32CubeMX】+外部中断

[复制链接]
神圣雅诗人 发布时间:2020-3-6 17:02
1新建工程
1.1New Project
  • 1 搜索芯片型号
  • 2选择芯片
  • 3创建工程
    ' x/ F( x! _0 r" c/ ~
1.2设置RCC  
  • 1 点击RCC
  • 2高速时钟(HSE)选择外部晶振
  • 3 软件自动配置管脚7 H- P! Z7 X! ?# Y
1.3GPIO初始化
LED:4个GPIO_OUTPUT (输出模式)
按键:2个GPIO_EXITx(外部中断模式)
  • 1 点击对应管脚
  • 2 设置对应模式
    * A- u( i; U" H' R1 r0 u; l! C' h
GPIO的各种模式设置
  • GPIO output level   引脚电平设置   高/低
  • GPIO mode   GPIO模式     推挽输出/开漏输出
  • GPIO Pull-up/Pull-dowm   上拉下拉电阻      上拉电阻/下拉电阻/无上拉或下拉
  • Maxinum output speed   引脚速度设置   低速/中速/高速
  • User Label    用户标签   给引脚设置名称  如LED00 g: `: }4 f" Q8 N
这里可以看出看和我们使用库函数的时候配置是一样的,但我们只需要动几下鼠标便可以完成操作,这正是STM32CubeMX的强大之处
GPIO_EXIT的6种模式
我们的按键选择下降沿触发
2 p& ^4 j8 V1 Z5 N
1.4设置NVIC(嵌套向量中断控制器)
  • 1点击NVIC2 勾选EXIT Line
  • 2 interrupt 和 EXIT Line[15:12] interrupt 使能中断0 i* t# t# ]/ Z( `
1.5时钟源设置
  • 1选择外部时钟HSE 8MHz
  • 2PLL锁相环倍频9倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2! ?+ k, S% m" e7 O8 I1 B) g" R
32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》
1.6项目文件设置
  • 1 设置项目名称
  • 2 设置存储路径
  • 3 选择所用IDE% [' e! G0 k/ z7 ?( C
1.7创建工程文件
然后点击GENERATE CODE  创建工程
随后我们可以在stm32f1xx_it.c中看到我们所配置的中断服务函数  并且可以看到gpio的初始化分到了gpio.c里面
我们看到他有一个HAL_GPIO_EXTI_IRQHandler();函数
Go To Definition 查看一下函数代码
和我们库函数配置差不多,就是清除中断标志位,之后进入中断回调函数中
在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中,

! z6 [8 T8 I/ C& f5 T* D* X( N% y- b/ 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);
      o8 U  j; p4 c' R% ^

& o7 }7 ]7 M3 P. u, BvoidHAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);/ z0 h: C2 ~5 X& z% _0 D0 \- X
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
voidHAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);7 G  C9 I. d; Q- K9 G( q6 l
功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值
实例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);! T( B7 ~/ s: A* y% h) Z- K' g
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
' j* n# S+ v" A, B: b" F2 r
功能:引脚写0或1
实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);# C1 Y6 z9 ?" S/ ?, b+ x! R
翻转引脚的电平状态   
实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);9 V+ K9 b& X' C/ I1 @
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。
实例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);   
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);9 c( E- D: W! @
功能:  外部中断服务函数,清除中断标志位
实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);   
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);5 F. o8 K3 t/ `1 [
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);   
& `, k& U% J$ W* x, g0 z# l
GPIO_InitTypeDef结构体定义
  1. typedefstruct' |3 W9 u  }% g" z, G
  2. {7 J  w9 {6 z8 ]8 s
  3. uint32_t Pin; /*!< 选择引脚*/
    : ^0 O/ {2 S5 y. ]5 [$ O
  4. uint32_t Mode; /*!< 设置引脚模式*/) Y/ c6 L0 N' K) H
  5. uint32_t Pull; /*!< 引脚是否上拉或下拉*/
    , U  @1 {( ]$ u9 J& l/ e) c; x5 |
  6. uint32_t Speed; /*!< 设置引脚速度*/4 F; R8 Q" d4 n! x
  7. } GPIO_InitTypeDef;
复制代码

9 Q9 }) Q0 b, }5 E. c+ o7 R
同时,不管是标准库还是HAL库,都是基于寄存器开发的,寄存器编程在哪个库都是适用的
GPIO的相关配置寄存器
STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:
GPIOx_CRL:端口配置低寄存器(32位)" ^6 l# x, R8 W8 g: h
GPIOx_CRH:端口配置高寄存器(32位)' A; [: g; f& d) E
GPIOx_IDR:端口输入寄存器(32位)
$ o' c' X4 s4 ~" e$ h* F: A7 HGPIOx_ODR:端口输出寄存器(32位)* r/ ?9 B0 Z% ?. R( _; f
GPIOx_BSRR:端口位设置/清除寄存器(32位)
; z; x+ P/ e! J7 PGPIOx_BRR:端口位清除寄存器(16位)
4 E8 _8 n  j2 e$ D: j$ b" yGPIOx_LCKR:端口配置锁存寄存器(32位)
具体我们这里就不讲了,篇幅有限,可以到《STM32中文参考手册》中查看9 [( r0 U( W5 Q0 q: w0 S
关于GPIO的八种模式请参看 《STM32 GPIO八种模式及工作原理详解》
按键消抖:

  1. - S* c6 ^* \$ ]
  2. 7 T+ g$ @* H- c! s8 F  L' D. F
  3. /**' P" U5 s- e5 z8 a  s! {
  4. * 函数功能: 按键外部中断回调函数6 H+ Y4 v2 z/ X6 M
  5. * 输入参数: GPIO_Pin:中断引脚
    8 K2 ]! U4 v+ T  x% [+ R& J& |
  6. * 返 回 值: 无
    * a) A8 W1 o$ u* `. T: ?* G0 R& B
  7. * 说 明: 无
    : t8 i; N8 U2 ~& w* v+ {
  8. */
    : p. R8 H' H7 Z) `) Y. [; `& Q
  9. voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    # n  z& w) j+ \3 q! {# j1 |. \
  10. {
    + X; J$ s: Q6 w6 n6 J
  11. if(GPIO_Pin==KEY1_GPIO_PIN)
      a$ p5 c+ E0 M9 S" E
  12. {
    ' V3 Y( X/ a5 |) {5 S5 V
  13. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    4 T4 r* H* w& m" N; V8 B
  14. if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
    # |4 d1 x/ i2 p
  15. {
    5 c$ u) O8 b1 L, c
  16. BEEP_TOGGLE;0 u- x* `1 r& E0 j& ?; F: [- N- l
  17. LED1_ON;
    / @" R+ A6 j; v
  18. LED2_ON;
    & M' o1 `1 O( g% o: j
  19. LED3_ON;
    3 u6 G9 y5 w+ i
  20. }
    . _7 i1 V8 R4 Z; T$ w3 h
  21. __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
    . B) M% E1 @9 T2 _$ ?
  22. }
    " T7 R' f5 s4 p" Y5 E, d
  23. elseif(GPIO_Pin==KEY2_GPIO_PIN)9 B5 m9 p1 d/ X# d
  24. {
    3 e8 a% J  o* H# f& z
  25. HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    0 `# b& o2 ~0 u9 d5 p8 i
  26. if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
    2 C! n; m1 [: g& r
  27. {, y4 _! a, j0 V5 ?* s
  28. BEEP_TOGGLE;
    : j8 R) t0 q; {  V3 O
  29. LED1_OFF;/ L, Y# R' _  A0 ?
  30. LED2_OFF;# ?4 Y: m- ~; Y: w1 O
  31. LED3_OFF;" o+ H% k7 Q' B' k) [0 A! b* |( c
  32. }7 U9 w9 e, s, \+ I5 X
  33. __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);1 S0 {# D; w; T3 D% L% J
  34. }! ^* A& D3 z, V- q, Z
  35. }
复制代码

/ P  x' }  l2 O

8 w# T: d$ }& n2 u0 a

评分

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

查看全部评分

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

举报

3个回答
飞跃-344154 回答时间:2020-3-10 21:22:25
9 Y5 |. |* @& j8 P& v3 ^
写的不错,互支持一下。已点。
! M; J& j7 K" h5 C
5 _+ Y$ s# i$ _' r6 [9 M0 \【STM32CubeMX】工欲善其事必先利其器之最强四大技巧* I, ~- Y$ _( v
https://www.stmcu.org.cn/module/forum/thread-623621-1-1.html
网络孤客 回答时间:2020-3-11 09:08:22
如何设置多个工程用同一个位置的库?
9 i1 j9 K  T3 }2 t每个工程都拷一堆库,太浪费空间了,想把库统一放在工程外同一个位置。
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 手机版