🌞
我打算边学边记录一下关于自己遇到的bug,后面这个文档也会不断更新
主要就是跟着网上的教程进行复现,然后找bug
代码不能运行,首先检查初始化!所以建议每次写完初始化的代码,都直接在main里面直接去调用。
一般而言,其实80%的问题都是自己的代码配置的问题,先怀疑一下自己的代码,然后在怀疑硬件本身的问题吧~
EXTI中断
这次 我以为会比较快,但是还是有bug
一开始是初始化没有
然后是中断回调函数写错,因为配置的是EXTI_Line0和EXTI_Line1
两个都差不多,但是最后复制过来复制过去 最终回调函数都给复制过去了
找了很久
还有就是配置NVIC的时候不能用 |
一起配置,要分开配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct);
|
整体配置的图

效果:
exti
最终核心代码如下
exti和nvic配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| void My_EXTI_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1|GPIO_PinSource4); EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line=EXTI_Line1; EXTI_InitStruct.EXTI_LineCmd=ENABLE; EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line=EXTI_Line4; EXTI_InitStruct.EXTI_LineCmd=ENABLE; EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStruct); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct);
}
|
中断回调函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
void EXTI1_IRQHandler(void){ if(EXTI_GetFlagStatus(EXTI_Line1)==SET){ EXTI_ClearFlag(EXTI_Line1); GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); } }
void EXTI4_IRQHandler(void){ if(EXTI_GetFlagStatus(EXTI_Line4)==SET){ EXTI_ClearFlag(EXTI_Line4); GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); } }
|
SPI通信代码
见上一篇笔记找的bug
中断+串口中断
对应铁头山羊中断那一章节。
这个应该是很简单的,配置一下中断
串口什么的,但是我居然出不来,过了一上午才知道,原来是中断函数那边出了问题
功能是通过串口输入的数字,来改变板子上灯的闪动的频率。
就是这个 void USART1_IRQHandler(void)! 来,看一下什么问题
1 2 3 4 5 6 7 8 9
| void USART1_IRQHandler(void){ uint8_t byte=USART_ReceiveData(USART1); if((USART_GetITStatus(USART1,USART_IT_RXNE))==SET){ if(byte=='0') time=1000; if(byte=='1') time=200; if(byte=='2') time=50; } }
|
更改版本是这样的
1 2 3 4 5 6 7 8 9 10
| void USART1_IRQHandler(void){ uint8_t byte; if((USART_GetITStatus(USART1,USART_IT_RXNE))==SET){ byte=USART_ReceiveData(USART1); if(byte=='0') time=1000; if(byte=='1') time=200; if(byte=='2') time=50; } }
|
也就是说,这个USART_ReceiveData(USART1);需要实时更新不然,还是不行,接受不了数据,就无法进行判别。
所以下次一定记得!!
配上void Usart_Init(void)配置的过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| void Usart_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); GPIO_InitTypeDef gpio_init_struct; gpio_init_struct.GPIO_Mode=GPIO_Mode_AF_PP; gpio_init_struct.GPIO_Pin=GPIO_Pin_9; gpio_init_struct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA,&gpio_init_struct); gpio_init_struct.GPIO_Mode=GPIO_Mode_IPU; gpio_init_struct.GPIO_Pin=GPIO_Pin_10; GPIO_Init(GPIOA,&gpio_init_struct);
USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate=115200; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_StopBits=USART_StopBits_1; USART_InitStruct.USART_WordLength=USART_WordLength_8b; USART_Init(USART1,&USART_InitStruct); USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); }
|