《基于构件化的嵌入式系统设计》 课件 项目4-8 利用UART实现上位机和下位机的通信- 利用CAN实现多机通信_第1页
《基于构件化的嵌入式系统设计》 课件 项目4-8 利用UART实现上位机和下位机的通信- 利用CAN实现多机通信_第2页
《基于构件化的嵌入式系统设计》 课件 项目4-8 利用UART实现上位机和下位机的通信- 利用CAN实现多机通信_第3页
《基于构件化的嵌入式系统设计》 课件 项目4-8 利用UART实现上位机和下位机的通信- 利用CAN实现多机通信_第4页
《基于构件化的嵌入式系统设计》 课件 项目4-8 利用UART实现上位机和下位机的通信- 利用CAN实现多机通信_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统设计

为了实现嵌入式系统设计的可移植和可复用,嵌入式硬件和嵌入式软件均采用构件化的设计思想,即对嵌入式硬件和嵌入式软件进行封装,供系统设计者调用,并倡导嵌入式软件分层设计的理念,以大幅度降低嵌入式技术学习难度和开发难度。

本书特色:项目任务驱动,突出学以致用,注重实践创新。每个项目且均采用了“通用知识”→“嵌入式构件设计”→“应用层程序设计”→“学以致用与创新”的学习流程。采用“搭积木”的思想,逐步提高嵌入式系统设计能力。

本书可作为高等学校电子信息类、计算机类、自动化类等专业的嵌入式系统设计教材,也可作为嵌入式技术培训教材,还可供从事嵌入式技术开发的工程技术人员参考。项目1:GPIO基础应用—实现闪灯和开关状态检测与控制功能项目2:利用定时中断实现频闪灯项目3:GPIO和定时器的综合应用—实现数码管显示、键盘测控、测温功能项目4:利用UART实现上位机和下位机的通信项目5:利用

Timer

实现PWM和输入捕获功能项目6:利用

ADC

设计简易数字电压表项目7:利用

SPI

实现多机串行通信项目8:利用

CAN

实现多机通信教

项目4利用UART实现上位机和下位机的通信【项目导读】

为了实现上位机PC和下位机MCU之间的通信,可采用UART、USB、Ethernet等多种通信方式,其中UART是最简单的一种通信方式,也是学习其他通信方式的基础。【学习目标】(1)理解UART的通用知识,包括UART硬件、UART通信的数据帧格式、数据通信的波特率和串行通信的传输方式等。(2)熟悉MCU的UART主要特性和引脚,掌握MCU的UART底层驱动构件的使用方法。(3)能够利用MCU的UART底层驱动构件头文件进行PC和MCU的串口通信应用层程序设计与测试。(4)掌握通过UART实现利用格式化输出函数(printf)向PC输出数据的方法,为今后在嵌入式软件设计中使用printf调试奠定基础。*(5)熟悉MCU的UART底层驱动构件源文件的设计方法。项目4利用UART实现上位机和下位机的通信任务4.1理解UART的通用知识

UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发器)可实现异步串行通信功能。有时还将UART称为SCI(SerialCommunicationInterface,串行通信接口),简称串口。1、UART硬件

MCU的UART通信一般只需3根线:发送线TxD、接收线RxD和地线GND。

MCU可通过TTL-USB转换器连接到PC的USB接口,在PC上安装相应的驱动软件,就可实现MCU与PC之间的串口通信。2、UART通信的数据帧格式

UART通信的特点:数据以字节为单位,按位的顺序(如最低位优先)从一条传输线上发送出去。

(1)发送1位起始位——逻辑“0”,用于通知接收方通信同步。

(2)依次发送8位数据D0~D7(低位在前、高位在后)。

(3)发送1位奇偶校验位(可选),便于接收方检测数据发送是否正确。

(4)发送1~2位停止位——逻辑“1”,用于通知接收方该帧数据已发送完成。

若发送方无数据发送,则通信线路上保持空闲状态——逻辑“1”。若发送方发送下一个UART数据帧,则要重新发送起始位,然后发送一字节的新数据。任务4.1理解UART的通用知识3、数据通信的波特率

波特率:每秒钟传输二进制数码的位数,单位是bit/s。波特率越高,数据传输的速度就越快。只有通信双方的波特率相同时才可以正常通信。

串口通信常用的波特率:1200、1800、2400、4800、9600、19200、38400、57600、115200等(bit/s)。4、串行通信的传输方式

(3)半双工通信:通信双方双向传输信息,但在任何时刻,只能由一方发送数据,另一方接收数据,不能同时收发。如,对讲机通信。

(2)全双工通信:通信双方双向传输信息,且可以同时发送和接收。如,手机通信。一般情况下,MCU的UART通信接口均是全双工的。

(1)单工通信:通信的发送方与接收方,单向传输信息。如,无线电广播、有线电视广播。

任务4.1理解UART的通用知识5、MCU的UART内部结构及编程模型将8位串行数据转换为1字节的并行数据用于存放接收的数据将1字节的并行数据转换为8位串行数据用于存放待发送的数据用于判断是否接收到数据、数据是否发送完成等用于设置数据帧格式(8位或9位数据)、是否校验、是否允许中断等用于设置UART通信波特率任务4.1理解UART的通用知识【知识巩固】

(1)MCU的UART通信一般需要几根线?分别是什么?

(2)画出UART通信的数据帧格式示意图。

(3)串行通信速率是否越高越好?

(4)串行通信有哪些传输方式?任务4.2掌握MCU的UART底层驱动构件使用方法4.2.1MCU的UART主要特性和引脚

STM32F103C8T6中有

3个

USART模块:USART1、USART2和USART3。既支持全双工通信,也支持同步单向通信和半双工单线通信。利用分数波特率发生器提供宽范围的波特率选择,波特率最高可达4.5Mbit/s。

UART发送数据引脚为UART_TX,接收数据引脚为UART_RX。UART1使用的引脚,见

uart.h中的宏定义任务4.2掌握MCU的UART底层驱动构件使用方法4.2.2MCU的UART底层驱动构件的组成及使用方法

UART具有初始化、发送和接收三种基本操作。其中,UART发送是主动任务,不必采用中断方式;而UART接收是被动任务,为了确保及时接收到对方发送来的每帧数据,一般采用中断方式。

UART底层驱动构件由uart.h头文件和uart.c源文件组成,若要使用UART底层驱动构件,只需将这两个文件添加到所建工程的04_Driver(MCU底层驱动构件)文件夹中,即可实现对UART的操作。见工程文件:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx

其中,uart.h头文件主要包括相关头文件的包含、一些必要的宏定义、对外接口函数的声明,而uart.c源文件则是对外接口函数的具体实现,初学者不必深究。

用户只要熟悉uart.h头文件的内容,即可使用UART底层驱动构件进行编程。任务4.2掌握MCU的UART底层驱动构件使用方法4.2.2MCU的UART底层驱动构件的组成及使用方法【学以致用】

根据uart.h头文件,写出实现下列功能的函数调用语句。

(1)初始化UART1,波特率为9600bit/s。

(2)通过UART1发送1个字符'A'。

(3)通过UART1发送保存在数组str中的字符串"ABCDEFG"。

(4)使能UART1接收中断。

(5)通过UART1接收1个字符,将其保存至变量re_data中,并将接收标志保存至变量re_flag中。任务4.3UART通信应用层程序设计与功能测试4.3.1UART通信的应用层程序设计

在嵌入式软件最小系统框架下,设计07_Source(应用层软件构件)的文件,以实现:上位机PC

下位机MCU之间的串口通信。1)工程总头文件includes.h:包含04、05、06文件夹中的头文件2)主程序源文件main.c:

定义字符数组(存放待发送的字符型数据);

初始化;使能UART接收中断;

在主循环中,MCU通过UART使用发送函数向PC发送数据在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx【思路总结】请画出上述程序的设计和执行流程图。3)中断服务程序源文件isr.c:在UART接收中断服务程序中,MCU使用UART接收函数

接收PC发来的数据,并向PC回送接收到的字符任务4.3UART通信应用层程序设计与功能测试4.3.2UART通信的测试方法

(1)将USB-TTL转换器TTL端的RX、TX、GND端子分别与MCU的TX、RX、GND引脚(参照uart.h中的引脚宏定义)相连接,将USB-TTL转换器的USB端与PC的USB接口连接;

(2)打开PC串口调试软件,打开串口,并且设置与MCU的UART相同的波特率;

(3)运行MCU程序,通过PC串口调试窗口查看MCU发送给PC的信息;

(4)在PC串口调试窗口中写入字符或字符串并发送给MCU,在串口调试窗口中查看是否有MCU回送到PC的信息;

(5)调试结束后,先在PC串口调试软件中关闭串口,然后将USB-TTL转换器从PC的USB接口断开。任务4.3UART通信应用层程序设计与功能测试【学以致用与创新】

当通过PC串口调试窗口向MCU发送不同的字符时,可改变项目1中不同小灯的状态。任务4.3UART通信应用层程序设计与功能测试4.3.3使用printf函数输出数据1、通过UART使用

printf

函数的方法

使用printf函数时,需要将printf软件构件对应的printf.h头文件和printf.c源文件添加到所建工程的06_Soft(通用软件构件)文件夹中。

在printf.h头文件中,添加了以下两条预处理命令:

2、printf函数的调用形式:printf(格式控制字符串,输出列表)(1)格式控制字符串:由双撇号括起来的一个字符串,它包含两种信息。

①由%开头的格式符,用于指定数据的输出格式。例如,%d:以十进制形式输出带符号整数;%c:输出单个字符;%x:以十六进制形式输出无符号整数;%s:输出字符串;%f:以小数形式输出实数;%e:以指数形式输出实数。②原样输出的字符,在显示中起提示作用。(2)输出列表:是需要输出的一些数据,可以是常量、变量或表达式。

多个数据之间要用逗号隔开。

任务4.3UART通信应用层程序设计与功能测试4.3.3使用printf函数输出数据3、通过UART使用printf函数输出数据的应用层程序设计1)工程总头文件includes.h:包含04、05、06文件夹中的头文件2)主程序源文件main.c:

定义局部变量(存放待发送的数据);

初始化;MCU通过UART使用printf函数向PC发送数据在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx【学以致用与创新】

(1)使用printf函数替代上节所给出的文件main.c和isr.c中的UART发送函数,以实现相同的实验效果。

(2)使用printf函数输出常见数据类型(char、shortint、int、longint、float、double)在KeilMDK编译系统中的字节数。

嵌入式系统设计

为了实现嵌入式系统设计的可移植和可复用,嵌入式硬件和嵌入式软件均采用构件化的设计思想,即对嵌入式硬件和嵌入式软件进行封装,供系统设计者调用,并倡导嵌入式软件分层设计的理念,以大幅度降低嵌入式技术学习难度和开发难度。

本书特色:项目任务驱动,突出学以致用,注重实践创新。每个项目且均采用了“通用知识”→“嵌入式构件设计”→“应用层程序设计”→“学以致用与创新”的学习流程。采用“搭积木”的思想,逐步提高嵌入式系统设计能力。

本书可作为高等学校电子信息类、计算机类、自动化类等专业的嵌入式系统设计教材,也可作为嵌入式技术培训教材,还可供从事嵌入式技术开发的工程技术人员参考。项目1:GPIO基础应用—实现闪灯和开关状态检测与控制功能项目2:利用定时中断实现频闪灯项目3:GPIO和定时器的综合应用—实现数码管显示、键盘测控、测温功能项目4:利用UART实现上位机和下位机的通信项目5:利用Timer实现PWM和输入捕获功能项目6:利用

ADC

设计简易数字电压表项目7:利用

SPI

实现多机串行通信项目8:利用

CAN

实现多机通信教

项目5利用Timer实现PWM和输入捕获功能【项目导读】

在项目2中已学习STM32F103C8T6中的16位定时器(Timer)的基本定时功能。在本项目中学习利用Timer实现PWM功能和输入捕获功能。

脉宽调制(PulseWidthModulation,PWM)信号是一个高电平和低电平重复交替的输出信号,PWM广泛应用于电机转速控制、灯光亮度控制等领域。输入捕获(InputCapture)可用于测量脉冲信号的周期和脉宽。【学习目标】1)理解PWM的通用知识,包括PWM的相关概念、技术指标及应用场合。2)理解输入捕获的通用知识,包括输入捕获的过程、原理及应用场合。3)熟悉MCU的Timer通道引脚,掌握MCU的PWM和输入捕获底层驱动构件的使用方法,能利用其底层驱动构件头文件进行PWM功能和输入捕获功能的应用层程序设计,能利用PWM控制小灯的亮度、利用输入捕获测量脉冲信号的周期和脉宽。*4)熟悉MCU的PWM和输入捕获底层驱动构件源文件的设计方法。项目5利用Timer实现PWM和输入捕获功能任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识1、

PWM的基本概念与技术指标

PWM信号是一个高电平和低电平重复交替的输出信号。

目前经常使用的PWM信号主要是通过MCU编程实现的。利用MCU输出PWM信号时,需要一个产生PWM信号的时钟源,设其周期为TCLK。任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识1、

PWM的基本概念与技术指标(1)周期:持续的时钟周期个数。

TPWM=8

TCLK

图(a):2

TCLK

图(b):4

TCLK

图(c):6

TCLK(3)占空比:脉宽/周期,百分比

(2)脉宽:一个PWM周期内PWM信号

处于高电平的时间。

图(a):25%

图(b):50%

图(c):75%任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识1、

PWM的基本概念与技术指标(4)极性:决定了PWM信号的有效电平

正极性:PWM信号的有效电平为高电平,平时电平(空闲电平)为低电平;

负极性:PWM信号的有效电平为低电平,平时电平(空闲电平)为高电平。(5)分辨率△T

:PWM脉宽的最小时间增量,等于计数时钟周期。

脉冲宽度的增加与减少只能是△T的整数倍。

任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识1、

PWM的基本概念与技术指标(6)对齐方式——边沿对齐

向上单向计数初值

IN=0模值

MOD=7通道值CnV=4PWM周期=(MOD-IN+1)×TCLKPWM脉宽=(CnV-IN)×TCLK任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识1、

PWM的基本概念与技术指标(6)对齐方式——中心对齐

向上/向下双向计数初值

IN=0模值

MOD=4通道值CnV=2PWM周期=2×(MOD-IN)×TCLKPWM脉宽=2×(CnV-IN)×TCLK任务5.1理解PWM和输入捕获的通用知识5.1.1PWM的通用知识2、

PWM的应用场合

(1)利用PWM为其他设备产生类似于时钟的信号。例如,PWM可用来控制灯以一定的频率闪烁。

(2)利用PWM控制输入到某个设备的平均电流或电压。例如,PWM可用来控制直流电动机转速。

(3)利用PWM控制命令字编码。例如,用不同的脉宽代表不同的命令,控制无线遥控车做不同的动作(左转、右转、前进等)。任务5.1理解PWM和输入捕获的通用知识

【知识巩固】

(1)PWM涉及哪些基本概念和技术指标?

(2)PWM有哪些主要用途?5.1.1PWM的通用知识5.1.2输入捕获的通用知识任务5.1理解PWM和输入捕获的通用知识

MCU的定时/计数器的通道引脚在捕获到外部脉冲信号的沿跳变(上升沿或下降沿)时,会将计数器的当前值锁存到对应的通道值寄存器;若允许输入捕获中断(通道中断),则可在中断服务程序中通过读取通道值寄存器的值得到沿跳变对应的时刻。

脉冲信号的周期

=

时刻3-时刻1=时刻4-时刻2

脉冲信号的脉宽

=时刻2-时刻1=时刻4-时刻3

当被测脉冲信号的周期或脉宽小于定时器的溢出周期时:脉冲信号的周期或脉宽=对应的计数次数*计数周期

=对应的计数次数/计数频率【知识巩固】简述利用输入捕获测量脉冲信号的周期和脉宽的基本原理。

任务5.2掌握Timer_PWM_INCAP底层驱动构件使用方法5.2.1MCU的Timer通道引脚

每个Timer的4个通道引脚有不同的组合,具体由复用功能I/O引脚的配置决定,其实现请参阅后续底层驱动构件头文件中的宏定义。5.2.2Timer_PWM_INCAP底层驱动构件的组成及使用方法

Timer_PWM_INCAP底层驱动构件由timer_pwm_incap.h头文件和timer_pwm_incap.c源文件组成,若要使用Timer_PWM_INCAP底层驱动构件,只需将这两个文件添加到所建工程的04_Driver(MCU底层驱动构件)文件夹中,即可实现对PWM功能和输入捕获功能的操作。见工程文件:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx

其中,timer_pwm_incap.h头文件主要包括相关头文件的包含、一些必要的宏定义、对外接口函数的声明,而timer_pwm_incap.c源文件则是对外接口函数的具体实现,初学者不必深究。

用户只要熟悉timer_pwm_incap.h头文件的内容,即可使用Timer_PWM_INCAP底层驱动构件进行编程。任务5.2掌握Timer_PWM_INCAP底层驱动构件使用方法【学以致用】

根据

timer_pwm_incap.h头文件,写出实现下列功能的函数调用语句。

(1)初始化TIMER1_CH1通道PWM,正极性、边沿对齐、周期为1000us、占空比为30%。

(2)将TIMER1_CH1通道的PWM输出占空比更新为50%。

(3)初始化TIMER2_CH1通道为输入捕获功能,并采用上升沿捕获。

(4)为TIMER2_CH1通道选择为下降沿捕获方式。

(5)将TIMER2_CH1通道的输入捕获值保存至变量cap_value中。

(6)使能TIMER2_CH1通道中断。5.2.2Timer_PWM_INCAP底层驱动构件的组成及使用方法任务5.2掌握Timer_PWM_INCAP底层驱动构件使用方法任务5.3利用PWM控制小灯的亮度

在嵌入式软件最小系统框架下,设计07_Source(应用层软件构件)的文件,以实现:利用PWM控制与PWM通道引脚相连接的小灯的亮度。1)工程总头文件includes.h:

包含04、05、06文件夹中的头文件2)主程序源文件main.c:

初始化(PWM)在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx【学以致用与创新】

(1)利用PWM实现频闪灯。

(2)利用PWM控制小灯逐渐变亮。任务5.4利用输入捕获测量脉冲信号的周期和脉宽

在嵌入式软件最小系统框架下,设计07_Source(应用层软件构件)的文件,以实现:利用Timer的输入捕获功能(采用通道中断方式)测量PWM信号的周期和脉宽,并通过UART使用printf函数向PC串口调试窗口输出对应的测量信息。1)工程总头文件includes.h:

包含04、05、06文件夹中的头文件2)主程序源文件main.c:

定义全局变量(存放脉冲信号的周期和脉宽对应的计数次数)

在主程序中,初始化(UART、PWM、INCAP);

使能Timer通道中断;

在主循环中,输出全局变量的值(周期和脉宽对应的计数次数)在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx3)中断服务程序源文件isr.c:声明全局变量

在Timer通道中断服务程序中,获取通道捕获值,计算并

更新全局变量的值(脉冲信号周期和脉宽对应的计数次数)任务5.4利用输入捕获测量脉冲信号的周期和脉宽【学以致用与创新】

(1)根据脉冲信号的输入捕获原理,画出上述程序的设计和执行流程图,理解上述中断服务程序。

(2)计算并输出脉冲信号的周期和脉宽。

嵌入式系统设计

为了实现嵌入式系统设计的可移植和可复用,嵌入式硬件和嵌入式软件均采用构件化的设计思想,即对嵌入式硬件和嵌入式软件进行封装,供系统设计者调用,并倡导嵌入式软件分层设计的理念,以大幅度降低嵌入式技术学习难度和开发难度。

本书特色:项目任务驱动,突出学以致用,注重实践创新。每个项目且均采用了“通用知识”→“嵌入式构件设计”→“应用层程序设计”→“学以致用与创新”的学习流程。采用“搭积木”的思想,逐步提高嵌入式系统设计能力。

本书可作为高等学校电子信息类、计算机类、自动化类等专业的嵌入式系统设计教材,也可作为嵌入式技术培训教材,还可供从事嵌入式技术开发的工程技术人员参考。项目1:GPIO基础应用—实现闪灯和开关状态检测与控制功能项目2:利用定时中断实现频闪灯项目3:GPIO和定时器的综合应用—实现数码管显示、键盘测控、测温功能项目4:利用UART实现上位机和下位机的通信项目5:利用Timer实现PWM和输入捕获功能项目6:利用ADC设计简易数字电压表项目7:利用

SPI

实现多机串行通信项目8:利用

CAN

实现多机通信教

项目6利用ADC设计简易数字电压表【项目导读】

在嵌入式测控系统中,往往需要通过ADC(AnalogtoDigitalConverter,模/数转换器)将模拟输入量转换为数字量,以供MCU接收和处理。

【学习目标】(1)理解ADC的通用知识,包括ADC的相关概念和最简单的A/D转换采样电路。(2)熟悉MCU的ADC主要特性和引脚,掌握MCU的ADC底层驱动构件的使用方法。(3)掌握简易数字电压表的硬件电路组成和工作原理,以及利用MCU的ADC底层驱动构件头文件进行ADC应用层程序设计的方法。*(4)熟悉MCU的ADC底层驱动构件源文件的设计方法。任务6.1理解ADC的通用知识1、

ADC的相关概念(1)转换精度

设ADC的二进制位数为n,则其分辨率为1/2n。例如,某一ADC是12位,若模拟输入信号的量程为5V,则该ADC可以检测到的模拟量变化最小值(理论上的转换精度)为

5V/212

1.22mV。任务6.1理解ADC的通用知识1、

ADC的相关概念(2)转换速度

完成一次A/D转换所要花费的时间。(3)单端输入与差分输入

单端输入:只有一个输入引脚,使用公共地GND作为参考电平。输入电路简单,但A/D转换值易因受到干扰而变化。

差分输入:两个输入引脚(VIN+、VIN-),ADC的采样值是两个输入引脚的电平差值,从而降低了干扰。任务6.1理解ADC的通用知识1、

ADC的相关概念(4)ADC参考电压

A/D转换需要一个参考电压VREF。在一般要求下,ADC参考电压使用芯片的供电电源电压。在更为精确的要求下,ADC参考电压使用单独电源。(5)软件滤波

为了使采样的数据更准确,必须对采样的数据进行筛选,去掉误差较大的数据(毛刺)。可通过中值滤波或均值滤波实现。(6)物理量回归

在得到稳定的A/D采样值以后,还需要把A/D采样值与实际物理量对应起来。

例如,利用MCU采集室内温度,经A/D转换后的数值是126,实际它代表的温度是多少?光敏电阻或热敏电阻

例如:采样电路任务6.1理解ADC的通用知识2、

MCU的ADC内部结构及编程模型任务6.1理解ADC的通用知识

【知识巩固】

(1)ADC有哪些基本概念?

(2)软件滤波的作用是什么?任务6.2掌握MCU的ADC底层驱动构件使用方法6.2.1MCU的ADC主要特性和引脚

STM32F103C8T6具有两个12位的ADC模块:ADC1和ADC2,均具有10个外部模拟输入通道(通道共用),采用单端输入方式。

供电电压VDDA为2.4~3.6V,芯片内部已将参考电压VREF+连接到VDDA,VREF-连接到VSSA,因此各模拟通道的输入电压范围为0~VDDA。

输入时钟不得超过14MHz。ADC转换时间≥14个ADC时钟周期,微妙级。6.2.2MCU的ADC底层驱动构件的组成及使用方法

ADC底层驱动构件由adc.h头文件和adc.c源文件组成,若要使用ADC底层驱动构件,只需将这两个文件添加到所建工程的04_Driver(MCU底层驱动构件)文件夹中,即可实现对ADC的操作。见工程文件:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx

其中,adc.h头文件主要包括相关头文件的包含、一些必要的宏定义、对外接口函数的声明,而adc.c源文件则是对外接口函数的具体实现,初学者不必深究。

用户只要熟悉adc.h头文件的内容,即可使用ADC底层驱动构件进行编程。任务6.2掌握MCU的ADC底层驱动构件使用方法

【学以致用】

根据

adc.h头文件,写出实现下列功能的函数调用语句。

(1)对ADC1模块进行初始化。

(2)获取ADC1通道8的A/D转换值。6.3.1

简易数字电压表的硬件电路组成和工作原理任务6.3简易数字电压表的设计

MCU通过ADC对A端的模拟电压进行A/D转换,根据A/D转换结果可计算出A端对应的电压值:ADCresult

:A/D转换结果对应的十进制数n:ADC的位数VCC的具体电压值可用万用表测量出来

【知识巩固】

写出电路的工作原理。电位器10kΩ

在嵌入式软件最小系统框架下,设计07_Source(应用层软件构件)的文件,以实现:通过UART使用printf函数向PC串口调试窗口输出A/D转换结果和对应的电压值。1)工程总头文件includes.h:

包含04、05、06文件夹中的头文件2)主程序源文件main.c:

定义局部变量(存放A/D转换结果和对应的电压值);

初始化(UART、ADC);

在主循环中,启动A/D转换,并输出信息(A/D转换结果

和对应的电压值)在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx6.3.2

简易数字电压表的应用层程序设计任务6.3简易数字电压表的设计

系统测试时,将电位器A端引脚与ADC通道引脚相连,转动电位器的转柄,观察PC串口调试窗口输出的A/D转换结果变化情况。【学以致用与创新】

(1)结合项目3中的TM1637_LED_KB软件构件及数码管显示程序,改用数码管显示对应的信息。

(2)利用printf函数输出多个ADC通道的信息。

(3)利用printf函数输出一个ADC通道的多次采样值软件滤波的结果。

6.3.2

简易数字电压表的应用层程序设计任务6.3简易数字电压表的设计

嵌入式系统设计

为了实现嵌入式系统设计的可移植和可复用,嵌入式硬件和嵌入式软件均采用构件化的设计思想,即对嵌入式硬件和嵌入式软件进行封装,供系统设计者调用,并倡导嵌入式软件分层设计的理念,以大幅度降低嵌入式技术学习难度和开发难度。

本书特色:项目任务驱动,突出学以致用,注重实践创新。每个项目且均采用了“通用知识”→“嵌入式构件设计”→“应用层程序设计”→“学以致用与创新”的学习流程。采用“搭积木”的思想,逐步提高嵌入式系统设计能力。

本书可作为高等学校电子信息类、计算机类、自动化类等专业的嵌入式系统设计教材,也可作为嵌入式技术培训教材,还可供从事嵌入式技术开发的工程技术人员参考。项目1:GPIO基础应用—实现闪灯和开关状态检测与控制功能项目2:利用定时中断实现频闪灯项目3:GPIO和定时器的综合应用—实现数码管显示、键盘测控、测温功能项目4:利用UART实现上位机和下位机的通信项目5:利用

Timer

实现PWM和输入捕获功能项目6:利用

ADC

设计简易数字电压表项目7:利用SPI实现多机串行通信项目8:利用

CAN

实现多机通信教

项目7利用SPI实现多机串行通信【项目导读】

SPI(SerialPeripheralInterface,串行外设接口)是同步串行总线接口,已经成为一种工业标准。通过SPI,可以实现多个MCU之间的串行通信,也可以实现MCU与其他带有SPI接口的外部器件(如A/D转换器、D/A转换器、LCD、OLED等)之间的串行通信。【学习目标】(1)理解SPI的通用知识,包括SPI的相关概念、SPI的通信过程与通信时序。(2)熟悉MCU的SPI主要特性和引脚,掌握MCU的SPI底层驱动构件的使用方法。(3)能够利用MCU的SPI底层驱动构件头文件进行SPI多机通信的应用层程序设计与测试。*(4)熟悉MCU的SPI底层驱动构件源文件的设计方法。任务7.1理解SPI的通用知识7.1.1SPI的相关概念

在SPI应用系统中,负责启动SPI通信和产生SPI时钟信号的器件是主器件,其他器件是从器件。SPI可以工作于单主单从、一主多从或多主方式,其中最常用的SPI单主单从全双工通信应用系统如图所示。

MISO(MasterInputSlaveOutput):主输入/从输出数据。

MOSI(MasterOutputSlaveInput):主输出/从输入数据。

SCK(SerialClock):由主器件产生和输出串行时钟。通信速率由主器件控制,在主器件启动一次数据传送的过程中,在SCK引脚输出自动产生的8个时钟周期信号,SCK信号的一个跳变进行一位数据移位传输。

NSS(SlaveSelect):从器件选择引脚,低电平有效。作为主器件,其NSS引脚置为高电平。作为从器件,其NSS引脚置为低电平,表示主器件选中了该从器件。任务7.1理解SPI的通用知识7.1.2SPI的通信过程与通信时序

时钟信号涉及时钟极性和时钟相位的问题,时钟极性决定了当没有数据传输(空闲)时,时钟信号SCK的空闲状态电平是高电平还是低电平。时钟相位决定了在时钟信号SCK的第1个边沿或第2个边沿捕获和锁存数据。图7-2给出了CPOL和CPHA的4种组合对应的SPI通信时序。

注意:SPI主器件和从器件必须使用相同的时钟极性和时钟相位,才能正常通信。

【知识巩固】

(1)SPI通信涉及几个引脚?分别代表什么含义?

(2)如何区分SPI主器件和从器件?任务7.1理解SPI的通用知识任务7.2掌握MCU的SPI底层驱动构件使用方法7.2.1MCU的SPI主要特性和引脚

STM32F103C8T6中有

2个SPI模块:SPI1和SPI2。既支持全双工通信,也支持半双工通信和单工通信。支持单主单从、一主多从和多主通信方式。可选择4种不同的时钟极性和时钟相位组合。支持SPI软件设置NSS引脚电平,设置主从模式。SPI1使用的引脚,见

spi.h中的宏定义任务7.2掌握MCU的SPI底层驱动构件使用方法7.2.2MCU的SPI底层驱动构件的组成及使用方法SPI具有初始化、发送和接收三种基本操作。其中,SPI发送是主动任务,不必采用中断方式;而SPI接收是被动任务,为了确保及时接收到对方发送来的每帧数据,一般采用中断方式。

SPI底层驱动构件由spi.h头文件和spi.c源文件组成,若要使用SPI底层驱动构件,只需将这两个文件添加到所建工程的04_Driver(MCU底层驱动构件)文件夹中,即可实现对SPI的操作。见工程文件:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx

其中,spi.h头文件主要包括相关头文件的包含、一些必要的宏定义、对外接口函数的声明,而spi.c源文件则是对外接口函数的具体实现,初学者不必深究。

用户只要熟悉spi.h头文件的内容,即可使用SPI底层驱动构件进行编程。【学以致用】

根据spi.h头文件,写出实现下列功能的函数调用语句。

(1)将SPI1初始化主模式,波特率为1000kbit/s。

(2)通过SPI1发送1个字符'A'。

(3)通过SPI1发送保存在数组str中的字符串"ABCDEFG"。

(4)使能SPI2接收中断。

(5)通过SPI2接收1个字符,将其保存至变量re_data中,并将接收标志保存至变量re_flag中。任务7.2掌握MCU的SPI底层驱动构件使用方法7.2.2MCU的SPI底层驱动构件的组成及使用方法任务7.3SPI多机通信的应用层程序设计

用同一个STM32F103C8T6芯片中的SPI1(作为主器件)和SPI2(作为从器件),在嵌入式软件最小系统框架下,设计07_Source(应用层软件构件)的文件,以实现:SPI1向SPI2发送数据,SPI2接收数据并通过UART将接收到的数据发送至PC显示。1)工程总头文件includes.h:

包含04、05、06文件夹中的头文件2)主程序源文件main.c:

定义字符数组(存放待发送的字符型数据);

初始化(UART、SPI);使能SPI2接收中断;

在主循环中,SPI1通过SPI发送函数向SPI2发送数据在工程文件中分析代码并编程:..EmbeddedSource\03-Software\STM32F103\STM32F103.uvprojx【思路总结】请画出上述程序的设计和执行流程图。3)中断服务程序源文件isr.c:在SPI2接收中断服务程序中,通过SPI接收函数接收由

SPI1发来的数据,并通过UART将其发送至PC显示

【学以致用与创新】实现两个MCU之间的SPI通信功能,其中一个MCU作为SPI主器件,而另一个MCU作为SPI从器件。

嵌入式系统设计

为了实现嵌入式系统设计的可移植和可复用,嵌入式硬件和嵌入式软件均采用构件化的设计思想,即对嵌入式硬件和嵌入式软件进行封装,供系统设计者调用,并倡导嵌入式软件分层设计的理念,以大幅度降低嵌入式技术学习难度和开发难度。

本书特色:项目任务驱动,突出学以致用,注重实践创新。每个项目且均采用了“通用知识”→“嵌入式构件设计”→“应用层程序设计”→“学以致用与创新”的学习流程。采用“搭积木”的思想,逐步提高嵌入式系统设计能力。

本书可作为高等学校电子信息类、计算机类、自动化类等专业的嵌入式系统设计教材,也可作为嵌入式技术培训教材,还可供从事嵌入式技术开发的工程技术人员参考。项目1:GPIO基础应用—实现闪灯和开关状态检测与控制功能项目2:利用定时中断实现频闪灯项目3:GPIO和定时器的综合应用—实现数码管显示、键盘测控、测温功能项目4:利用UART实现上位机和下位机的通信项目5:利用

Timer

实现PWM和输入捕获功能项目6:利用

ADC

设计简易数字电压表项目7:利用SPI实现多机串行通信项目8:利用CAN实现多机通信教

项目8利用CAN实现多机通信【项目导读】

CAN(ControllerAreaNetwork,控制器局域网)是德国Bosch公司针对汽车电子领域开发的具有国际标准的现场总线,由于CAN具有很强的可靠性、安全性和实时性,目前CAN广泛应用于汽车电子、工业控制、农业控制、机电产品等领域的分布式测控系统中。利用CAN可以很方便地实现多机联网。【学习目标】(1)理解CAN的通用知识,包括CAN的相关概念、硬件结构、通信原理和优点。(2)熟悉MCU的CAN主要特性和引脚,掌握MCU的CAN底层驱动构件的使用方法。(3)能够利用MCU的CAN底层驱动构件头文件进行多机之间的CAN应用层程序设计,并掌握CAN通信功能测试方法。*(4)熟悉MCU的CAN底层驱动构件源文件的设计方法。任务8.1

理解CAN的通用知识8.1.1CAN系统的总体构成和CAN节点的硬件结构120Ω120Ω负载电阻(终端电阻)的作用是防止反射波干扰CAN系统主要由若干个节点、两条数据传输线(CAN-H和CAN-L)及负载电阻组成。1、CAN系统的总体构成任务8.1

理解CAN的通用知识8.1.1CAN系统的总体构成和CAN节点的硬件结构2、CAN节点的硬件结构CAN节点的硬件结构主要由传感器、MCU、CAN控制器、CAN收发器、执行器组成。任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理1、CAN的网络结构:CAN控制器硬件实现CAN收发器硬件实现

CAN应用系统软件设计的主要任务是对其应用层程序进行设计应用层、数据链路层、物理层——实时性强任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理2、CAN的数据传输流程数据打包并/串转换数字信号→电压信号边说边听电压信号→数字信号验收过滤串/并转换数据解包ID

+长度+相关数据CRC应答信号任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理3、CAN总线电压信号与数字信号之间的关系CAN收发器11位以上的隐性位:空闲CAN-H与CAN-L的电压值具有何特点?任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理4、CAN的帧ID、数据优先级、数据的仲裁

CAN为多主工作方式,任一节点均可在任意时刻主动地向CAN总线上发送数据,而不分主从。

若有多个节点同时向CAN总线上发送数据,那么在CAN系统中是如何实现数据的仲裁(决定哪个数据先发,哪个数据后发)?——需要先理解帧ID和数据优先级的关系

节点发送的数据包实时性要求越高,优先级越高,对应的帧ID就越小。

原理:当多个节点同时向总线上发送数据时,总线上的结果是这多个数据“逻辑与”的值。节点A发送数据:

0节点B发送数据:

10—显性位1—隐性位0优先级高!总线上显示数据:

0在实际应用时,应该按照数据包的优先级,给每个数据包分配一个唯一的ID。注意:CAN协议要求ID的高7位不能同时为1。任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理4、CAN的帧ID、数据优先级、数据的仲裁

当一个节点向CAN总线上发送数据包时,首先向总线上发送自己的帧ID。

在发送帧ID的过程中,如果一个节点向总线上发送的数据和从总线上接收到的数据一致,那么该节点就可以继续向总线上发送数据;否则,该节点就要停止向总线上发送数据。

3个节点通过帧ID进行优先级竞争的结果:节点1首先获得总线使用权;在节点1将其数据包发送完毕后,若总线处于空闲状态,则系统会自动使节点2和节点3继续通过发送帧ID重新竞争总线的使用权(自动重发)。

在仲裁过程中,不会出现不同优先级数据包之间的相互破坏——“非破坏性仲裁”。【学以致用】CAN通信优先级分析及应用。任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理5、CAN验收过滤功能的实现【学以致用】

表8-1:CAN验收过滤应用分析。过滤器标识符寄存器:100101102

过滤器掩码寄存器:

-----

有关有关发送:101+数据A??接收放弃接收接收

放弃接收发送:102+数据A发送:***+数据A

过滤器掩码寄存器:

-----

无关无关例:三个节点:A(发送)、B(接收)、C(接收)

节点A节点B节点CCAN-BUS

帧ID过滤器掩码寄存器:

无关

-----

-----?接收过滤器标识符寄存器:100101102例:三个节点:A(接收)、B(发送)、C(发送)

节点A节点B节点CCAN-BUS发送:***+数据B

帧ID发送:***+数据C

帧ID

通过CAN控制器中过滤器的标识符寄存器和掩码寄存器实现。——点对点、一点对多点(广播式)、多点对一点任务8.1

理解CAN的通用知识8.1.2CAN的网络通信原理6、CAN数据帧的组成

在CAN节点之间的通信中,若将数据从一个节点的发送器传输到另一个节点的接收器,则必须发送数据帧。发送方:写1接收方正确接收:写0总线值:0由CAN控制器硬件自动处理帧内应答实时性强由CAN控制器硬件自动完成有效数据:0~8字节,由用户通过编程设定主要包括有效数据的长度,由用户通过编程设定:0~8字节

主要包括帧ID和远程发送请求位(RTR),由用户通过编程设定。

由CAN控制器硬件自动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论