跳转到主要内容

技术

如何写出高效优美的单片机C语言代码?

程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看:

1、代码稳定,没有隐患。

2、执行效率高。

3、可读性高。

4、便于移植。

下面总结一些网络上的技巧、经验!

1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植

2、选择合适的算法和数据结构

知道进程和线程,那你知道管程、协程和纤程吗?

每天辣么多的技术干货和前沿技术需要关注,但是在我们这个需要积累和沉淀的技术领域,好多的专业词汇,或许您早已跟它混了个脸熟,然而这个词汇背后的东西您或许还不知道。

今天就来说说这几个程:进程、线程、管程、协程和纤程。

<strong>线程</strong>

线程(Threads),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元,出现于19世纪80年代。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

嵌入式C语言之模块化编程

当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程。比如你可能只是负责通讯或者显示这一块。这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。像这些场合就要求程序必须模块化。模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。

初学者往往搞不懂如何模块化编程,其实它是简单易学,而且又是组织良好程序结构行之有效的方法之一。

本文将先大概讲一下模块化的方法和注意事项,最后将以初学者使用最广的keil c编译器为例,给出模块化编程的详细步骤。

模块化程序设计应该理解以下概述:

资深工程师对PCB设计的经验之谈

作为一个电子工程师,设计电路是一项必备的硬功夫,但是原理设计再完美,如果电路板设计不合理性能将大打折扣,严重时甚至不能正常工作。根据我的经验,我总结出以下一些PCB设计中应该注意的地方,希望能对您有所启示。

使用python下的pyserial进行串口测试和设备调用

硬件开发不可避免要与串口打交道,使用python下的pyserial可以使串口测试和设备调用的工作自动化。这里介绍pyserial的一些基础知识。

<strong> 1、安装pyserial</strong>

linux上直接安装:

#python2
sudo pip install pyserial
#或者python3
sudo pip3 install pyserial

<strong> 2、Bytes与string的转换</strong>

很多串口使用的数据是byte格式,需要进行转换。

使用str.decode()将ASCII转为String的Unicode。

聊聊上电复位电路的那些事儿

工程师们在调试各式各样的板子时,常会出现开机出现错误,系统无法正常打开,接下来我们将列举电路板上电时可能引发的一些常见系统问题,并说明了保证电路板正确初始化的基本原则。

许多IC 都包含POR电路,上电复位,即Power-on Reset),其作用是保证板子上电后,模拟和数字模块初始化至已知状态。

POR三步走:电源电压达到阈值电压——POR电路就会释放内部复位信号——状态机开始初始化器件。 

在初始化完成之前,器件忽略外部信号,包括传输的数据。唯一例外是复位引脚,它会利用POR信号内部选通。

<strong>1.1 POR电路长什么样?</strong> 

如何摆脱单片机设计过程中的电磁干扰

对电磁干扰的设计我们主要从硬件和软件方面进行设计处理,下面就是从单片机的PCB设计到软件处理方面来介绍对电磁兼容性的处理。

<strong> 一、影响EMC的因数</strong>

<strong> 1、电压</strong>

电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。

<strong> 2、频率</strong>

高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。

<strong> 3、接地</strong>

MCU上的无锁原子读操作

原子读操作是在MCU并发编程中常用的操作,简单举个例子来阐述问题:

我们使用RTOS或裸机状态编程时,必然需要一个全局时钟基准,通常是在一个定时器中断中累加实现,简化代码如下:

static unsigned long volatile __jiffies = 0; /* 全局时钟基准节拍累加器 */

ISR_TIMER() /* 定时中断服务函数 */
{
++__jiffies;
/* 其它代码...: */
}

对于其中的__jiffies变量,就是全局时间基准,程序中其它地方都会对其进行原子读操作来判断时间,典型的接口实现如下:

浅析 MCU 嵌入式系统的领域分析方法

作者:代文豪、罗克露、雷健

在不断的发展的 MCU 嵌入式系统领域中,软件危机所带来的危害也日渐显现。如何利用软件重用的相关方法来解决这一问题成为当今研究的热点。领域分析是识别、捕捉、组织、分析和表示软件域中相关信息,确定软件的体系结构、框架和构件,以支持软件重用的软件工程过程,是解决重用问题的关键技术之一。通过对领域分析的相关概念、方法、过程以及产品的研究,从而得出在 MCU 嵌入式系统领域进行领域分析的相关方法以及经验。

<strong> 1、前言</strong>

简析对通用输入输出GPIO的理解

<strong>一、GPIO简介</strong>

I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。通常在ARM里,所有I/O都是通用的,称为GPIO(General Purpose Input/Output)。每个GPIO端口包含8个管脚,如PA端口是PA0~PA7。GPIO模块支持多个可编程输入/输出管脚(具体取决于与GPIO复用的外设的使用情况)。GPIO模块包含以下特性:

1)可编程控制GPIO中断

a. 屏蔽中断发生

b. 边沿触发(上升沿、下降沿、双边沿)

c. 电平触发(高电平、低电平)

2)输入/输出可承受5V

3)在读和写操作中通过地址线进行位屏蔽

4)可编程控制GPIO管脚配置:

MCU上电复位原理

① 上电复位:是由外部总线产生的一种异步复位,单片机电压监测电路检测到电源电压 VDD 上升时,会产生一个上电复位脉冲,由内部计时器进行延时后等待电源电压上升到可以工作的电压后,整个单片机系统就完成了上电复位。注意上电复位电路并不会检测延时过后的系统电压,如果此时的电压低于单片机的最小工作电压,整个上电复位就失效了。

总结硬件仿真与烧写程序结果不一样的原因

<strong> 一、配置问题:</strong>

实际烧片时单片机的配置字与仿真的时候是不是一样?烧写时是否配置正确?

<strong> 二、资源问题:</strong>

单片机的ROM、RAM大小与仿真器的ROM、RAM大小是不一样的!

<strong> 三、驱动能力问题:</strong>

通常仿真器的驱动能力比单片机要强;可以分两步检查,一是分别用仿真器与单片机时对应IO口波形进行对比,二是当仿真器与外设连接与不连接时波形的对比;
  
要进行基本要素分析:单片机供电正常?起振没有?复位电路正常?芯片损坏?

保护 MCU、传感器接口远离电机负载和状况快速变化的危险

机器中使用的电机大小不一,有的比手指还小,有的比卡车还大。 无论是在仪表上定位指示器,还是驱动机车,对于需要能够相当快地切换高电压和电流的控制电路来说,这些电感负载会对其造成严重破坏。

检测电机状态时同样如此。 例如,由于随着驱动器波形切换极性和负载而形成的电动势反冲,串联式电流传感器会承受巨大的尖峰和浪涌。 此外,这些电机感应数据必须实时可靠,才能实现更精确的应用,如医用输液泵和给药系统。

本文将介绍一些可用于将电机(及重电感负载)与驱动器和感应电路隔离的技术。

<strong> 时间间隙</strong>

最简单的隔离技术实际上是半隔离解决方案。 它基于这样一个事实:当继电器或接触器处于打开位置时,会形成一个与电流回路串联的气隙,具有接近无穷大的电阻。 这是一种很好的隔离形式。

简析DSP和MCU的区别和联系

<strong>一、区别 </strong>

两则的分流造成的主要原因是数字信号处理的简便性,考虑一个数字信号处理的实例,比如有限冲击响应滤波器(FIR)。用数学语言来说,FIR滤波器是做一系列的点积。取一个输入量和一个序数向量,在系数和输入样本的滑动窗口间作乘法,然后将所有的乘积加起来,形成一个输出样本。 
 
类似的运算在数字信号处理过程中大量的重复发生,使得为此设计的器件必须提供专门的支持,促进了DSP器件与通用处理器(GPP)的分流:

<strong>1、对密集乘法的支持 </strong>

SPI、I2C、UART、I2S、GPIO、SDIO、CAN,你能分清吗?

总线,总要陷进里面。这世界上的信号都一样,但是总线却成千上万,让人头疼。

总的来说,总线有三种:内部总线、系统总线和外部总线。内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片一级的互连;而系统总线是微机中各插件板与系统板之间的总线,用于插件板一级的互连;外部总线则是微机和外部设备之间的总线,微机作为一种设备,通过该总线和其他设备进行信息与数据交换,它用于设备一级的互连。

除了总线外,还有一些接口,它们是多种总线的集合体,或者说来者不拒。

<strong> SPI</strong>

SPI (Serial Peripheral Interface):MOTOROLA公司提出的同步串行总线方式。高速同步串行口。3~4线接口,收发独立、可同步进行。

MCU功能严重异常的几个常见原因

我们在从事MCU应用开发过程中,难免会碰到MCU芯片异常的问题,其中有些异常比较严重。比如异常复位,表现为复位脚有电平跳变或者干脆处于复位电平;在做代码调试跟踪时,发现代码根本就进不到用户main()程序;或者时不时就感觉芯片死掉了,功能完全不可控等。

出现类似严重异常情况的原因我大致总结了以下几方面:

1、电源问题。比方电源质量差,纹波过大,尤其开关电源供电时;或者供电芯片质量差,输出不稳定;或者系统供电能力不足而引起电源波动等。

2、时钟问题。一般表现在时钟配置错误或者时钟工作不稳定,比方配置超出芯片主频工作范围,外部时钟脆弱不堪等。

3、BOOT配置脚问题。经常遇到有人因为BOOT脚的焊接或接触不良导致各类奇怪问题。这种情况多表现在芯片功能时好时坏,工作不稳定。所谓“坏”的时候就是芯片表现得类似死机一般。

单片机控制系统抗干扰设计

单片机控制系统必须具有较高的灵敏度,但是灵敏度越高越容易把干扰引入系统中, 因此抗干扰技术己成为单片机控制系统设计时必须考虑的环节。本文分析了单片机控制系统干扰的主要来源,介绍了印制电路板中地线和电源线的布线方法,从硬件和软件两个方面阐述了抗干扰设计。这些抗干扰方法实际应用中取得了良好的效果,使一些单片机控制系统在现场成功运行。

<strong>引言</strong>

单片机组成的控制系统必须具有较高的灵敏度,灵敏度越高,更容易把干扰引入系统中。在强噪声背景下,被测信号往往被淹没,使测量无法进行。在工业现场的应用中,存在多种干扰源,它们以一种或者多种方式作用于计算机测控系统,对系统产生强烈的干扰,往往使系统的性能指标偏离设计要求,导致错误结果,因此抗干扰技术己成为单片机控制系统设计开始时就必须考虑的环节。

上电复位电路的使用策略,你清楚吗?

许多IC 都包含上电复位(POR)电路,其作用是保证在施加电源后,模拟和数字模块初始化至已知状态。基本POR功能会产生一个内部复位脉冲以避免"竞争"现象,并使器件保持静态,直至电源电压达到一个能保证正常工作的阈值。注意,此阈值电压不同于数据手册中给出的最小电源电压。一旦电源电压达到阈值电压,POR电路就会释放内部复位信号,状态机开始初始化器件。在初始化完成之前,器件应当忽略外部信号,包括传输的数据。唯一例外是复位引脚(如有),它会利用POR信号内部选通。

本文讨论了电路板上电时可能引发系统问题的一些常见问题,并说明了保证电路板正确初始化的基本原则。

POR电路可以表示为窗口比较器,如图1 所示。比较器电平VT2在电路设计期间定义,取决于器件的工作电压和制程尺寸。

单片机开发中的应掌握的几个基本技巧

在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着。现归纳出单片机开发中应掌握的几个基本技巧。

<strong>1、如何减少程序中的bug:</strong>

对于如何减少程序的bug,应该先考虑系统运行中应考虑的超范围管理参数如下。物理参数:这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。资源参数:这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。应用参数:这些应用参数常表现为一些单片机、功能单元的应用条件。过程参数:指系统运行中的有序变化的参数。

<strong>2、如何提高C语言编程代码的效率:</strong>

分析与解决单片机复位

<strong>外部复位(External Reset) </strong>

它是影响时钟模块和所有内部电路,属于同步复位,但外部Reset引脚为逻辑低电平。在引脚变为低电平后,CPU的复位控制逻辑单元确认复位状态直到Reset释放。复位控制逻辑保持复位低电平状态,在额外512个时钟周期内。因为当复位引脚为低电平时与MCU执行复位命令是相互冲突的,因此复位引脚必须保证520时间周期内低电平才能保证外部复位被外部总线辨识出来。