步骤
RCC、NVIC、GPIO、USART、EXIT配置GPIOA.0 为按键
GPIO用作EXTI外部中断时,需要打开AFIO
#ifdef VECT_TAB_RAM
nvic _ setvectortable (nvic _ vect tab _ ram,0x0000000;
#else
nvic _ setvectortable (nvic _ vect tab _ flash,0x0);
代码#endif的原因
首先,因为代码可以在RAM中执行,所以中断向量也在RAM中。 此时,需要这个功能。 例如,通过将程序下载到RAM而不是FALSH,可以避免每次重新编译程序和调试时FLASH“磨损”。
第二,根据APP应用程序的不同,可能需要一个中断向量表,可以在运行时修改。 这种情况下也需要这个功能
GPIOX.0 EXTI0
EXTI0—EXTI1—EXTI2—EXTI1—EXTI0
int main () )
{
RCC_Config (;
NVIC_Configuration (;
GPIO_Configuration (;
USART_Configuration (;
EXTI_Configuration (;
wile(1;
}
voidRCC_config(void ) )。
{
省略
}
RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ gpioa|RCC _ AP B2 per iph _ usar t1|RCC _ AP B2 per iph _ afio,ENABLE ) )
(;
语音用户配置(语音)。
{
usart _ inittypedefusart _ init structure;
usart _ init structure.usart _ baudrate=115200;
usart _ init structure.usart _ word length=usart _ word length _ 8b;
usart _ init structure.usart _ stop bits=usart _ stop bits _ 1;
usart _ init structure.usart _ parity=usart _ parity _ no;
usart _ init structure.usart _ hardware流控制=usart _ hardware流控制_ none;
usart _ init structure.usart _ mode=usart _ mode _ rx|usart _ mode _ tx;
usart_init(usart1,USART_InitStructure );
usart_cmd(usart1,ENABLE );
}
voidNVIC_configuration(void ) )。
{
nvic _ inittypedefnvic _ init structure;
#ifdef VECT_TAB_RAM
nvic _ setvectortable (nvic _ vect tab _ ram,0x0);
#else
nvic _ setvectortable (nvic _ vect tab _ flash,0x0);
#endif
nvic _优先级组配置(nvic _优先级组_ 2;
nvic _ init structure.nvic _ IRQ channel=exti0_ irqn;
nvic _ init structure.nvic _ irqchannelpreemptionpriority=2;
nvic _ init structure.nvic _ irqchannelsubpriority=0;
nvic _ init structure.nvic _ irqchannelcmd=enable;
nvic _ init (nvic _ init结构;
nvic _ init structure.nvic _ IRQ channel=exti1_ irqn;
nvic _ init structure.nvic _ irqchannelpreemptionpriority=1;
nvic _ init structure.nvic _ irqchannelsubpriority=0;
nvic _ init structure.nvic _ irqchannelcmd=enable;
nvic _ init (nvic _ init结构;
nvic _ init structure.nvic _ IRQ channel=exti2_ irqn;
nvic _ init structure.nvic _ irqchannelpreemptionpriority=0;
nvic _ init structure.nvic _ irqchannelsubpriority=0;
nvic _ init structure.nvic _ irqchannelcmd=enable;
nvic _ init (nvic _ init结构;
}
void GPIO_Configuration(void )
{
gpio _ inittypedefgpio _ init structure;
gpio _ init structure.gpio _ pin=gpio _ pin _0| gpio _ pin _1| gpio _ pin _ 2;
gpio _ init structure.gpio _ mode=gpio _ mode _ in _ floating;
gpio_init(gpioa,GPIO_InitStructure );
gpio _ extilineconfig (gpio _ portsourcegpioa,GPIO_PinSource0);
gpio _ extilineconfig (gpio _ portsourcegpioa,GPIO_PinSource1);
gpio _ extilineconfig (gpio _ portsourcegpioa,GPIO_PinSource2);
gpio _ init structure.gpio _ pin=gpio _ pin _ 9;
gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz;
gpio _ init structure.gpio _ mode=gpio _ mode _ af _ PP;
gpio_init(gpioa,GPIO_InitStructure );
gpio _ init structure.gpio _ mode=gpio _ mode _ in _ floating;
gpio _ init structure.gpio _ pin=gpio _ pin _ 10;
gpio_init(gpioa,GPIO_InitStructure );
}
voidexti_configuration(void ) )。
{
exti _ inittypedefexti _ init structure;
exti _ init structure.exti _ line=exti _ line0| exti _ line1| exti _ line 2;
exti _ init structure.exti _ mode=exti _ mode _ interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发和按钮按下
exti _ init structure.exti _ line cmd=enable;
exti _ init (exti _ init结构;
}
输入输出(输入,文件* f ) )。
{
usart_senddata(usarT1,) u8 ) ch );
while (usart _ getflagstatus (usar t1,USART_FLAG_TC )==RESET );
返回通道;
}
voide xti0_ IRQ处理程序(void ) )。
{
printf((r(n1.) r ) n );
exti _ generateswinterrupt (exti _ line 1;
printf((r(n6 ) r ) n ) );
EXTI_clearflag(EXTI_line0;
}
voide xti1_ IRQ处理程序(void ) )。
{
printf((r ) N2.(r ) n );
exti _ generateswinterrupt (exti _ line 2;
printf((r(n5 ) r ) n ) );
EXTI_clearflag(EXTI_line1;
}
voide xti2_ IRQ处理程序(void ) )。
{
printf((r(n3.) r ) n );
printf((r(n4 ) r ) n ) );
EXTI_clearflag(EXTI_line2;
}
实验现象