🌞我打算边学边记录一下关于自己遇到的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模块
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);

整体配置的图

image-20250319094104401

效果:

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){
//开启AFIO 选择端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//选择EXTI line 1 4
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模块
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);
//初始化IO引脚 PA9 TX 复用推挽输出 PA10 RX 上拉输入
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模块
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);
}