扫描关注一起学嵌入式,一起学习,一起成长
参考:STM32启动详细流程分析
(资料图)
APB1负责 DA,USB,SPI,I2C,CAN,串口2345,普通TIM,PWR
参考:透彻理解 UART 通信
问题一:串行通信方式介绍
同步通信:I2C 半双工,SPI 全双工
异步通信:RS485 半双工、RS232 全双工
串口设置的一般步骤可以总结为如下几个步骤:
(6)使能串口
(7)编写中断处理函数
(1)全双工操作(相互独立的接收数据和发送数据);
(2)同步操作时,可主机时钟同步,也可从机时钟同步;
(3)独立的高精度波特率发生器,不占用定时/计数器;
(4)支持5、6、7、8和9位数据位,1或2位停止位的串行数据桢结构;
(5)由硬件支持的奇偶校验位发生和检验;
(6)数据溢出检测;
(7)帧错误检测;
(8)包括错误起始位的检测噪声滤波器和数字低通滤波器
(9)三个完全独立的中断,TX发送完成、TX发送数据寄存器空、RX接收完成;
(10)支持多机通信模式;
(11)支持倍速异步通信模式。
应用场景:GPS、蓝牙、4G模块
软件模拟:没有设置通信速率,该怎么计算呢?
通过I2C总线位延迟函数 i2c_Delay:
参考:全面解析 SPI 通信协议
问题二:SPI通信的四种模式?
SPI 有四种工作模式,各个工作模式的不同在于 SCLK 不同, 具体工作由 CPOL,CPHA 决定。
CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;
(2)CPHA:(Clock Phase),时钟相位。
相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。
CPHA=0,表示第一个边沿:
对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
问题三:该如何确定使用哪种模式?
(1)先确认从机需求的 SCLK 极性,不工作时是在低电位还是高电位,由此确认 CPOL 为 0 或 1。看原理图,我们设置串行同步时钟的空闲状态为高电平所以我们选择 SPI_CPOL_High。也就是CPOL为1。
(2)再由slave芯片 datasheet 中的时序图确认 slave 芯片是在 SCLK 的下降沿采集数据,还是在SCLK的上升沿。
翻译一下:W25Q32JV通过SPI兼容总线访问,包括四个信号:串行时钟(CLK),芯片选择(/CS),串行数据输入(DI)和串行数据输出(DO)。
标准SPI指令使用DI输入引脚串行地将指令、地址或数据写入CLK上升沿上的设备。DO输出引脚用于从CLK下降沿上的设备读取数据或状态。支持模式0(0,0)和3(1,1)的SPI总线操作。
模式0和模式3关注的是当SPI总线主端处于待机状态,数据没有被传输到串行Flash时CLK信号的正常状态。对于模式0,在下降和上升时,CLK信号通常是低的边缘/ CS。对于模式3,在/CS的下降和上升边缘上CLK信号通常是高的。
既然串行同步时钟的空闲状态为高电平,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge。也就是CPHA为1。
即,我们选择的是模式3(1,1)。
问题一:CAN总结介绍一下
问题二:CAN初始化配置步骤?
(1)配置相关引脚的复用功能,使能CAN时钟
(2)设置CAN工作模式及波特率等(CAN初始化环回模式,波特率500Kbps )
参考:学习嵌入式,DMA要会玩
直接存储器存取(DMA) 用来提供在外设和存储器之间,或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
应用场景:GPS、蓝牙,都是用的循环采集,DMA_Mode_Circular模式。
一个比较重要的函数,获取当前剩余数据量大小,根据设置的接收buff大小减去当前剩余数据量 ,得到当前接收数据大小。
问题一:描述一下中断的处理流程?
问题二:STM32的中断控制器支持多少个外部中断?
STM32的中断控制器支持 19 个外部中断/事件请求:
从图上来看,GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0 ~ 15。
EXTI15_10_IRQHandler
并非是每一任务按优先级顺序轮流执行的,而是高优先级的任务独占运行,除非其主动放弃执行,否则低优先级任务不能抢占,同时高优先级可以把放出去给低优先级任务使用的CPU占用权抢回来。所以ucos的任务间要注意插入等待延时,以便ucos切出去让低优先级任务执行。
应用实例:互斥信号量
作为互斥条件,信号量初始化为 1。
实现目标:调用串口发送命令,必须等待返回“OK”字符过后,才能发送下一条命令。每个任务都有可能使用到此发送函数,不能出现冲突!
概念:
(1)消息队列实际上就是邮箱阵列
(2)任务和中断都可以将一则消息放入队列中,任务可以从消息队列中获取消息。
(3)先进入队列的消息先传给任务(FIFO)。
(4)每个消息队列有一张等待消息任务的等待列表,如果消息列中没有消息,则等待消息的任务就被挂起,直到消息到来。
储存外部事件。
了解过Modbus协议。详解 Modbus 通信协议(清晰易懂)
结构为:帧头(SDTC)+帧长度+指令+流水号+数据+CRC校验。
μC/OS-II是专门为计算机的嵌入式应用设计的,μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。
linux 免费,安全,稳定,应用范围广,在嵌入式上,服务器上,家用机,都有广泛应用。
μC/OS-II Linux 都适合用在嵌入式上。但μC/OS-II 是专为嵌入式而设计,这样的结果是,运行效率更高,占用资源更少。
linux 都可以用作服务器上,使用率高。linux 虽然不是专门针对服务器而开发,但其源码公开,完全可以修改,使得两者差异不大,最主要的发行版 redhat linux 就是在服务器上用得很多的系统。
1、显示工作路径下已修改的文件:
其中还要注明:
注意:每一个文件夹下都要重新提一次。
6、查看提交代码
7、请勿修改已发布的提交记录! (以后提交使用这个)
8、推送到服务器
ucosii 和 freeRTOS比较:
(4)理论上讲,freeRTOS 可以管理超过64个任务,而uCOSii只能管理64个。
ucosii 和 ucosiii 比较:
那么从μC/OS-II到μC/OS-III有哪些不同的地方呢?增加了什么,我们看改动还是很大的。
一个是原来只有0~63个优先级,而且优先级不能重复,现在允许几个任务使用同一个优先级,在同一个优先级里面,支持时间片调度法;
第二个是允许用户在程序运行中动态配置实时操作系统内核资源,比如,任务、任务栈、信号量、事件标志组、消息队列、消息数、互斥型信号量、存储块划分和定时器,可以在程序运行中变更。这样,用户可以避免在程序编译过程中出现资源不够分配的问题。
在资源复用上,也做了一些改进。μC/OS-II中,最多任务数有64个,到了版本2.82以后是256个,μC/OS-III中,用户可以由任意多的任务、任意多的信号量、互斥型信号量、事件标志、消息列表、定时器和任意分配的存储块容量,仅受限于用户CPU可以使用的RAM量。这个也是一个很大的扩展。
(问:邵老师,它的这个数是启动时就固定的,还是启动后随便定?)它是配置的时候可以自由定义的,只有你的RAM足够大的话。
第四点是增加了很多功能,功能总是越来越多的,大伙可以看一下的。原来这些功能在μC/OS-II里面是没有的。
分三层,物联网从架构上面可以分为感知层、网络层和应用层
(1)感知层:负责信息采集和物物之间的信息传输,信息采集的技术包括传感器、条码和二维码、 RFID射频技术、音视频等多媒体信息。
信息传输包括远近距离数据传输技术、自组织组网技术、协同信息处理技术、信息采集中间件技术等传感器网络。
感知层是实现物联网全面感知的核心能力,是物联网中包括关键技术、标准化方面、产业化方面亟待突破的部分,关键在于具备更精确、更全面的感知能力,并解决低功耗、小型化和低成本的问题。
(2)网络层:是利用无线和有线网络对采集的数据进行编码、认证和传输,广泛覆盖的移动通信网络是实现物联网的基础设施,是物联网三层中标准化程度昀高、产业化能力昀强、昀成熟的部分,关键在于为物联网应用特征进行优化和改进,形成协同感知的网络。
(3)应用层:提供丰富的基于物联网的应用,是物联网发展的根本目标,将物联网技术与行业信息化需求相结合,实现广泛智能化应用的解决方案集,关键在于行业融合、信息资源的开发利用、低成本高质量的解决方案、信息安全的保障以及有效的商业模式的开发。
系统通过与内存分区相关联的内存控制块来对内存分区进行管理。
动态内存管理函数有:
释放内存块函数OSMemPut();
有5种状态:
睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
UCOSII 任务的5个状态转换关系:
(4)使能PLL,将系统时钟源切换到PLL。
(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错误;
怎样调试 STM32 硬件错误 HardFault
(1)在startup_stm32f10x_cl.s里找到 HardFault_Handler 的地址重映射,并重新编写,让其跳转到 HardFaultHandle 函数。
(2)打印查看R0、R1、R2、R3、R12、LR、PC、PSR寄存器。
(3) 查看Fault状态寄存器组(SCB->CFSR和SCB->HFSR)
(1)使用unicode编码合成声音
AT+CTTS=1,”6B228FCE4F7F75288BED97F3540862107CFB7EDF”
内容是“欢迎使用语音合成系统”,模块收发中文短信就是unicode编码,所以很容易将短信朗读出来;
(2)直接输入文本,普通字符采用ASIIC码,汉字采用GBK编码。
AT+CTTS=2,”欢迎使用语音合成系统”
通过SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC))//1ms定时器
其中:
如果需要20ms则,可以通一设置一个全局变量,然后定初值得为20,这样,每个systick中断一次,这个全局变量减1,减到0,即systick中断20次,时间为:1ms*20=20ms。从而实现 20ms 的定时。
STM32时钟系统详解
假设状态机的状态转换由下表所示:
实现:(使用switch语句)
STM32F407 VS STM32F103 主要功能及资源对比?
原文:juyou.blog.csdn.net/article/details/116021595
觉得文章不错,点击“分享”、“赞”、“在看” 呗!