自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

adam_embedded的博客

copy from https://adamsq.github.io/blog

  • 博客(29)
  • 收藏
  • 关注

原创 漫谈嵌入式(一)

一、闲聊1.1 嵌入式系统所谓嵌入式系统,我的理解是针对某一特定功能而设计的一套软硬件系统。因为它的任务是特定的,所以它的软硬件系统是可裁剪的,同时它对可靠性、成本、体积、功耗、应用环境等都会有特殊的要求。1.2 立项上面的PDCA是我们进行一项复杂工作时的基本流程。我通常会听到一些同事的抱怨,说老板拍脑袋瓜就决定了某个项目,丝毫没有按照工程学的角度进行可行性分析,也缺乏足够的市场调研。其实仔细想一

2015-07-22 09:39:20 1227

原创 linux软路由的实现

一、前言一套通信协议的实现除了硬件编/解码与信号传输之外,其余的部分均可以有所选择的由软件或者硬件实现。好比最普通的RS232协议,如果你的硬件系统集成了相关模块,CPU直接从缓冲区读写数据即可,否则就要自己模拟时序,深入到协议细节里去。TCP/IP协议也一样,一般的通信芯片都会集成两层和三层的转发控制,MAC表和路由表都存在通信芯片的寄存器里,用户只要将关键信息写入寄存器即可实现转发。至于如何平衡

2015-06-30 16:39:18 11256

原创 stm32.cube(十)——单HAL模块的结构

一、接口函数对于linux驱动来说,基本的操作函数有Open、Close、Read、Write、Ioctrl,这是在OS的驱动层对外设进行操作的一套规范化的接口。对于更底层的硬件抽象层来说,上层的Open和Close意味着对外设的初始化设置和反初始化设置(回复到未被使用前的状态)。如果外设的作用是实现一个通讯传输,那么上层的Read、Write也要同样对应外设的发送和接收。若外设不是一个传输设

2015-06-25 09:22:13 3006

原创 stm32.cube(九)——HAL.DMA

一、前言DMA会在不同的寄存器/ram/存储设备之间建立通道,自动传输数据,以达到解放CPU的目的。比如你想用DAC模块去输出一段特定的波形,就要让CPU将预设的数值不断写入DAC的寄存器。这时CPU被DAC任务长期占用,系统处理其他任务和响应其他事件的能力被大幅降低。在实际应用里,经常有一些繁重的读写操作。这些操作不需要经过计算,却依然占用了大量的CPU资源,遇到这种情况就要考虑使用DMA了。我开

2015-06-24 14:42:57 11788 1

原创 stm32.cube(八)——HAL的配置文件

一、生成配置文件在HAL的头文件目录下有一个默认的配置文件stm32f1xx_hal_conf_template.h。在编译HAL代码前,要将这个文件拷贝为stm32f1xx_hal_conf.h,修改部分宏定义,用来修改HAL的全局配置。二、配置文件内容2.1 模块使能一旦使用了相应的模块,就要定义相关的模块使能。#define HAL_MODULE_ENABLED#define HAL_ADC

2015-06-24 11:49:21 7763

原创 stm32.cube(七)——arm-gcc.helloworld

一、前言对与MDK-ARM(keil),EWARM(IAR)和TureSTUDIO(Atollic)这三个ARM常用IDE工具,在cube包里都有对应的例子。对于arm-gcc,cube里只提供了例程的源码。由于需要自己写Makefile,因此比起各种IDE来说,配置的复杂度要更高一点。二、cube.gcc项目建立过程2.1 移植代码根据实际应用,拷贝需要用到的HAL、BSP、CMSIS、middl

2015-06-19 15:59:46 1986

原创 stm32.cube(六)——HAL.FLASH

一、片内Flash特性1.1 FLash结构简图 我的开发板是stm32f103xx,所以片内flash主存储器大小128K,单页为1K。不同的芯片flash大小不同,页大小也不同。主存储器用来存储Rom程序,烧写的区域。当然也可以存一些其他东西,比如做nvram使用。信息块这个区域分两个部分。存储区,用户不可写区域,用来存储ISP下载时用到的程序。当用ISP模式进行烧写时,自动调用里面的程序下载

2015-06-18 09:37:02 16841 2

原创 stm32.cube(五)——HAL.RCC

一、RCC特性1.1 HIS内部高速时钟HIS 时钟信号通过一个 8MHz 的 RC 振荡器产生,上电复位时,被自动选做系统时钟。但由于HIS的稳定性较差,受温度、电压等环境参数影响较大,一般只作为备用时钟使用。在芯片初始化的startup.s里,通常会调用一个c编写的函数system_init(),里面会将系统时钟源从HIS设置成HSE。1.2 HSE外部高速时钟由晶振或者外部时钟源提供的时钟,较

2015-06-17 09:26:58 7154 1

原创 stm32.cube(四)——HAL.ADC

一、Adc特性1.1 Adc概述Stm32的Adc具有12位的精度,共有16个外部通道和2个内部通道。不同通道的 A/D 转换可以在单一、连续、扫描或者间断模式下进行。它的其他特性还包括支持模拟看门狗和DMA。1.2 Adc初始化和大多数外设一样,Adc在使用前必须初始化时钟源,并从掉电模式唤醒该设备。建议在初始化Adc后立即运行一次校准,以减少准确性错误。1.3 通道的选择对于16个可复用的通道

2015-06-15 10:37:05 21772 1

原创 stm32.cube(三)——HAL.GPIO

一、总览HAL层里的库函数和大家熟悉的stm32lib基本上是一致的。一般来说一个cpu外设的操作函数分成两部分,分别是init和operation。来看一个cube里的例子:static GPIO_InitTypeDef GPIO_InitStruct;int main(void){ /* This sample code shows how to use GPIO HAL API to

2015-06-12 09:49:27 12162

原创 stm32.cube(二)——HAL结构及初始化

一、HAL结构HAL的作用是将基础的寄存器读写操作抽象掉,使程序员只需要关心对芯片模块的行为级操作。stm32的cube包以类似面向对象的思想来进行设计,每一个芯片模块都被抽象成一个类,它的私有成员用以辅助算法的实现,公有成员被用作一个方法供外部调用。我开发板的芯片型号是stm32f10x系列,基础的芯片结构如下: 这时官网上下载的cube包里hal内容: 对比之后发现几乎所有的模块都已经被包含

2015-06-11 09:01:15 25243 1

原创 stm32.cube(一)——系统架构及目录结构

一、前言Arm的应用场景往往比51单片机复杂得多,如果一个高级应用的开发需要连底层的结构性代码都要重构,那么在成本和研发周期上就会面临巨大的风险。为了简化编码过程,芯片厂商经常会提供一些板卡级支持的BSP包,系统级支持的SDK包,或者芯片级支持的HAL层。对于stm32系列的芯片,意法半导体公司提供一个了cube包,它包含的内容很广泛(HAL,CMSIS,中间层,RTOS),灵活应用这个代码包将使开

2015-06-10 08:35:08 7243

转载 Web 研发模式演变

无意中看到一篇很精彩的文章,特地转载在这里。这篇文章为非Web开发者了解Web开发模式的演变提供了一个通道。对于一个嵌入式开发者,我想先转载此文,然后在业余时间实践几个基础的例子,以试图知道一下Web开发中的各个环节。原文地址: https://github.com/lifesinger/lifesinger.github.com/issues/184作者公众微信: 一、简单明快的早期时代可称之

2015-06-09 09:50:30 615

原创 UCOSii(六)——移植

一、前言UCOSii官方已经提供了许多移植范例,在这种情况下自己移植UCOSii是一种不经济的做法。但为了了解一个RTOS在移植时面临的兼容性问题,知道如何移植UCOSii依然是有必要的。那么,RTOS在编译和运行时,在不同的chip上,会面临哪些问题呢?编译类问题不同的芯片可能会使用不同的编译器,而不同的编译在许多处理细节上会有所不同。比如有些编译器会将函数行参推入堆栈,而另外一些则会使用寄存器传

2015-06-09 08:40:09 549

原创 UCOSii(五)——内存管理

一、前言在嵌入式系统中,时常会面临Ram受限的情况。所以用C lib里的,malloc()和 free()来申请和释放内存时,频繁的内存请求造成的内存碎片会对系统性能造成负面影响。Ucos的解决办法是为内存划分不同大小的内存区域,每个区域内有一定数量、相同大小的内存块。每次申请内存都必须要以一个内存块为单位,释放内存块时,该内存块会回到相应的内存分区。这样,确实,内存的碎片的问题得到了一定程度的解决

2015-06-08 15:48:31 3143

原创 UCOSii(四)——任务的通信与同步

一、任务的通信方式1.1 共享内存进程间的通信方式有两种,一种是使用共享内存,这种方式基本不依赖OS,也没有相应的系统开销。另一种则需要OS支持,通过建立链接器实现任务间的通信。 Message Passing Share Memory 依赖内核,需要预先建立Link,内核负担开销 无需预先建立Link,用户进程负责开销 只有建立链接的双方才可以通信 所有进程都可以访问 需

2015-06-04 08:51:52 6843

原创 UCOSii(三)——时间管理

一、时间管理1.1 时钟节拍UCOSii通过时钟节拍OSTimeTick()来定期进行任务调度,一般来说这个频率是10-100HZ,频率越高,系统的开销也就越大。1.2 任务延时函数OSTimeDly()任务可以调用OSTimeDly()来对自身延时一段时间。延时时,任务被挂起。任务被延时的时间必须是时钟节拍的倍数。与延时有关的变量在上一片文章里提到的Tcb结构体中。 Tcb.OSTCBDly表

2015-06-02 09:10:33 1843

原创 UCOSii(二)——任务的就绪与调度

一、任务调度1.1 任务状态的切换从ucosii用户手册(可以从上篇文章提到的地址下载)上的任务状态切换示意图:如果学习过类似《操作系统》这样的课,会发现这张图很容易理解。DORMANT (休眠状态)这里我总算知道了为什么UCOS用Task的概念,而不是Process。如果仅仅将一段要被执行的指令序列称之为Process,那么它应该是不存在休眠状态的。因为一旦Process被释放,它就仅仅是一个静态

2015-05-29 10:35:37 2420

原创 UCOSii(一)——系统初始化

一、闲扯之前看完了sdcc man和datasheet之后,用sdcc写了几个小程序。大部分时间都在干一些调式代码的事,就趁这段时间把UCOS复习一下吧。由于这是UCOS的第一篇,就来扯点闲话吧。对于UCOSii,我其实没有在实际的项目中用到过。只是记得在以前看过一本UCOS作者自己写的书,书名已经忘记了。这种语言或者系统架构的设计者写的书往往看起来很有意思,因为作者不仅会给你解释代码,还会告诉你他

2015-05-26 16:58:40 2299

原创 51单片机(四)——中断

一、中断1.1 中断概述51单片机有5个中断源。所谓中断,就是该事件可以打破正在执行的程序,从而进入新的任务中。等处理该事件的任务完成之后,再重新执行刚才被打断的任务。中断优先级低的任务可以被中断优先级更高的任务打断。平时没有中断时执行的程序优先级最低,可以被任何中断打断。中断系统结构示意图: 该芯片是stc90c51,因此多了一个外部中断和定时器2的中断。一般情况下,51单片机有2个定时器

2015-05-21 12:00:17 2541

原创 51单片机(三)——定时器/计数器

一、定时器/计数器1.1 定时器/计数器概述51单片机有两个内置定时器/计数器。当记数脉冲来自于外部输入时,为计算器。而来自于系统时钟时,为定时器。定时器0有四种模式。定时器1支持三种模式,可以被用来产生波特率。PCON寄存器里的SMOD0位表示每12时钟或者每6时钟产生一次计数脉冲。1.2 TCON寄存器 bit B7 B6 B5 B4 B3 B2 B1

2015-05-20 14:53:56 2160 1

原创 51单片机(二)—— GPIO&Uart

一、GPIO1.1 内部上拉电路51单片机的I/O口都可以同时作为输入和输出之用。除了P0口以外,其他的I/O口都有内部上拉电阻。3个内部上拉电阻都有不同的功用,要理解这个电路需要一定的模拟电路的知识。内部上拉电阻示意图 由于相关的硬件配置,在编程时有以下需要注意的地方:当I/O口被用作输入用途时,读取输入前要保证锁存器状态为1。当将I/O口由低拉高时,指令执行后需要

2015-05-19 12:01:33 3647

原创 51单片机(一)——总览

一、前言之前花了一点时间阅读了编译器sdcc的man文档,算是对这款交叉编译器有了基本的了解。但要写重新写单片机程序,还要对相应的知识做进一步的复习。下面我将阅读芯片的datasheet和application guide,结合一些实际的应用,对单片机的知识进行复习。我开发板上的芯片是stc90c51,不同型号的51芯片可能会略有差异。二、外围电路要使单片机正常工作,需要在VCC脚上给予5v/3.3

2015-05-19 10:50:31 1522

原创 sdcc man阅读笔记(六)——中断

sdcc中,中断程序使用的关键字和keil一样:void timer_isr (void) __interrupt (1) __using (1){...}interrupt指定中断号,using指定register bank。中断程序可以写在任意一个源文件里,但在包含main程序的源文件里,必须要有一份中断程序的声明。一、常见bug1.1

2015-04-30 10:21:51 2374

原创 sdcc man阅读笔记(五)——mem文件与map文件

一、mem文件和map文件sdcc提供mem文件和map文件来帮助我们分析一个项目编译完成后,它对各种存储空间的占用情况。1.1 mem文件打开在前一个实验里生成的test.memvim test.memInternal RAM layout: 0 1 2 3 4 5 6 7 8 9 A B C D E F0x00:|0|0|0|0|0|0|0|0|a|I|S|S|S|S|S|S|

2015-04-29 15:10:23 2626

原创 sdcc man阅读笔记(四)——存储类型关键字

一、存储类型关键字1.1 sdcc中特殊关键字的使用sdcc提供和keil一样的特殊关键字来指定变量的存储类型,和keil不同的是,sdcc在使用c51专用的特殊关键字时,要用两个下划线作为前缀,比如申明一个idata存储类型的变量时语句如下。__idata unsigned char i;1.2 __data类型该类型是small存储模式下默认使用的存储类型,对应直接寻址

2015-04-29 10:37:13 2282 1

原创 sdcc man阅读笔记(三)——c51专用编译选项

一、C51专用编译选项

2015-04-28 15:20:58 4677 3

原创 sdcc man阅读笔记(二)——基础编译选项&output files

sdcc man阅读笔记(二)——基础编译选项&output files

2015-04-28 10:30:49 2146

原创 sdcc man阅读笔记(一)——sdcc 的介绍与安装

目录目录前言一sdcc的安装1 在ubuntun下安装sdcc2 用其他方式安装sdcc二sdcc包含的内容1 头文件和库文件2 编译程序sdcc3 预处理程序sdccp4 汇编程序和链接程序sdas sdld5 仿真器6 debug工具

2015-04-27 14:54:18 7044 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除