5194|9

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

[求助]关于部分按键不启用AFIO就能进入中断,请高人释疑 [复制链接]

本帖最后由 gogc 于 2009-12-15 15:48 编辑

程序介绍:使用红牛USER1:PA8,USER2:D3按键产生中断,通过不同中断打开,关闭LED。
问题说明:
1、如果不启用RCC_APB2Periph_AFIO,USER2:D3键中断正常,USER2:PD3不正常
2、如果启用RCC_APB2Periph_AFIO,USER2:D3,USER1:PA8都正常。 疑问:为什么需要启用RCC_APB2Periph_AFIO才可以正常中断,按照电路图和芯片手册,并不需要打开PD3的复用功能。
问了其他人,也不知道为什么,只知道要打开AFIO,谁能告诉我为什么,谢谢。
此帖出自stm32/stm8论坛

最新回复

                                 很受益  详情 回复 发表于 2009-12-15 21:56
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的代码:

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f10x_lib.h"
  3. #include  <stdio.h>

  4. /* Private function prototypes -----------------------------------------------*/
  5. void RCC_Configuration(void);
  6. void GPIO_Configuration(void);
  7. void NVIC_Configuration(void);
  8. void EXIT_Configuration(void);
  9. void USART_Configuration(void);
  10. void Delay(vu32 nCount);
  11. ErrorStatus HSEStartUpStatus;
  12. /* Private functions ---------------------------------------------------------*/
  13. /*******************************************************************************
  14. * Function Name  : main
  15. * Description    : Main program.
  16. * Input          : None
  17. * Output         : None
  18. * Return         : None
  19. *******************************************************************************/
  20. int main(void)
  21. {
  22. #ifdef DEBUG
  23.   debug();
  24. #endif
  25.   /* System Clocks Configuration */
  26.   RCC_Configuration();
  27.   /* Configure the GPIO ports */
  28.   GPIO_Configuration();
  29.   USART_Configuration();
  30.   /* NVIC configuration */
  31.   NVIC_Configuration();
  32.   /* NVIC configuration */
  33.   EXIT_Configuration();
  34.   printf(" System boot success!\r\n");

  35.   while (1)
  36.   {
  37.   }
  38. }
  39. /*******************************************************************************
  40. * Function Name  : RCC_Configuration
  41. * Description    : Configures the different system clocks.
  42. * Input          : None
  43. * Output         : None
  44. * Return         : None
  45. *******************************************************************************/
  46. void RCC_Configuration(void)
  47. {
  48.   /* RCC system reset(for debug purpose) */
  49.   RCC_DeInit();
  50.   /* Enable HSE */
  51.   RCC_HSEConfig(RCC_HSE_ON);
  52.   /* Wait till HSE is ready */
  53.   HSEStartUpStatus = RCC_WaitForHSEStartUp();
  54.   if(HSEStartUpStatus == SUCCESS)
  55.   {
  56.     /* HCLK = SYSCLK */
  57.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  58.     /* PCLK2 = HCLK */
  59.     RCC_PCLK2Config(RCC_HCLK_Div1);
  60.     /* PCLK1 = HCLK/2 */
  61.     RCC_PCLK1Config(RCC_HCLK_Div2);
  62.     /* Flash 2 wait state */
  63.     FLASH_SetLatency(FLASH_Latency_2);
  64.     /* Enable Prefetch Buffer */
  65.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  66.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  67.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  68.     /* Enable PLL */
  69.     RCC_PLLCmd(ENABLE);
  70.     /* Wait till PLL is ready */
  71.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  72.     {
  73.     }
  74.     /* Select PLL as system clock source */
  75.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  76.     /* Wait till PLL is used as system clock source */
  77.     while(RCC_GetSYSCLKSource() != 0x08)
  78.     {
  79.     }
  80.   }
  81.   /* Enable GPIOA, GPIOC,USART1 and AFIO clock */
  82.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA
  83.       | RCC_APB2Periph_GPIOB
  84.       | RCC_APB2Periph_GPIOC
  85.       | RCC_APB2Periph_GPIOD
  86.       | RCC_APB2Periph_GPIOE
  87.       | RCC_APB2Periph_GPIOF
  88.       | RCC_APB2Periph_GPIOG, ENABLE);
  89.       //| RCC_APB2Periph_AFIO
  90. }
  91. /*******************************************************************************
  92. * Function Name  : GPIO_Configuration
  93. * Description    : Configures the different GPIO ports.
  94. * Input          : None
  95. * Output         : None
  96. * Return         : None
  97. *******************************************************************************/
  98. void GPIO_Configuration(void)
  99. {
  100.   GPIO_InitTypeDef GPIO_InitStructure;
  101.   /* ??PF6~10?LED */
  102.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  103.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    /* LED */
  104.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;   /*  50MHz,10M,2M */
  105.   GPIO_Init(GPIOF, &GPIO_InitStructure);

  106.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  107.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  108.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  109.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
  110.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  111.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  112.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  113.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
  114. }
  115. /*******************************************************************************
  116. * Function Name  : NVIC_Configuration
  117. * Description    : Configure the nested vectored interrupt controller.
  118. * Input          : None
  119. * Output         : None
  120. * Return         : None
  121. *******************************************************************************/
  122. void NVIC_Configuration(void)
  123. {
  124.   NVIC_InitTypeDef NVIC_InitStructure;
  125. #ifdef  VECT_TAB_RAM
  126.   /* Set the Vector Table base location at 0x20000000 */
  127.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  128. #else  /* VECT_TAB_FLASH  */
  129.   /* Set the Vector Table base location at 0x08000000 */
  130.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  131. #endif
  132.   /* Configure the Priority Group to 2 bits */
  133.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  134.   /* Enable the EXTI3 Interrupt on PD.3 */
  135.   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
  136.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  137.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  138.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  139.   NVIC_Init(&NVIC_InitStructure);
  140.   /* Enable the EXTI8 Interrupt on PD.8 */
  141.   NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
  142.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  143.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  144.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  145.   NVIC_Init(&NVIC_InitStructure);
  146. }
  147. void EXIT_Configuration(void)
  148. {
  149.   EXTI_InitTypeDef EXTI_InitStructure;
  150.   EXTI_ClearITPendingBit(EXTI_Line3);//ж??
  151.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);//??
  152.   EXTI_ClearITPendingBit(EXTI_Line8);//ж??
  153.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);//??
  154.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//??
  155.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//??
  156.   EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line8;//·?
  157.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ж
  158.   EXTI_Init(&EXTI_InitStructure);//?
  159. }
  160.   /*******************************************************************************
  161. * Function Name  : USART_Configuration
  162. * Description    : Configures the USART1.
  163. * Input          : None
  164. * Output         : None
  165. * Return         : None
  166. *******************************************************************************/
  167. void USART_Configuration(void)
  168. {
  169. USART_InitTypeDef USART_InitStructure;
  170. GPIO_InitTypeDef GPIO_InitStructure;
  171. //USART1
  172. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  173. //USART1_TX
  174. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  175. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  176. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  177. GPIO_Init(GPIOA, &GPIO_InitStructure);
  178. //USART1_RX
  179. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  180. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  181. GPIO_Init(GPIOA, &GPIO_InitStructure);
  182. //USART1?
  183. USART_InitStructure.USART_BaudRate = 115200;
  184. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  185. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  186. USART_InitStructure.USART_Parity = USART_Parity_No;
  187. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  188. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  189. USART_Init(USART1, &USART_InitStructure);
  190. #if USART_RXINT_EN
  191. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  192. #endif
  193. USART_Cmd(USART1, ENABLE);
  194. return;
  195. }
  196. /*******************************************************************************
  197. * Function Name  : fputc
  198. * Description    : Retargets the C library printf function to the USART or ITM Viewer.
  199. * Input          : None
  200. * Output         : None
  201. * Return         : None
  202. *******************************************************************************/
  203. int fputc(int ch, FILE *f)
  204. {
  205. /* Printf? */
  206.   USART_SendData(USART1, (unsigned char) ch);
  207.   while (!(USART1->SR & USART_FLAG_TXE));
  208.   return (ch);
  209. }
  210. #ifdef  DEBUG
  211. /*******************************************************************************
  212. * Function Name  : assert_failed
  213. * Description    : Reports the name of the source file and the source line number
  214. *                  where the assert error has occurred.
  215. * Input          : - file: pointer to the source file name
  216. *                  - line: assert error line source number
  217. * Output         : None
  218. * Return         : None
  219. *******************************************************************************/
  220. void assert_failed(u8* file, u32 line)
  221. {
  222.   /* User can add his own implementation to report the file name and line number,
  223.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  224.   /* Infinite loop */
  225.   while (1)
  226.   {
  227.   }
  228. }
  229. #endif
  230. void Delay(vu32 nCount)
  231. {
  232.   for(; nCount != 0; nCount--);
  233. }
复制代码
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断代码
  1. void EXTI3_IRQHandler(void)
  2. {
  3. if(EXTI_GetITStatus(EXTI_Line3) != RESET)
  4.   {
  5.     /* Clear the EXTI line 4 pending bit */
  6.     EXTI_ClearITPendingBit(EXTI_Line3);
  7.     EXTI_ClearFlag( EXTI_Line3);

  8.    // Led_RW_ON();
  9.     printf("EXTI_Line3 Led_RW_ON!\r\n");

  10.     GPIO_ResetBits(GPIOF, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);


  11.   }
  12. }

  13. void EXTI9_5_IRQHandler(void)
  14. {
  15. if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  16.   {
  17.     /* Clear the EXTI line 8 pending bit */
  18.     EXTI_ClearITPendingBit(EXTI_Line8);
  19.     EXTI_ClearFlag( EXTI_Line8);

  20.     //Led_RW_OFF();
  21.     printf("EXTI_Line8 Led_RW_OFF!\r\n");

  22.     GPIO_SetBits(GPIOF, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

  23.   }
  24. }
复制代码
此帖出自stm32/stm8论坛
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
为什么需要启用RCC_APB2Periph_AFIO才可以正常中断?按照电路图和芯片手册,就知道需要打开PD3的复用功能。在参考手册 v9.0的176-177页: 9.2.5 External interrupt/event line mapping The 112 GPIOs are connected to the 16 external interrupt/event lines in the following manner: 图21中显示使用IO口中断时,需要打开对应的AFIO功能:
exti.JPG
1. To configure the AFIO_EXTICRx for the mapping of external interrupt/event lines onto GPIOs, the AFIO clock should first be enabled. Refer to Section 6.3.7: APB2 peripheral clock enable register (RCC_APB2ENR) for low-, medium- and high-density devices and, to Section 7.3.7: APB2 peripheral clock
enable register (RCC_APB2ENR) for connectivity line devices.
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 


谢谢专家。
这句话其实看到了,只不过没有读懂这句话。

现在反过来问问题:
为什么需要启用RCC_APB2Periph_AFIO才可以正常中断?--问题答案是确定的
问题改成-》
不使用AFIO,为什么PD3不能中断,而PA8却可以呢?PA8没有按照文档说明配置AFIO,难道就产生不可预计的情况了?对于PD3,PA8,他们应该一视同仁才对啊。

感觉文档似乎没有说明,抑或我确实没看明白,相当崩溃。。。

补充:使用的是103ZET6 144脚芯片
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
PA8不用打开AFIO却可以产生中断,这并不能说明这样操作是正确的。
-----------------------
4楼指出的手册中那一段说明说明了需要打开AFIO时钟:To configure the AFIO_EXTICRx for the mapping of external interrupt/event lines onto GPIOs, the AFIO clock should first be enabled.(通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。)
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 

谢谢香水城。



开始可能我的提问方式不对。

不过您这么回答我是比较清楚了,使用GPIO的EXTI就必须开启AFIO时钟。

但是仍然对PA8在没有开启AFIO就能正常使用中断仍留有遗憾。
估计其他端口也有这种情况,只不过我的开发板无法试验罢了。
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 我们不可能对所有不正确操作的结果给出解释,建议你还是应该按照正规的方法操作。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 结帖,谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 很受益
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表