发现中断处理的代码漏了,补上 Nucleo板子虚拟串口的使用: 板子的ST-LINK提供了虚拟串口功能,只要安装好驱动就能直接当串口使用,驱动去官网或者社区找。 nucleo用户手册(附件)会教你怎么使用,它是用焊接板子上的桥接(SBx)的方法,这里我直接用跳线,这样反而更加方便灵活,可以连接到任何你想连接的引脚。板子使用的USART2,PA2,PA3引脚,连接如图所示: 经网友提醒更正下:这块板子的PA2和PA3引脚其实已经是连接好了的,所以不需要图中的两根线,如果要用其他的引脚(PB3,4)才需要连线 (没错,就是反过来的,在使用跳线的时候也可以用其他引脚如PB3,PB4,甚至其他串口USART1,3,4,5都可以) 运行效果图: 3.本来想把按键处理的程序也一起发了,不过因为某些原因,时间紧迫,调试的时候出了点问题还没解决,这里就不写了, 有需要的可以参考:按键扫描/中断模式 4.工程模板: 自己建的一个可以在SRAM中调试的工程模板,上面的三个例子的程序也都在里面了(按键部分注释掉了),如果懒得自己配置工程的可以拿去用一下,我使用的是MDK5.10,基于标准外设库,不是HAL库。工程自带了外设库,不是使用编译器里面的库,下载直接编译即可运行。 5.常用文档:包括STM32F303RE数据手册+参考手册+库函数书名手册+NucleoF303RE用户手册+原理图 学习开发中遇到的大多数问题都能在这几份文档中找到答案,当然这些在社区和官网都有,不过比较分散,既然我整理好了,顺便发上来一下。 /*------------------------------------------------我是分割线------------------------------------------------------------------*/ 6.更新一下按键的程序(6月4日) 前面提到按键中断的程序有点问题,后来忘了这事一直没去解决,今天想起来了,把程序改好了并测试通过 程序运行效果:蓝色按键按下,LED2亮,同时向串口发送“按键按下”,按键松开,LED2灭,同时向串口发送“按键松开”,效果如图: QQ截图20150604211656.png (1.82 KB, 下载次数: 0)
下载附件
2015-6-4 21:14 上传
代码: void key_interruptmode(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(KEY_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel =EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_InitStructure.EXTI_Line=EXTI_Line13;
EXTI_InitStructure.EXTI_LineCmd =ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13))
{
if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,KEY_GPIO_PIN)==RESET) //按键按下
{
GPIO_SetBits(LED_GPIO_PORT, LED2_PIN);
printf("按键按下...\n");
}
else //按键松开
{
GPIO_ResetBits(LED_GPIO_PORT, LED2_PIN);
printf("按键松开...\n");
}
}
EXTI_ClearITPendingBit(EXTI_Line13);
}
|