嵌入式 STM32 NVIC_InitTypeDefNVIC_InitStructure; 上面这个结构声明是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式 STM32 NVIC_InitTypeDefNVIC_InitStructure; 上面这个结构声明是啥意思?相关的知识,希望对你有一定的参考价值。

NVIC_InitTypeDefNVIC_InitStructure;
上面这个结构声明是什么意思?

NVIC_InitTypeDef 是结构体的类型 NVIC_InitStructure是结构体变量;
将结构体成员赋值后传给初始化函数NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
初始化如下:
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器追问

下面“Limit Speed to Real-Time",打勾和没有打勾有什么区别吗?我愿意加分

参考技术A NVIC中断寄存器组的初始化结构定义为NVIC_InitStructure。举个列子,你要配置中断寄存器组中的很多寄存器,这些寄存器的每一位都有含义,这样配置很不方便并且程序可读性差,所以把每一位的具体含义都用了define定义,放在
STM32 NVIC_InitType中,你把需要的配置完成后直接把这个结构体变量传递给NVIC相应的配置函数就会自动配置好你需要的中断配置了。追问

这个 我己经弄懂了,呵呵,但有新的疑问,恳求大师解惑

keil 对话框里,如下图,show time 和show Calls是怎么用的?

追答

我没用过这个选项,但是我认为这个选项应该是用来选择编译时选择显示时间还是显示函数调用的。

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 3]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 2]

7 OpenOCD

OpenOCD是用于对STM32进行下载仿真的工具,是一个开源软件包。

OpenOCD官网

OpenOCD下载地址

7.1 OpenOCD安装

下载OpenOCD,最新软件版本为0.11.0,这里是使用源码编译安装。

第一步:下载并解压

第二步:配置OpenOCD

$ ./configure 

配置完成打印信息如下:

可配置的项目可以通过 $ ./configure -h 命令查看帮助信息。

【注】笔者的调试器使用的是ST-Link,所以还要运行如下命令进行使能 $ ./configure --enable-stlink,这里默认开启了,就不需要执行,如果使用其他调试器,则需要根据实际去使能设备。

第三步:编译

$ make 

第四步:安装

$ sudo make install 

安装完成后可检查OpenOCD版本,看OpenOCD是否安装成功。

$ openocd -V 

打开openocd-0.11.0/tcl,里面有很多提前写好的配置文件:

其中interface目录下都是接口相关配置文件,例如jlink.cfg,stlink.cfg;target目录下都是芯片相关的配置文件,例如stm32f1x.cfg。

7.2 OpenOCD调试配置

7.2.1 launch.json文件

在vscode文件夹中新建一个launch.json,该文件是调试的入口文件。内容如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",
            "type": "cortex-debug",
            "request": "launch",
            "name": "Cortex Debug",
            "interface": "swd",
            "servertype": "openocd",
            "executable": "./build/STM32f1.elf",
            "runToMain": true,
            "device": "STM32F103ZE",
            "svdFile": "./STM32F103xx.svd",//svd文件,有这个文件才能查看寄存器的值
            "configFiles": [
                "${workspaceRoot}/openocd.cfg"
            ],
            "preLaunchTask": "build",
            "armToolchainPath": "/opt/gcc-arm-none-eabi-10.3-2021.07/bin/"
        }
    ]
}

executable:编译出的二进制文件,也就是最终烧录到单片机中的,这里是elf文件。

request:可以选launch或attach。launch是指启动调试时同时开始执行程序;attcah是指程序已经在运行了,然后开始调试。我没测试过attach。

type:调试的类型,选cortex-debug,这是我们装的插件。其实也可以填cppdbg之类的,但是那样我们就得自己配置gdb了,配置起来将会非常麻烦。

device:目标芯片。如果你使用J-LINK GDB Server时必须要设置这个选项。

svdFile:svd文件的路径,每个MCU的各不相同。

servertype:要选择的gdb server。我这里用openocd。

configFiles:gdb的配置文件路径。openocd会自动读当前目录下的openocd.cfg文件,这个选项不填也行。但是如果你想把openocd.cfg放在别处,就可以用这个选项指定配置文件的路径。

preLaunchTask:在启动调试前,预先执行的任务。

armToolchainPath:工具链的路径。

launch.json参考

7.2.2 openocd.cfg文件

在项目文件夹下新建一个openocd.cfg文件,用于配置调具体的调试器。内容如下:

# 选择调试器为jlink
#source [find interface/jlink.cfg]
source [find interface/stlink.cfg]

# 选择接口为SWD
#transport select swd

# 选择目标芯片
source [find target/stm32f1x.cfg]

我这里选择使用ST-Link,SWD接口,目标芯片为stm32f1x。

【注】使用J-link调试也是一样的,只需将openocd.cfg文件配置成J-link调试即可。

7.2.3 svd文件

用于寻找STM32F1的svd文件。CMSIS-SVD是CMSIS的一个组件,它包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件。VS Code可以通过它来知道外设寄存器的地址分布,从而把寄存器内容展示到窗口中。

svd文件地址

将下载好的STM32F103xx.svd文件放在项目文件夹根目录即可。

7.3 Cortex-Debug调试

直接按F5,openocd启动时,会自动在当前目录下寻找名为openocd.cfg的文件作为配置文件。调试界面如下:

界面左边可以看到变量窗口、调用堆栈等。窗口中间就是单步调试的各个按钮。这个就没啥好说的了,赶紧去玩起来吧。

【注】调试STM32报错init mode failed解决方法
错误提示:

Error: init mode failed (unable to connect to the target)
......
OpenOCD init failed

解决办法:
将 Debug Mode 重新选择为 Serial Wire,如下图所示。

7.4 GDB调试

除了使用Visual Studio Code自带的调试工具外,还可以使用GDB调试,

首先在终端输入一下命令:

#openocd -f interface/stlink.cfg -f target/stm32f1x.cfg

【注】如果不带参数启动,openocd就会自动查找当前目录下有没有名为openocd.cfg的文件,并把它作为配置文件来启动。

【注】openocd默认TCP/IP的3333端口作为gdb端口。

openocd运行时,这个终端就被占用了因此还需要再开一个终端。

GDB也属于GNU项目的一部分,只是这里使用的是交叉编译工具中的GDB。

# arm-none-eabi-gdb build/STM32f1.elf

GDB常用命令如表所示。

关于GDB的使用请看笔者文章:

GDB使用

接下来需要连接openocd服务,openocd给GDB的TCP/IP端口是3333。

# target remote localhost:3333

接下来和在Linux中普通的应用程序调试一样。

在 gdb 中键入"l"(list)就可以查看所载入的文件,如下所示。

自行参考笔者关于GDB的博文去调试吧。




代码获取方法

1.长按下面二维码,关注公众号[嵌入式实验楼]
2.在公众号回复关键词[Environment_for_STM32]获取资料




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎

以上是关于嵌入式 STM32 NVIC_InitTypeDefNVIC_InitStructure; 上面这个结构声明是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 3]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 3]

《嵌入式 - 深入剖析STM32》深入理解STM32内存管理

《嵌入式 - 深入剖析STM32》深入理解STM32内存管理

《嵌入式 - 深入剖析STM32》STM32 启动流程详解

Cortex-M3之STM32嵌入式系统设计的内容简介