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

STM32外部中断使用注意事项

[复制链接]
lastimy 发布时间:2017-9-30 10:46
stm32尽管所有的gpio都可以设置为外部中断的功能,但是不能把所有的gpio同时设置为外部中断。例如不能把PA0和PB0同时设置为外部中断,因为PA0和PB0共用一个中断线,MCU只把最后完成初始化的管脚设置为外部中断。

如果代码编写者明确知道PA0和PB0不会同时触发,并且触发有相互依赖关系,可以通过分时设置PA0和PB0的外部中断功能。但是在大多数情况下,外部中断的触发都是随机的,那么在设计原理图的时候就要考虑到这种情况,把用到的外部中断管脚设置到后缀不同的管脚上,如PA0,PA1,PB3,PC8,....PD12,PF16,在一个工程中最多能使用16个外部中断,并且每个管脚的后缀不同。


如果设计电路板没有考虑到这种情况,则需要根据实际情况把触发频繁的设置为外部中断,不频繁的通过检测管脚电平变化来判断是否有触发。


检测管脚电平变化的一种方法:
设计一个周期1ms的定时器,在定时器中断服务函数中通过判断管脚电平,来捕获上升沿和下降沿。




  1. <span style="background-color: white;">//捕获下降沿
  2. void timer_isr(void)//定时器1ms的中断服务子函数
  3. {
  4. if(READ_PIN)
  5. {
  6.   state = waitting_falling_edge;
  7. }
  8. else
  9. {
  10. if(state == waitting_falling_edge)
  11. {
  12. falling_trigger = 1;//捕获下降沿
  13. state = falling_edge_detected;
  14. }
  15. }
  16. }
  17. //捕获上升沿
  18. void timer_isr(void)//定时器1ms的中断服务子函数
  19. {
  20. if(!READ_PIN)
  21. {
  22.   state = waitting_rising_edge;
  23. }
  24. else
  25. {
  26. if(state == waitting_rising_edge)
  27. {
  28. rising_trigger = 1;//捕获上升沿
  29. state = rising_edge_detected;
  30. }
  31. }
  32. }

  33. 类比FPGA的捕获上升沿、下降沿代码(verilog语言)
  34. //捕捉上升沿
  35. module capture_rising(iclock, ireset, isignal, orising);
  36. input iclock;
  37. input ireset;
  38. input isignal;
  39. output orising;
  40. reg isignal_temp0;
  41. reg isignal_temp1;
  42. always @(posedge iclock or negedge ireset)
  43. begin
  44. if(!ireset)
  45. begin
  46. isignal_temp0 <= 1'b0;
  47. isignal_temp1 <= 1'b0;
  48. end
  49. else
  50. begin
  51. isignal_temp0 <= isignal;
  52. isignal_temp1 <= isignal_temp0;
  53. end
  54. end

  55. assign orising = ~isignal_temp1 & isignal_temp0;
  56. endmodule

  57. //捕捉下降沿
  58. module capture_falling(iclock, ireset, isignal, ofalling);
  59. input iclock;
  60. input ireset;
  61. input isignal;
  62. output ofalling;
  63. reg isignal_temp0;
  64. reg isignal_temp1;
  65. always @(posedge iclock or negedge ireset)
  66. begin
  67. if(!ireset)
  68. begin
  69. isignal_temp0 <= 1'b0;
  70. isignal_temp1 <= 1'b0;
  71. end
  72. else
  73. begin
  74. isignal_temp0 <= isignal;
  75. isignal_temp1 <= isignal_temp0;
  76. end
  77. end

  78. assign ofalling = isignal_temp1 & ~isignal_temp0;
  79. endmodule</span>
复制代码


虽然代码不同,但是思路是一样的:寄存上一周期的状态,并与当前状态相结合进行判断。
stm32的1ms定时器(即每1ms执行一次定时器中断服务子函数)相当于fpga的1个时钟100ns(iclock-10mhz),检测速度相差1万倍。


收藏 评论1 发布时间:2017-9-30 10:46

举报

1个回答
andeyqi 回答时间:2017-9-30 18:01:30
节前看的最后一个帖子   看完下班

所属标签

STM32团队

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


最新内容

相似分享

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