单片机

学习单片机的几点经验之谈

限于喜欢 提交于 2019-12-01 12:23:59
  1、学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理;   2、学习计算机硬件知识,如计算机的简单组成原理,要知道CPU、总线等的一些基本概念;   3、学习C语言的编程知识,了解结构化语言的程序设计方法,懂一些常用的算法,比如冒泡排序、中值算法等;   以上是基础,有了这些基础,学习单片机就只要花几周的时间就能上手。但学习单片机时,主要从单片机的寄存器开始,其中特殊功能寄存器是重点,学会之后,就可以学习单片机的基础部分了,主要是四个部分:单片机I/O口的使用、中断的使用、定时器的使用、片上资源的使用。这些部分都可以用软件仿真(可以用proteus软件),注意软件仿真跟实际电路存在区别,软件仿真仅仅用来验证一下功能是否实现,并不能取代实际电路。   单片机加强篇   1、可以买一块单片机开发板,结合提供的原理图和例程学习单片机的外设电路和片上资源的编程,每学习一个功能块,就要把这个功能块搞懂,切忌三天打鱼两天晒网,用学习板的弊端就是全靠自觉无人监督很容易让板子压箱底;   2、修改例程,以学习板为载体,自己新建编程工程,用自己的编程思想让外设电路实现想要的功能,程序是灵活的,每个人都有不同的编程思想,多试几种方法,提高程序的执行效率,锻炼自己的编程能力;  

从单片机到操作系统⑦——深入了解FreeRTOS的延时机制

半世苍凉 提交于 2019-12-01 10:20:50
没研究过操作系统的源码都不算学过操作系统 FreeRTOS 时间管理 时间管理包括两个方面:系统节拍以及任务延时管理。 系统节拍: 在前面的文章也讲得很多,想要系统正常运行,那么时钟节拍是必不可少的, FreeRTOS 的时钟节拍通常由 SysTick 提供,它周期性的产生定时中断,所谓的时钟节拍管理的核心就是这个定时中断的服务程序。 FreeRTOS 的时钟节拍isr中核心的工作就是调用 vTaskIncrementTick() 函数。具体见上之前的文章。 延时管理 FreeRTOS提供了两个系统延时函数: 相对延时函数 vTaskDelay() 绝对延时函数 vTaskDelayUntil() 。 这些延时函数可不像我们以前用裸机写代码的延时函数操作系统不允许CPU在死等消耗着时间,因为这样效率太低了。 同时,要告诫学操作系统的同学,千万别用裸机的思想去学操作系统。 任务延时 任务可能需要延时,两种情况,一种是任务被 vTaskDelay 或者 vTaskDelayUntil 延时,另外一种情况就是任务等待事件(比如等待某个信号量、或者某个消息队列)时候指定了 timeout (即最多等待timeout时间,如果等待的事件还没发生,则不再继续等待),在每个任务的循环中都必须要有阻塞的情况出现,否则比该任务优先级低的任务就永远无法运行。 相对延时与绝对延时的区别 相对延时

从0开始学FreeRTOS-1

若如初见. 提交于 2019-12-01 10:20:18
我们知道,(单核)单片机某一时刻只能干一件事,会造成单片机资源的浪费,而且还有可能响应不够及时,所以,在比较庞大的程序或者是要求实时性比较高的情况下,我们可以移植操作系统。因为这种情况下操作系统比裸机方便很多,效率也高。下面,杰杰将带你们走进FreeRTOS的世界随便看看。 下面正式开始本文内容。 在没有用到操作系统之前,单片机的运行是顺序执行,就是说,很多时候,单片机在执行这件事的时候,无法切换到另一件事。这就造成了资源的浪费,以及错过了突发的信号。那么,用上了操作系统的时候,很容易避免了这样的问题。 很简单,从感觉上,单片机像是同时在干多件事,为什么说像呢,因为单片机的执行速度很快,快到我们根本没办法感觉出来,但是同时做两件事是不可能的,在(单核)单片机中,因为它的硬件结构决定了CPU只能在一个时间段做一件事如: 如这张图,都是按照顺序来执行这些事的,假设每个任务(事件)的time无限小,小到我们根本没法分辨出来,那么我们也会感觉单片机在同时做这六件事。 真相就是:所有任务都好像在执行,但实际上在任何一个时刻都只有一个任务在执行 如是加上了中断系统的话,就可以将上图理解为下图: 通常把程序分为两部分:前台系统和后台系统。 简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作

从0开始学FreeRTOS-1

好久不见. 提交于 2019-12-01 10:19:26
我们知道,(单核)单片机某一时刻只能干一件事,会造成单片机资源的浪费,而且还有可能响应不够及时,所以,在比较庞大的程序或者是要求实时性比较高的情况下,我们可以移植操作系统。因为这种情况下操作系统比裸机方便很多,效率也高。下面,杰杰将带你们走进FreeRTOS的世界随便看看。 下面正式开始本文内容。 在没有用到操作系统之前,单片机的运行是顺序执行,就是说,很多时候,单片机在执行这件事的时候,无法切换到另一件事。这就造成了资源的浪费,以及错过了突发的信号。那么,用上了操作系统的时候,很容易避免了这样的问题。 很简单,从感觉上,单片机像是同时在干多件事,为什么说像呢,因为单片机的执行速度很快,快到我们根本没办法感觉出来,但是同时做两件事是不可能的,在(单核)单片机中,因为它的硬件结构决定了CPU只能在一个时间段做一件事如: ![not os](https://img2018.cnblogs.com/blog/1834930/201910/1834930-20191015203731368-1727999152.jpg) 如这张图,都是按照顺序来执行这些事的,假设每个任务(事件)的time无限小,小到我们根本没法分辨出来,那么我们也会感觉单片机在同时做这六件事。 真相就是:所有任务都好像在执行,但实际上在任何一个时刻都只有一个任务在执行 如是加上了中断系统的话,就可以将上图理解为下图: !

AVR单片机教程——EasyElectronics Library v1.2手册

醉酒当歌 提交于 2019-12-01 07:30:17
索引: bit.h delay.h pin.h wave.h pwm.h led.h rgbw.h button.h switch.h segment.h 主要更新: 添加了segment.h的文档; 新增基于中断的数码管驱动,自动完成动态扫描; 头文件与静态库文件下载: release 。 1. bit.h <bit.h> 定义了用于位操作的宏函数,适用于8或16位整数。 set_bit( r , b ) :将 r 的第 b 位置为1。 reset_bit( r , b ) :将 r 的第 b 位置为0。 read_bit( r , b ) :读取 r 的第 b 位,若为1则返回 (1 << b ) ,否则返回0。 cond_bit( c , r , b ) :若 c 为真,则将 r 的第 b 位置为1,否则置为0。 flip( r , b ):将 r 的第 b 位翻转。 clock( r , b ) :将 r 的第 b 位翻转2次。 BIT_MASK( n , b ) :宏函数,内部使用。 2. delay.h <delay.h> 定义了延时函数。 void delay(uint16_t _time ) : 延时 _time 毫秒。 3. pin.h <pin.h> 定义了引脚操作的函数。 pin_t :枚举类型,表示引脚。 PIN_NULL :表示空引脚。所有接受 pin_t

AVR单片机教程——数码管

烂漫一生 提交于 2019-12-01 07:29:52
先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低。这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存器DDRx中DDxn位控制的,可以推断出 pin_mode 函数会改变一个引脚对应的DDxn值,输入为0,输出为1,而其复位后的值为0,即输入,因此如果不把引脚配置为输出,它的模式就是输入。类似地 pin_write 函数会改变PORTxn,其值为函数的第二个参数。 所以不配置输出而写高电平的结果就是,这一引脚的DDxn为0,PORTxn为1,是带上拉电阻的输入模式。上拉电阻相当于VCC接电阻后再接在引脚上,外部电路是引脚接一个电阻再接一个LED到地,总体可以等效为LED被一个电阻限流后接在VCC和地之间,因此LED会亮。 这个电阻的阻值是上拉电阻和本来的限流电阻的阻值之和,上拉电阻是比较大的(根据datasheet P432 Figure30-164可以估算出上拉电阻约40kΩ),相比于限流电阻就是外电阻的输出高电平的情况,LED上的电流小很多,因此亮度也相应低了。 这是一个模拟电路的问题,只用数字电路的分析方法是解决不了的。这个简答的问题也反映了单片机相关知识的综合性。 今天来讲数码管,就是开发板左边那两个日字。 早期数码管也成为辉光灯,依靠气体放点发光,现在一般指7段数码管

STM32笔记--液晶显示

人盡茶涼 提交于 2019-12-01 07:10:11
前几天出去了,所以没有更新,今天是一个比较大的方面,就是液晶的显示,液晶显示器的应用为单片机带来了活力,平时我们写单片机,无法得到任何可视的现象,如IO的电平变化等,最简单的人机交互可以说是led灯和数码管灯,但其实说白了,液晶也是数据的传输,只不过是控制了比较小的灯并且以一个极快的速度更新以至于我们以为它并没有变化,由于液晶屏的种类,尺寸繁多,所以本次只讲原理,不再讲具体的液晶,笔者使用过数码管,lcd1602,oled12864和FSMC液晶(240*320),还有一种极力推荐的液晶--uart hmi液晶,淘宝上面有,有触摸版本的,因为有上位机,对于图片加载和使用都十分简单,可以说是功能强大但使用简单的一块液晶(其实我感觉就是液晶厂商自制了库文件,配合上位机,删除了人与数据的交流),也可以通过串口与单片机连接,所以推荐。好的,现在我们开始说一下显示的问题: 大部分的液晶都是如下代码格式:(只是例子) LCD_Init(); LCD_Clear(0, 0, 240, 320, BACKGROUND); LCD_DispChar(60, 60, 'A', RED); LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED); LCD_DispStr(40, 100, (uint8_t *)

单片机普通行列矩阵键盘驱动

若如初见. 提交于 2019-12-01 07:08:45
// 普通按键,行4*(列3+地1) // 1.ROW行线设置为输入上拉(下降沿中断),COL列线输出低+地; // 2.ROW行线产生中断,则说明有按键按下,启动定时器20ms做去抖动处理; // 3.定时器中检测对应的ROW行线输入电平,如果仍为低则认为有效按下,否则认为抖动; // 4.COL列线设置为输入上拉,ROW行线输出低; // 5.检测COL列线是否被拉低,如果有任意列线为低,则确定按下按键为对应的列; // 6.如果三个列线都没有被拉低,则确定按下按键为地列线; 来源: https://www.cnblogs.com/utank/p/11666589.html

STM32F105 USART1/USART3 调试笔记

孤街醉人 提交于 2019-11-30 18:15:05
由103系列向105系列移植 目录 由103系列向105系列移植 故障现象:USART1乱码 故障排除:时钟和外部晶振的适配调整 外部晶振配置 时钟配置 故障现象:USART3收发均无效 故障排除:端口重映射 STM32F103系列单片机简单易学,资源丰富,特别是库函数的存在使得开发周期缩短,故其市场占有率高。 STM32F105/107系列单片机相比103系列性能更加优异,功能也更加完善。多数单片机学习者是先学习103系列然后才转移到105/107系列,移植的一般过程是将原有的F103系列的工程通过修改能够是和F105系列单片机的运行。当然,在移植的过程中也会出现一些问题,本文记录的就是USART1/USART3的移植问题。 故障现象:USART1乱码 移植过程中出现的第一个问题是USART1乱码,这主要是因为单片机的时钟没有正确配置。我们一步一步来分析。 对于下图红色框线中的参数相信大家一定不陌生,这个参数主要是对应单片机产品线,也可以大致表征片内FLASH容量,常见的参数有STM32F10X_MD,M即medium,对应的是单片机之一是STM32F103RBT6;还有STM32F10X_HD,H即high,对应的单片机之一是STM32F103ZGT6。本例中讨论的是STM32F105RBT6,因为该单片机具有2路CAN,具有较高的性价比。我们需要把参数修改成CL