文章目录
C 语言支持如下 6 种位操作
不改变其他位的值的状况下,对某几个位进行设值。
这个场景单片机开发中经常使用,方法就是
比如我要改变 GPIOA-> BSRRL 的状态,先对需要设置的位用 & 操作符进行清零操作,然后用 | 操作符设值。
GPIOA-> BSRRL &=0XFF0F; //将第 4-7 位清 0
GPIOA-> BSRRL |=0X0040;//设置相应位的值,不改变其他位的值
GPIOx->ODR = (((uint32_t)0x01) << pinpos);
TIMx->SR = (uint16_t)~TIM_FLAG;
#define TIM_FLAG_Update ((uint16_t)0x0001)
#define TIM_FLAG_CC1 ((uint16_t)0x0002)
看这个应该很容易明白,可以直接从宏定义中看出 TIM_FLAG_Update 就是设置的第 0 位了, 可读性非常强。
1、给定一个整型变量a,设置a的bit 3,清除a 的bit 3
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
2、已知有一个int型大小的内存及其地址,如何向该地址存入数据 :4个字节,32位 0x3a47ba14;
#include "stdio.h"
int main()
{
int *p=(int *)0x3a47ba14; // 地址
*p=10
printf("%d,0x%x",*p,p);// 输出地址的信息
return 0;
}
常见格式:
#ifdef 标识符
程序段 1
#else
程序段 2
#endif
它的作用是:当标识符已经被定义过(一般是用#define 命令定义),则对程序段 1 进行编译, 否则编译程序段 2。
其中#else 部分也可以没有,即:
#if defined (STM32F40_41xxx)
STM32F40x 系列和 STM32F41x 系列芯片需要的一些变量定义
#end
extern 申明变量可以多次,但定义只有一次
| 栈区(stack) | 存放函数的参数、局部变量 |
|---|---|
| 堆区(heap) | 提供程序员动态申请的内存空间 |
| 全局(静态)区(static) | 存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段) |
| 程序代码区 | 存放函数体的二进制代码和字符串常量。 |
只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),才可以从一个时钟源切换到另一个时钟源。在被选择时钟源没有就绪时,系统时钟的切换不会发生。
每个I/O端口位可以自由的编程,尽管I/O端口寄存器必须以32位字的方式访问
1.关于中断嵌套说法正确的是( B )
(A)只要响应优先级不一样就有可能发生中断嵌套
(B)只要抢占式优先级不一样就有可能发生中断嵌套
(C)只有抢占式优先级和响应优先级都不一才有可能发生中断嵌套
(D)以上说法都不对
2.中断屏蔽器能屏蔽( B )
(A)所有中断和异常 (B)除了NMI外所有异常和中断
(C)除了NMI、异常所有其他中断 (D)部分中断
3.PWM是( A )
(A)脉冲宽度调制 (B)脉冲频率调制 (C)脉冲幅度调制 (D)脉冲位置调制
STM32 ADC是一个12位连续近似模拟到数字的转换器
4.ADC转换过程不含哪项( D )
(A)采样 (B)量化 (C)编码 (D)逆采样
5.ADC转换过程正确的是( A )
(A)采样—量化—编码(B)量化—采样—编码
(C)采样—编码—量化(D)编码—采样—量化
6.下列哪项不是ADC转换器的主要技术指标( B )
(A)分辨率 (B)频率 (C)转换速率 (D)量化误差
7.DMA控制器可编程的数据传输数目最大为( A )。
A.65536 B.65535
C.1024 D.4096
8.STM32中,1个DMA请求占用至少(B )个周期的CPU访问系统总线时间。
A.1 B.2
C.3 D.4
9.下面不属于STM32的bxCAN的主要工作模式为(C )。
A.初始化模式 B.正常模式
C.环回模式 D.睡眠模式
10.和PC系统机相比嵌入式系统不具备以下哪个特点( C )。
A、系统内核小 B、专用性强
C、可执行多任务 D、系统精简
11.嵌入式系统有硬件和软件部分构成,以下( C)不属于嵌入式系统软件。
A. 系统软件 B.驱动 C. FPGA编程软件 D.嵌入式中间件
61.ARM Cortex-M3不可以通过(D )唤醒CPU。
A.I/O端口 B.RTC闹钟
C.USB唤醒事件 D.PLL
12.DMA控制器可编程的数据传输数目最大为(A)。
A.65536 B.65535
C.1024 D.4096
13.每个DMA通道具有(A )个事件标志。
A.3 B.4
C.5 D.6
14.STM32中,1个DMA请求占用至少( B)个周期的CPU访问系统总线时间。
A.1 B.2
C.3 D.4
嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,
由硬件层、中间层、系统软件层和应用软件层组成。
硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM中。
硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board
Support
Package,BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP
层提供的接口即可进行开发。该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。
BSP具有以下两个特点: 硬件相关性:因为 嵌入式实时系统的 硬件环境具有应用相关性,而作为上层软 件与硬件平台之间的接口,BSP需要为
操作系统提供操作和控制具体硬件的方法。 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。
BSP的另一个主要功能是硬件相关的设备驱动。硬件相关的设备驱动程序的初始化通常是一个从高到低的过程。尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP将他们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。与硬件相关的驱动程序是BSP设计与开发中另一个非常关键的环节。
系统软件层由实时多任务操作系统(Real-time Operation System,RTOS)、文件系统、图形用户接口(Graphic User Interface,GUI)、网络系统及通用组件模块组成。RTOS是嵌入式应用软件的基础和开发平台。
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
串口数据处理有两种方式:
1.通过串口中断接收到数据后,将数据放置环形缓存或队列中,待数据处理函数进行处理时进行处理。(RTOS)
2.通过轮询,时间片方式调度串口寄存器判断是否有数据,有数据则放入缓存待处理。(裸机)
级别关系是: 抢占式优先级 > 响应优先级 > 中断表中的排位顺序。只有在上一级优先级相同时下一级优先级才会起作用。
直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
有多少个DMA资源?
有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。
数据从什么地方送到什么地方?
外设到SRAM(I2C/UART等获取数据并送入SRAM);
SRAM的两个区域之间;
外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比);
SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形);
已知单片机内置12位精度的ADC,单片机工作电压3.3V,ADC基准电压3V,请计算ADC采样的电压最小分辨率是多少?如果单片机ADC输入口电压为1V,则采样得到的值是多少?
STM32F407 系统架构图:

主系统由 32 位多层 AHB 总线矩阵构成。总线矩阵用于主控总线之间的访问仲裁管理。仲裁采 取循环调度算法。总线矩阵可实现以下部分互联:
八条主控总线是:
七条被控总线:
下面我们具体讲解一下图中几个总线的知识
I 总线(S0):此总线用于将 Cortex-M4 内核的指令总线连接到总线矩阵。内核通过此总
线获取指令。此总线访问的对象是包括代码的存储器。
D 总线(S1):此总线用于将 Cortex-M4 数据总线和 64KB CCM 数据 RAM 连接到总线矩
阵。内核通过此总线进行立即数加载和调试访问。
S 总线(S2):此总线用于将 Cortex-M4 内核的系统总线连接到总线矩阵。此总线用于访
问位于外设或 SRAM 中的数据。
DMA 存储器总线(S3,S4):此总线用于将 DMA 存储器总线主接口连接到总线矩阵。
DMA 通过此总线来执行存储器数据的传入和传出。
DMA 外设总线:此总线用于将 DMA 外设主总线接口连接到总线矩阵。DMA 通过此
总线访问 AHB 外设或执行存储器之间的数据传输。
以太网 DMA 总线:此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA
通过此总线向存储器存取数据。
USB OTG HS DMA 总线(S7):此总线用于将 USB OTG HS DMA 主接口连接到总线矩
阵。USB OTG HS DMA 通过此总线向存储器加载/存储数据。
对于系统架构的知识,在刚开始学习 STM32 的时候只需要一个大概的了解,大致知道是个 什么情况即可。
FreeRTOS为例,RTOS系统是以抢占优先级为主,时间片为辅实现任务调度的操作系统,主要核心上实现的是任务调度的功能,使任务具有实时性。
任务间数据传输一共有三种形式,用的最多的是消息队列,其次是全局变量和信号量。
1.消息队列发送数据的方式可以是发送数据本身和发送数据的地址指针。
2.全局变量使用供所有任务获取和处理,但全局变量占用内存较多,而且不好管理。
3.信号量一般作为标志位使用。
信号量共有三种,二值信号量、计数信号量、互斥信号量,常用的是二值信号量和互斥信号量。
信号量本质上都是深度为1的消息队列。
二值信号量通常在中断中作为标志位使用,起到线程同步的作用。
互斥信号量作为互斥锁使用。防止不同线程访问同个内存。
FreeRTOS一共有32个任务优先级,但实际使用的优先级个数通过系统设置使用。
系统优先级NVIC基于RAM架构,优先级最高,是一切中断的基石。任务优先级基于FreeRTOS,和系统优先级无关。
- 优先级继承
- 优先级恢复
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
我知道全局变量$!包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法?rescue$! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这很有用。a=get_me_datarescue$!在此行之后,a将保存请求的数据或异常。然后您可以分析该异常并采取相应措施。defget_me_dataraise'Nodataforyou'enda=get_me_datarescue$!puts"Executioncarrieson"pa#>>Executioncarrieson#>>#更现实的
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
我在我正在处理的一些代码中发现了这一点。它旨在解决从磁盘读取key文件的要求。在生产环境中,key文件的内容位于环境变量中。旧代码:key=File.read('path/to/key.pem')新代码:key=File.read('|echo$KEY_VARIABLE')这是如何工作的? 最佳答案 来自IOdocs:Astringstartingwith“|”indicatesasubprocess.Theremainderofthestringfollowingthe“|”isinvokedasaprocesswithappro