173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

stm32dma如何开启中断

keros@mark 2023-03-19 资讯中心

stm32怎么配置中断?

串口时钟使能,GPIO 时钟使能

2) 串口复位

3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

6) 使能串口

7) 编写中断处理函数

.串口时钟使能。串口是挂载在 APB2 下面的外设,所以使能函数为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

2.串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置

这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外

设的操作。复位的是在函数 USART_DeInit()中完成:

void USART_DeInit(USART_TypeDef* USARTx);//串口复位

比如我们要复位串口 1,方法为:

USART_DeInit(USART1); //复位串口 1

3.串口参数初始化。串口初始化是通过 USART_Init()函数实现的,

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。

第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用

来设置串口的一些参数。一般的实现格式为:

USART_InitStructure.USART_BaudRate = bound; //一般设置为 9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl

= USART_HardwareFlowControl_None; //无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

//收发模式

USART_Init(USART1, USART_InitStructure); //初始化串口

从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,

硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。

4.数据发送与接收。STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是

一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收

到数据的时候,也是存在该寄存器内。

STM32 库函数操作 USART_DR 寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

通过该函数向串口寄存器 USART_DR 写入一个数据。

STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

通过该函数可以读取串口接受到的数据。

5.串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。USART_SR 的各位描述如

这里我们关注一下两个位,第 5、6 位 RXNE 和 TC。

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并

且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将

该位清零,也可以向该位写 0,直接清除。

TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如

果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写

USART_DR。2)直接向该位写 0。

状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。

在我们固件库函数里面,读取串口状态的函数是:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的

RXNE(读数据寄存器非空)以及 TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE),操

作库函数的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

我们要判断发送是否完成(TC),操作库函数的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_TC);

这些标识号在 MDK 里面是通过宏定义定义的:

如何保证stm32 ad dma中断

你可以设置DMA中断,也就是DMA把AD数据搬移到指定位置后,会产生一个中断,你可以在中断中添加你需要运行的代码,DMA中断和其他中断一样,要配置中断优先级,想要中断得到保障,可以设置更高优先级。

STM32 DMA无法进入中断

如果只是无法进中断,你检查下NVIC的中断映射是否配置,我用的是DMA发送,给你参考下。

相关定义:

#define USART1_Tx_DMA_Channel    DMA1_Channel4

#define USART1_Tx_DMA_STREAM     DMA2_Stream7

#define USART1_Tx_DMA_TCIF       DMA1_FLAG_TC4

#define USART1_Rx_DMA_Channel    DMA1_Channel5

#define USART1_Rx_DMA_FLAG       DMA1_FLAG_TC5 

#define USART1_DR_Base           ((uint32_t)USART1-DR)

代码:

#ifdef USART1_USE_DMA_MODE

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA1时钟

#ifdef USART1_DMA_TX

    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; //设置中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主优先级设置

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //设置优先级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断

    NVIC_Init(NVIC_InitStructure); 

    DMA_DeInit(USART1_Tx_DMA_Channel);  

    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)m_UartDCB.pSendBuff;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    DMA_Init(USART1_Tx_DMA_Channel, DMA_InitStructure); //配置DMA1

    DMA_ITConfig(USART1_Tx_DMA_Channel, DMA_IT_TC, ENABLE);    //使能DMA发送中断

#endif //_USART_DMA_TX__

#endif //USE_DMA_MODE

STM32中断函数怎么用?

以STM32F103VB系列为例,100pin, 一般我们通常使用的IO对应外部中断线如下: PA0,PB0,PC0,PD0,PE0 对应的是EXTI0中断线; 以此类推 到PA15,PB15,PC15,PD15,PE15对应EXTI5中断线。

STM32里面EXTI0 – EXTI4这5个外部中断有着自己的单独的中断就表示哪个中断被触发。

你打开stm32的启动文件,例如startup_stm32f10x_hd.s 里面有很多中断跳转的入口。用白话说就是固件库帮你写好了发生什么中断时跳转到哪里,这些名字是一个函数名,你要把这些函数写出来,然后中断来了stm32就跳到这样函数名的函数里面来。

stm32中如何开关总中断

在STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。 PRIMASK 位:只允许 NMI 和 hard fault 异常,其他中断/ 异常都被屏蔽(当前 CPU 优先级=0)。 FAULTMASK 位:只允许 NMI,其他所有中断/异常都被屏蔽(当前 CPU 优先级=-1)。 在STM32 固件库中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 PRIMASK 位和FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。 下面两个函数等效于关闭总中断: void NVIC_SETPRIMASK(void); void NVIC_SETFAULTMASK(void); 下面两个函数等效于开放总中断: void NVIC_RESETPRIMASK(void); void NVIC_RESETFAULTMASK(void); 上面两组函数要成对使用,不能交叉使用。 例如: 第一种方法: NVIC_SETPRIMASK(); //关闭总中断 NVIC_RESETPRIMASK(); //开放总中断 第二种方法: NVIC_SETFAULTMASK(); //关闭总中断 NVIC_RESETFAULTMASK(); //开放总中断 常常使用 NVIC_SETPRIMASK(); // Disable Interrupts NVIC_RESETPRIMASK(); // Enable Interrupts------------------------------------------------------------------------------------------------- 在3.0 的库中 已经没有 第一种方法: NVIC_SETPRIMASK(); //关闭总中断 NVIC_RESETPRIMASK(); //开放总中断 第二种方法: NVIC_SETFAULTMASK(); //关闭总中断 NVIC_RESETFAULTMASK(); //开放总中断 补充 可以用 #define CLI() __set_PRIMASK(1) #define SEI() __set_PRIMASK(0)

本文标签:stm32dma如何开启中断

产品列表
产品封装
友情链接