TA的每日心情 | 奋斗 2016-7-25 19:32 |
---|
签到天数: 17 天 连续签到: 1 天 [LV.4]偶尔看看III
|
这个板子很小真可谓是口袋板,经过一番装驱动和一些资料的学习,加上以前玩过STM32的板子,感觉这个板子简直就是STM32的双胞胎兄弟嘛,基本上一样,以前玩过STM32的很容易就上手这块板子。好了废话不多说,下面就说说我这次的小测试吧!这次的测试是用中断检测按键控制LED的点亮和熄灭,也是基于库函数开发的。
首先得新建一个工程,工程的建立方法很多人已经分享,这个我就不多说了,我就大概说下我的工程结构吧
上面的DOC是说明文档,DRIVER是自己编写的相应的外设驱动程序,Lib是官方提供的库文件,MDK是保存项目工程,STARTUP是启动的相关文件,USER是用户编写的应用程序。
要想用中断控制就要配置按键的引脚为外部事件触发中断模式,同时配置相应的GPIO为输入模式以及中断优先级的配置。代码如下:
void Key_Interrupt_Configuration(void){ GPIO_InitPara GPIO_InitStructure; EXTI_InitPara EXTI_InitStructure; NVIC_InitPara NVIC_InitStructure; RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF ,ENABLE); /* Configure PD14\15 pin */ GPIO_InitStructure.GPIO_Pin = GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Connect EXTI Line14 to PD14 pin */ GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD, GPIO_PINSOURCE15); /* Connect EXTI Line15 to PD15 pin */ GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD, GPIO_PINSOURCE14); /* Configure EXTI Line0 and its interrupt to the lowest priority*/ EXTI_InitStructure.EXTI_LINE = EXTI_LINE14|EXTI_LINE15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LINEEnable = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQ = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQPreemptPriority = 0; NVIC_InitStructure.NVIC_IRQSubPriority = 1; NVIC_InitStructure.NVIC_IRQEnable = ENABLE; NVIC_Init(&NVIC_InitStructure);} 这些库函数和ST的库函数基本上是一致的,很容易理解。
接下来是配置LED的GPIO为推挽输出模式,代码如下:
void GPIO_Configuration(void){ GPIO_InitPara GPIO_InitStructure; RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12| GPIO_PIN_13; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP; GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; GPIO_Init(GPIOD,&GPIO_InitStructure);}这些配置完成后就可以写中断服务子程序了,方法就是检测中断标志位,如果检测到标志位被置位则执行相应的操作,之后就清中断,很简单代码如下:<pre class="syntax">void EXTI15_10_IRQHandler(void){ int count = 0xffff; if (EXTI_GetIntBitState(EXTI_LINE14) != RESET) { while(count--); if (EXTI_GetIntBitState(EXTI_LINE14) != RESET) { LED1(1); LED3(0); EXTI_ClearIntBitState(EXTI_LINE14); } } if (EXTI_GetIntBitState(EXTI_LINE15) != RESET) { while(count--); if (EXTI_GetIntBitState(EXTI_LINE15) != RESET) { LED3(1); LED1(0); EXTI_ClearIntBitState(EXTI_LINE15); } }} |
|