STM32与A5进行SPI通信总结

[复制链接]
1229|4
 楼主| 877049204 发表于 2018-6-25 16:45 | 显示全部楼层 |阅读模式
本帖最后由 877049204 于 2018-6-25 16:56 编辑

今天在调试STM32F407下位机与A5上位机通信协议时总结了一些经验,记录一下。
首先第一个问题:
数据传输由外部100ms的触发信号进行触发,STM32的PD8管脚配置为外部中断,将GPIO配置为外部中断时有以下几个步骤:
1、使能相关时钟:
  1.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//ʹÄÜSYSCFGʱÖÓ
2、配置管脚:
  1.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//WK_UP????PA0
  2.    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//??
  3. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  4.   GPIO_Init(GPIOD, &GPIO_InitStructure);//???GPIOA0
注意不需要将管脚配置为输入模式
3、将中断线与管脚相连,STM32F407有15条中断线,对应GPIO0~15,
  1. #define EXTI_PinSource0            ((uint8_t)0x00)
  2. #define EXTI_PinSource1            ((uint8_t)0x01)
  3. #define EXTI_PinSource2            ((uint8_t)0x02)
  4. #define EXTI_PinSource3            ((uint8_t)0x03)
  5. #define EXTI_PinSource4            ((uint8_t)0x04)
  6. #define EXTI_PinSource5            ((uint8_t)0x05)
  7. #define EXTI_PinSource6            ((uint8_t)0x06)
  8. #define EXTI_PinSource7            ((uint8_t)0x07)
  9. #define EXTI_PinSource8            ((uint8_t)0x08)
  10. #define EXTI_PinSource9            ((uint8_t)0x09)
  11. #define EXTI_PinSource10           ((uint8_t)0x0A)
  12. #define EXTI_PinSource11           ((uint8_t)0x0B)
  13. #define EXTI_PinSource12           ((uint8_t)0x0C)
  14. #define EXTI_PinSource13           ((uint8_t)0x0D)
  15. #define EXTI_PinSource14           ((uint8_t)0x0E)
  16. #define EXTI_PinSource15           ((uint8_t)0x0F)
调用函数:

  1.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource8);//PA0 Á¬½Óµ½ÖжÏÏß0
4、配置中断线参数
  1.   /* ÅäÖÃEXTI_Line0 */
  2.   EXTI_InitStructure.EXTI_Line = EXTI_Line8;//LINE0
  3.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//ÖжÏʼþ
  4.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //ÉÏÉýÑØ´¥·¢
  5.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ʹÄÜLINE0
  6.   EXTI_Init(&EXTI_InitStructure);//ÅäÖÃ
5、中断管理,注意中断通道对应
EXTI9_5_IRQn,而不是EXTI8_IRQn,STM32的GPIO0~4对应中断线0~4,有各自的中断入口,而GPIO5~9

共用一个中断向量EXTI9_5_IRQn,GPIO10~15也共用一个中断向量EXTI15_10_IRQn
  1. <font color="black">        </font>NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//EXTI0_IRQn;//ÍⲿÖжÏ0
  2.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//ÇÀÕ¼ÓÅÏȼ¶0
  3.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//×ÓÓÅÏȼ¶2
  4.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
  5.   NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ
  1.   EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */
  2.   EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
  3.   EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */
  4.   EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */
  5.   EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */
  1.   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                                     */
  1.   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                                   */








评论

@山东电子小菜鸟 :在青岛中国石油大学,前辈呢  发表于 2018-10-8 21:00
楼主在山东哪个地方读研  发表于 2018-10-8 19:45
楼主在山东哪个地方读研  发表于 2018-10-8 19:45
 楼主| 877049204 发表于 2018-6-25 16:57 | 显示全部楼层
本帖最后由 877049204 于 2018-6-25 17:02 编辑

编写中断服务函数void EXTI9_5_IRQHandler(void),在服务函数里进行SPI数据的传输,进行测试。
在这里遇到了一个Bug,现象如下:
测试的时候因为外部触发信号由信号发生器提供,不太方便,就把中断服务函数改写成一般函数,周期性调用。但是我的外部中断还是那样配置,测试的时候外部触发信号没有拿走,触发了中断,而没有中断服务函数。
这个时候发生了有趣的现象,STM32F407跑飞了,停止于汇编代码处

  1. //void EXTI9_5_IRQHandler(void)
  2. void Handle_Handler(void)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

158

主题

1835

帖子

20

粉丝
快速回复 在线客服 返回列表 返回顶部