#ifndef _ADDA_H
#define _ADDA_H
#include"sys.h"
#define LED0 PAout(8)
#define LED1 PDout(2)
#define KEY0 PAin(13)
void Adda_Init(void);
#endif
#include<stm32f10x_lib.h>
#include"adda.h"
void Adda_Init(void)
{
RCC->APB2ENR|=1<<2; //A口时钟使能
RCC->APB2ENR|=1<<5; //D口时钟使能
RCC->AHBENR|=1<<0; //DMA1时钟使能
RCC->APB2ENR|=1<<9; //ADC1时钟使能
GPIOA->CRL&=0XFFFFF000;
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;
GPIOA->CRH&=0XFF0FFFF0;
GPIOA->CRH|=0X00800003;
GPIOA->ODR|=1<<8;
GPIOD->ODR|=1<<2;
GPIOA->ODR|=1<<13;//IO设置
RCC->APB2RSTR|=1<<9;
RCC->APB2RSTR&=~(1<<9);
RCC->CFGR&=~(3<<14);
RCC->CFGR|=2<<14;
ADC1->SMPR2&=0XFFFFF000;
ADC1->SMPR2|=0X000001FF;
ADC1->SQR1&=0X00000000;
ADC1->SQR1|=0X00000000;
ADC1->SQR3&=0X00000000;
ADC1->SQR3|=0X00000000;
ADC1->CR1&=0X00000000;
ADC1->CR1|=0X00000020;
ADC1->CR2&=0X00000000;
ADC1->CR2|=0X001E0001;
ADC1->CR2|=1<<3;
while(ADC1->CR2&1<<3);
ADC1->CR2|=1<<2;
while(ADC1->CR2&1<<2);
MY_NVIC_Init(3,3,ADC1_2_IRQChannel,2);
}
void ADC_IRQHanlder(void)
{
if(ADC1->SR&1<<1)
{
LED0=!LED0;
ADC1->SR&=0X2;
}
}
#include<stm32f10x_lib.h>
#include"sys.h"
#include"delay.h"
#include"adda.h"
int main(void)
{
static u8 key_state=1;
Stm32_Clock_Init(9);
delay_init(72);
Adda_Init();
while(1)
{
if(KEY0==0&&key_state)
{
delay_ms(10);
key_state=0;
ADC1->CR2|=1<<22;
LED1=!LED1;
}
if(KEY0==1)
key_state=1;
}
}
程序的目的是ADC1通道0单次采集,按一次按键采集一次,采集完产生EOC中断,在中断中LED0翻转,while中LED1翻转。现在问题是如果不使用MY_NVIC_Init进行中断分组,LED1可以根据按键翻转,LED0无现象,但是进行MY_NVIC_Init中断分组后,LED0没有任何现象,也就是没有进入中断吧,程序哪里有问题吗?
|