目录
1.新建工程
参考第一篇博客:stm32 小白建工程
2.仿真现象
令j=0;
按键按下触发中断,转入中断服务程序,j+1;
灯亮一个,再按下按键,灯亮加一,以此类推
GPIO基本操作:
以GPIOC低八位为例:
第i位置0:GPIOC->BRR=(1<<i)
第i位置1:GPIOC->BSRR=(1<<i)
GPIOx->BRR:端口位清除寄存器
高16位保留
低16位:0:对对应的ODRy位不产生影响
1:清除对应的ODRy位
功能:将某些位置0
GPIOx->BSRR:端口位设置/清除寄存器
此处只用到低16位:0:对对应的ODRy位不产生影响
1:将对应的ODRy位置1
高16位功能同GPIOx->BRR
3.代码部分
(1)先上主函数源码
main.c
#include "stm32f10x.h"
u8 i,j=0;
void delay_ms(uint32_t ms)
{
uint32_t i_cnt,j_cnt;
for(i_cnt=0;i_cnt<3000;i_cnt++);
for(j_cnt=0;j_cnt<ms;j_cnt++);
}
int main(){
//GPIOA2配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//中断配置
//打开AFIO复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//关联中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
//配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//配置NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIOC->BSRR=0xff;
while(1)
{
for(i=0;i<j;i++)
{
GPIOC->BRR=(1<<i);
}
}
}
void EXTI2_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
{
j++;
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
(2)文件引用
//stm32 必需头文件
#include "stm32f10x.h"
(3)延时函数
void delay_ms(uint32_t ms)
{
uint32_t i_cnt,j_cnt;
for(i_cnt=0;i_cnt<3000;i_cnt++);
for(j_cnt=0;j_cnt<ms;j_cnt++);
}
(4)中断配置
-
配置中断线GPIOA2
//GPIOA2配置
/*打开GPIOA,GPIOC的时钟,GPIOA,GPIOC挂载在APB2上*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
/*定义GPIO_InitStruture*/
GPIO_InitTypeDef GPIO_InitStructure;
/*使用PA2*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
/*GPIO_Speed设为50MHz*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*工作模式设为上拉输入*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
/*初始化GPIO*/
GPIO_Init(GPIOA,&GPIO_InitStructure);
//连接PC0~7八个LED
/*使用GPIOC0-7*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
/*工作模式设为推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*初始化GPIO*/
GPIO_Init(GPIOC,&GPIO_InitStructure);
-
配置EXTI
//中断配置
//打开AFIO复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//关联中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
//配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
-
配置NVIC
//配置NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
-
配置中断服务程序
void EXTI2_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
{
j++;
EXTI_ClearITPendingBit(EXTI_Line2);
}
}