STM32简单例程调试

来源:互联网 发布:nesstool是什么软件 编辑:程序博客网 时间:2024/06/14 01:06

一、按键例程
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                                   }
0 0
原创粉丝点击