STM32F103ZET6外部中断不起作用,不知道程序哪里错了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103ZET6外部中断不起作用,不知道程序哪里错了?相关的知识,希望对你有一定的参考价值。

用STM32F103ZET6外部中断 获取外部信息,并输出。但是中断没有反应,哪位大神帮忙看看,谢谢!
中断代码
int a=0;
//外部中断初始化
void EXTI_Init(void)

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOB时钟

GPIO_Initure.Pin=GPIO_PIN_2; //PE2
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOE,&GPIO_Initure);

GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_3; //PB3.4
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);

//中断线2-PB3
HAL_NVIC_SetPriority(EXTI2_IRQn,2,0); //抢占优先级为2,子优先级为0
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //使能中断线0

//中断线3-PB3
HAL_NVIC_SetPriority(EXTI3_IRQn,2,1); //抢占优先级为2,子优先级为1
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能中断线4

//中断线4-PB4
HAL_NVIC_SetPriority(EXTI4_IRQn,2,2); //抢占优先级为2,子优先级为2
HAL_NVIC_EnableIRQ(EXTI4_IRQn); //使能中断线4


//中断服务函数
void EXTI2_IRQHandler(void)

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); //调用中断处理公用函数


void EXTI3_IRQHandler(void)

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); //调用中断处理公用函数


void EXTI4_IRQHandler(void)

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); //调用中断处理公用函数


//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
//GPIO_Pin:中断引脚号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

delay_ms(100); //消抖
switch(GPIO_Pin)

case GPIO_PIN_3:
a=1;
break;
case GPIO_PIN_8:
a=2;
break;
case GPIO_PIN_9:
a=3;
break;


MAIN代码
extern int a;
int main(void)

HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
uart_init(115200); //初始化串口
LED_Init(); //初始化PC0置1

EXTI_Init(); //初始化外部中断

while(1)

if(USART_RX_STA &0x8000 )

if(USART_RX_BUF[0] == '1')

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);//置 0
delay_ms(100);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);//置 1
// printf("置1\r\n");


USART_RX_STA = 0;


delay_ms(1000);

switch(a)

case 1:
printf("ng");
a=0;
delay_ms(500);
break;

case 2:
printf("ok");
a=0;
delay_ms(500);
break;
case 3:
printf("busy");
a=0;
delay_ms(500);
break;

//

//

参考技术A 你初始化的是GPIO2,3,4,可是回调函数里面用的是3,8,9,这是什么鬼?

STM32F4 SPI接收中断不起作用

【中文标题】STM32F4 SPI接收中断不起作用【英文标题】:STM32F4 SPI Receive interrupt not working 【发布时间】:2021-05-02 16:37:58 【问题描述】:

我正在做一个项目,我使用两个板通过 SPI 进行通信。主板 (TMS320F28377S) 通过 SPI 成功发送数据,我附上了带有 CLK、MOSI 和 SS 引脚的示波器屏幕截图。 master data

现在,我的接收器板在 STM32F439 处理器上运行,我对这款微机比较陌生。我使用 CubeMX 将其配置为仅接收器,其余设置如下所示,

hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_SLAVE;
hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; 
hspi2.Init.NSS = SPI_NSS_HARD_INPUT; //??
//hspi2.Init.NSS = SPI_NSS_SOFT; 
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;

从示波器上可以看出,两块板的 CPHA 和 CPOL 设置都匹配(空闲时为低时钟,前沿采样)。

一旦代码准备好接收,我会调用以下代码,

if(HAL_SPI_Receive_IT(&hspi2, (uint8_t *)GEU_RX_Buffer, 2) != HAL_OK)

    Error_Handler();    

                
while(1)

我在中放置断点,设置变量并再次调用接收中断

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

    Sys_Mode = DIAGNOSTIC_MODE;

    // Trigger interrupt again to keep receiving datas
    HAL_SPI_Receive_IT(&hspi2, (uint8_t *)rx_buffer, 2);

当我从 master 进行传输时,我正在观察 rx_buffer 变量并且没有接收到数据,也没有设置 RXNE 标志。

这里有什么我遗漏的吗?我想要的只是能够使用中断以非阻塞模式在另一个平台上接收数据。另外,我是否应该将 NSS 引脚物理连接到接收器微控制器上的 I/0?

提前感谢您的帮助。

谢谢。

吉尔

【问题讨论】:

【参考方案1】:

AFAIK HAL_SPI_RxCpltCallback 仅由 DMA 中断触发。您应该尝试将HAL_SPI_Receive_IT 更改为HAL_SPI_Receive_DMA 或在xxx_it.c 文件中实现HAL_SPI_Receive_IT 的处理程序。

从我的角度来看(在这个特定主题上的经验很少......)看起来你在等待错误的中断。

【讨论】:

我意识到我的定制硬件上的 NSS 引脚被拔错了。谢谢!最好的,吉尔

以上是关于STM32F103ZET6外部中断不起作用,不知道程序哪里错了?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103五分钟入门系列外部中断大汇总

STM32F103五分钟入门系列NVIC中断优先级管理

STM32F103(二十七)超长篇解读STM32访问外部flash

STM32F103(二十七)超长篇解读STM32访问外部flash

STM32F103(二十七)超长篇解读STM32访问外部flash

STM32F103(二十七)超长篇解读STM32访问外部flash