STM32简单例程调试

一、按键例程
key.c文件代码如下
按键初始化相当于GPIO口的配置。步骤:时钟设置,输入输出设置,IO口属性设置

#include <stm32f10x_lib.h>
#include "key.h"
#include "delay.h"
//V1.1修改说明
//修改按键扫描函数,使整个代码可以支持SWD下载。
/////////////////////////////////////////////////////////////////按键初始化
void KEY_Init(void)
{
    RCC->APB2ENR|=1<<2;     //使能PORTA时钟
    RCC->APB2ENR|=1<<4;     //使能PORTC时钟
    GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入 
    GPIOA->CRL|=0X00000008;   
    GPIOC->CRH&=0XFFFF0000;//PC8,9,10,11设置成输入 
    GPIOC->CRH|=0X00008888;                
    GPIOC->ODR|=1<<8;      //PC8上拉,PA0默认下拉
    GPIOC->ODR|=1<<9;      //PC9上拉
    GPIOC->ODR|=1<<10;     //PC10上拉
    GPIOC->ODR|=1<<11;     //PC11上拉
} 
//按键处理函数
//返回按键值
u8 KEY_Scan(void)
{    
    static u8 key_up=1;//按键按松开标志 
// JTAG_Set(JTAG_SWD_DISABLE);
    if(key_up&&(WK_UP==1||KEY0==0||KEY1==0||KEY2==0||KEY3==0))
    {
        delay_ms(10);//去抖动 
        key_up=0;
        if(KEY0==0)
        {
            return 1;
        }
        else if(KEY1==0)
        {
            return 2;
        }
        else if(KEY2==0)
        {
            return 3;
        }
        else if(KEY3==0)
        {
            return 4;
        }
        else if(WK_UP==1)
        {
            return 5;
        }
    }else if(WK_UP==0&&KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)key_up=1;         
    return 0;// 无按键按下
}

二、外部中断实验
EXTI.c 文件代码
外部终端0–4都有自己单独的中断函数,但是之后就分为两个公用中断函数5~9,10~15.
函数内部最后要就行清楚中断标志位,每个管脚对应一个EXTI->PR的一位。
//外部中断0服务程序

void EXTI0_IRQHandler(void)
{
    delay_ms(10);//消抖
    if(WK_UP==1)     //按键2
    {
        LED0=!LED0;
        LED1=!LED1; 
    }        
    EXTI->PR=1<<0;  //清除LINE0上的中断标志位 
}

//外部中断5--9服务程序
void EXTI9_5_IRQHandler(void)
{           
    delay_ms(10);    //消抖 
    if(KEY0==0)      //按键0
    {
        LED0=!LED0;
    }else if(KEY1==0)//按键1
    {
        LED1=!LED1;
    }
    EXTI->PR=1<<8;     //清除LINE13上的中断标志位 
    EXTI->PR=1<<9;     //清除LINE15上的中断标志位 
}
//外部中断初始化程序
//初始化PA0,PA13,PA15为中断输入.
void EXTIX_Init(void)
{
    KEY_Init();
    Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
    Ex_NVIC_Config(GPIO_C,8,FTIR);//下降沿触发
    Ex_NVIC_Config(GPIO_C,9,FTIR);//下降沿触发

    MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2
    MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2);//抢占2,子优先级1,组2 
}

三、定时器
timer.c代码如下

#include "timer.h"
#include "led.h"

//定时器3中断服务程序 
void TIM3_IRQHandler(void)
{                                   
    if(TIM3->SR&0X0001)//溢出中断
    {
        LED1=!LED1;                                                             
    }                  
    TIM3->SR&=~(1<<0);//清除中断标志位 
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<1;//TIM3时钟使能 
    TIM3->ARR=arr;  //设定计数器自动重装值//刚好1ms 
    TIM3->PSC=psc;  //预分频器7200,得到10Khz的计数时钟
    //这两个东东要同时设置才可以使用中断
    TIM3->DIER|=1<<0;   //允许更新中断 
    TIM3->DIER|=1<<6;   //允许触发中断 
    TIM3->CR1|=0x01;    //使能定时器3
    MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2 
}


         

你可能感兴趣的:(STM32简单例程调试)