1. 主函数 #include \#include \ #include \ #include \ #include \ #include \int main(void) { u8 t; u32 v=100;
Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化与按键连接的硬件接口 RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0X0FFFFFFF; GPIOA->CRL|=0X30000000;//PA7推挽输出 GPIOA->ODR|=1<<7; //PA7 输出高 GPIOA->CRL&=0XFF0FFFFF; GPIOA->CRL|=0X00300000;//PA5推挽输出 GPIOA->ODR|=1<<5; //PA5 输出高 LED1=1; LED0=1; while(1) { t=KEY_Scan(0); //得到键值 switch(t) { case KEY0_PRES: v=v+10;
TIM3_Int_Init(v,7199);//10Khz的计数频率 TIM3->CR1|=0x01; break; case KEY1_PRES: v=v-10 ; TIM3_Int_Init(v,7199);//10Khz的计数频率 TIM3->CR1|=0x01; //使能定时器3 break;
case WKUP_PRES: TIM3->CR1&=0xFE;//关定时器3; break; }
} }
2. LED初始化 #include \ #include \void LED_Init(void) {
RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出 GPIOA->ODR|=1<<8; //PA8 输出高 GPIOD->CRL&=0XFFFFF0FF; }
GPIOD->CRL|=0X00000300;//PD.2推挽输出 GPIOD->ODR|=0x0004; //PD.2输出高
3. 按键初始化 #include \#include \void KEY_Init(void) {
RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<4; //使能PORTC时钟 JTAG_Set(SWD_ENABLE); //关闭JTAG,开启SWD GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入 GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF; //PA15设置成输入 GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15; //PA15上拉,PA0默认下拉 GPIOC->CRL&=0XFF0FFFFF; //PC5设置成输入 GPIOC->CRL|=0X00800000;
GPIOC->ODR|=1<<5; //PC5上拉 }
u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动
key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0) key_up=1;
return 0;// 无按键按下 }
4. 定时器初始化 #include \#include %u32 i=0;
//定时器3中断服务程序 void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { //GPIOA->ODR^=0x0100; GPIOA->ODR^=0x0080; LED0=!LED0; }
TIM3->SR&=~(1<<0);//清除中断标志位 }
void TIM3_Int_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<1; //TIM3时钟使能 TIM3->ARR=arr; //设定计数器自动重装值 TIM3->PSC=psc; //预分频器设置 TIM3->DIER|=1<<0; //允许更新中断 //TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(3,3,TIM3_IRQn,2);//抢占3,子优先级3,组2 }