IO引脚复用和映射 STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。在芯片数据手册或STM32F4XX参考手册中都可以查到哪些引脚可以复用为哪些内置外设。
SysTick滴答定时器 - 延时函数 在Cortex M3权威指南中有详细的讲解:对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8 内核时钟是 HCLK时钟 配置函数:SysTick_CLKSourceConfig();
GPIO(STM32)点亮LED灯、按键KEY GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。在STM32F4xx芯片上的GPIO口被分成各个组,一共有7组IO口,以A、B、C、D、E、F、G等命名(不同的stm32芯片,引脚数不同,可能只有其中几组,从A开始标记),称为GPIOA—GPIOG。
对话框与多窗体设计 —— 自定义对话框及其调用 在一个应用程序设计中,为了实现一些特定的功能,必 须设计自定义对话框。自定义对话框的设计一般从 QDialog继承,并且可以采用UI设计器可视化地设计对 话框。对话框的调用一般包括创建对话框、传递数据给 对话框、显示对话框获取输入、判断对话框单击按钮的 返回类型、获取对话框输入数据等过程。Q_OBJECTpublic:// 构造函数,参数为父窗口指针,默认为空指针// 析构函数// 设置姓名和年龄的函数,接受姓名和年龄作为参数// 获取姓名的函数,返回姓名字符串。
对话框与多窗体设计 —— 标准对话框 一个完整的应用程序设计中,不可避免地会涉及多个窗 体、对框框的设计和调用,如何设计和调用这些对话框 和窗体是搞清楚一个庞大的应用程序设计的基础。Qt为应用程序设计提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等,用户无需再自己设计这些 常用的对话框,这样可以减少程序设计工作量。QInputDialog有单行字符串输入、整数输入、浮点数输 入、列表框选择和多行文本等多种输入方式。实例:从下拉列表框中输入。实例:输入字符串对话框。
常用界面设计组件 —— 时间日期与定时器 QTimer不是一个可见的界 面组件,在UI设计器的组件面板里找不到它。QTimer主 要的属性是interval,是定时中断的周期,单位是毫秒。QTimer主要的信号是timeout(),在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写 timeout()信号的槽函数。定时器是用来处理周期性事件的一种对象,类似于硬件 定时器。例如设置一个定时器的定时周期为1000毫秒, 那么每1000毫秒就会发射定时器的timeout()信号,在 信号关联的槽函数里就可以做相应的处理。
常用界面设计组件 —— 容器组件 QStackedWidget列提供了堆叠窗体的效果。为了将界面上的各个组件的分布设计得更加美观,经常 使用一些容器类,如 QgoupBox、QtabWidget、 QToolBox等。QTabWidget 的一种带标签页的窗口,在这种类型的窗 口中可以存储多个子窗口,每个子窗口的显示可以通过 对应的标签进行切换。QToolBox类提供了一列选项卡窗口,当前项显示在当前 选项卡下面,适用于分类浏览、内容展示、操作指引这 一类的使用场景。最终的效果 可以看到页面显示不全,有滑动拉条显示。可以选择垂直布局选项。
常用界面设计组件 —— 按钮组件、布局组件 如果 启用了自动互斥,属于同一个父部件的单选框的行为 就和属于一个互斥按钮组的一样。Qt提供了QHBoxLayout类(水平排列布局), QVBoxLayout类(垂直排列布局),QGridLayout类(网格 排列布局)等基本布局管理。所谓布局, 就是界面上组件的排列方式,使用布局可以使组件有规 则地分布,并且随着窗体大小变化自动地调整大小和相 对位置。:QCheckBox可以有两种状态,也可以有三种 状态(未选中,选中,半选),默认是两种状态。addLayout()方法用于向布局中加入子布局。
常用界面设计组件 —— 数字输入和显示组件 QSpinBox用于整数的显示和输入,一般显示十进制 数,也可以显示二进制、十六进制数,而且可以在显示 框中增加前缀或后缀。QDoubleSpinBox用于浮点数的 显示和输入,可以设置显示小数的位数,也可以设置显 示前缀和后缀。QSlider和QDial 2个组件都从QAbstractSlider继承而 来,有一些共有的属性。QSlider是滑动的标尺型组 件,滑动标尺上的一个滑块可以改变值。QLCDNumber是模拟LCD显示数字的组件,可以显 示整数或小数。对应的成员函数可以查阅QT官方手册。
常用界面设计组件 —— 字符串与输入输出组件(QT) ,并在对话 框里选择 clicked() 信号创建槽函数,在自动生成的函数 体编写如下代码,实现从界面中读取用户输入的数量和 单价,相乘计算后将结果显示到总价对应的文本框里。界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了,QLabel用于显示字符串,QLineEdit用于 显示和输入字符串。QString提供了大量的功能,有助于灵活实现字符串处理 功能,可以可以通过查看QT帮助手册得到。count() 、size() 和 length()toUpper() 和toLower()
常用界面设计组件 —— 窗体(QT) 窗体是指程序的整体界面,可以包含标题栏、菜单栏、 工具栏、关闭按钮、最小化按钮、最大化按钮等。QMainWindow、QWidget、QDialog 三个类就是用来创建窗体的,可以直接使用也可以继承后再使用。对话框主要用来执行短 期任务,或与用户进行互动,它可以是模态的也可以是 非模态的。QMainWindow 窗口可以包含菜单栏、工具栏、状态 栏、标题栏等,是最常见的窗口形式,可以作为GUI程 序的主窗口。:窗口左上角的图标显示不出来,是跟ubuntu系统 的显示相关(windows环境下正常显示)。
模板与STL(C++) 返回类型 函数名(参数表){... ...template是模板定义的关键字写在中的T1 T2…是模板参数中的typename表示其后的参数可以是任意类型的。a:b;return a
文件与流(C++) istrstream和ostrstream在98标准中废弃,取而代之的是istringstream和ostringstream,实现类似于C语言中sprint和sscanf的效果,不是在标准输入设备中获取数据,操作对象是在缓冲区。istream类定义了许多用于从流中提取数据和操作文件的成员函数,并对流的析取运算符 >> 进行了重载,实现了对内置数据量(基本数据类型)的输入功能。ostream类提供了许多用于数据输出的成员函数,并通过流的输出
异常(C++) try用于检测可能发生的异常,throw用于抛出异常,catch用于捕获并处理由throw抛出的异常。C++允许限制函数能够抛出的异常类型,限制方法时在函数声明后面添加一个throw参数表,在其中指定函数可以抛出的异常类型。函数fun被限定只允许抛出 int 和 char 类型的异常,当 fun 函数抛出其他类型的异常时,程序将被异常终止。:catch在进行数据异常类型匹配时,不会进行数据类型的默认转换,只有与异常类型精确匹配的catch块才会被执行。:不需要逐层判断,一步到位,代码精炼。
运算符重载(C++) double y;c2.print();int x = 10;int y = 20;c1 + c2;//想实现和 'int z = x + y;' 一样的功能,这时就要用到运算符重载了return 0;
运行时类型信息 typeid、type_info...(C++) 运行时类型信息(Run-time Type Information,RTTI)提供了在程序运行时刻确定对象类型的方法,是面向对象程序语言为解决多态问题而引入的一种语言特性。由于多态的要求,C++指针或引用可能与他们实际代表的类型不一致(如基类指针可以指向派生类对象),当将一个多态指针转换为其 实际指向类型对象时,就需要知道对象类型信息。向下造型时,动态类型转换会对所需转换的基类指针或引用做检查,如果其目标确实为期望得到的子类类型的对象,则转换成功,否则转换失败。
虚函数实现(C++) 当编译器编译一下test函数时只知道pb是B*类型的指针,并不知道它指向的具体对象类型:pb可能指向的是B的对象,也可能指向的是D的对象。只有当程序执行过程中给test函数传递了具体参数才能确定pb指向了那个对象,从而确定访问那个虚表,从而实现了多态。每个含有虚函数(无论其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。
纯虚函数和抽象类(C++) 假设有图形类Figure,设计计算面积的成员函数area()。Figure只是一个纯抽象意义上的概念,不存在计算面积或体积的具体方法,所以只能将成员函数area()设计为纯虚函数。如果一个虚函数仅表达抽象的行为,没有具体的功能,即只有声明没有定义,这样的虚函数被称为。,抽象类只能最为其他类的基类,不能用来建立对象。如果类中的所有成员函数都是纯虚函数则可以称为。如果类中包含了纯虚函数,那么这个类就是。
虚函数(C++) 多态性是面向对象程序设计语言的又一重要特征,多态(polymorphism)通俗的讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或类似的功能,即所谓的 “一个接口,多种实现”。如果子类提供了对基类函数有效的覆盖,那么通过指向子类对象的基类指针,或者通过引用子类对象的基类引用,调用该虚函数,实际被执行将是子类中的覆盖版本,而不再是基类中的原始版本,这种语法现象被称为。如果将基类中的某个成员函数声明为虚函数,那么子类中与该函数具有。关键字修饰的成员函数称为。