硬件工程实践报告Word文件下载.docx
- 文档编号:18430062
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:16
- 大小:465.84KB
硬件工程实践报告Word文件下载.docx
《硬件工程实践报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《硬件工程实践报告Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
STM32F103RCT6LQFP64FLASH:
256KSRAM:
48K
USB数据线
NOTEBOOK:
ASUSA85VDOS:
Windows8.1Prox64
软件部分
编译环境:
KEILMDK-ARMVersion5.10
STM32F10xStandardPeripheralsLibrary(标准外设库)
STMISP下载器:
MCUISP
串口调试助手:
XCOMV2.0
文档部分
参考文档:
[1]《STM32不完全手册-库函数版本_V3.0》
[2]《STM32中文参考手册_V10》
外部链接:
Series-STMicroelectronics)manual
STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xxand
STM32F107xxadvancedARM®
-based32-bitMCUs)
http:
//en.wikipedia.org/wiki/STM32(维基百科,STM32)
一、串口实验
根据实验要求,在KEIL编译环境下编写程序,生成*.HEX文件;
通过STMISP下载器(MCUISP)将程序下载到STM32开发板中,运行程序;
使用USB数据线连接STM32开发板上的USB_232接口,通过串口调试助手(XCOMV2.0)发送指令字符串‘1’,使得STM32开发板上的指示灯DS0亮(红灯),发送指令字符串‘0’,使得STM32开发板上的指示灯DS0熄灭;
1.安装及配置KEIL(MDK-ARMVersion5.10)软件;
2.参考《STM32不完全手册-库函数版本_V3.0》第三篇-第八章-串口实验;
2.1STM32串口简介
串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。
现在基本上所有的MCU都会带有串口,STM32自然也不例外。
串口设置的一般步骤可以总结为如下几个步骤:
1)串口时钟使能,GPIO时钟使能
2)串口复位
3)GPIO端口模式设置
4)串口参数初始化
5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
6)使能串口
7)编写中断处理函数
(具体参考《STM32中文参考手册_V10》第25章-通用同步异步收发器(USART))
3.以“标准例程-V3.5库函数版本-ALIENTEKMINISTM32实验3串口实验”中的程序源码作为参考(原程序实现如下功能:
STM32通过串口和上位机的对话,STM32在收到上位机发过来的字符串后,原原本本的返回给上位机),打开程序源码目录下的工程文件(USART.uvproj),然后在KEIL编译环境下修改SYSTEM目录下的<
usart.c>
文件以及USER目录下的<
main.c>
文件;
<
#include"
led.h"
sys.h"
usart.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////
//如果使用ucos,则包括下面的头文件即可.
#ifSYSTEM_SUPPORT_UCOS
includes.h"
//ucos使用
#endif
//本程序仅供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEKSTM32开发板
//串口1初始化
//正点原子@ALIENTEK
//技术论坛:
//修改日期:
2012/8/18
//版本:
V1.5
//版权所有,XX。
//Copyright(C)广州市星翼电子科技有限公司2009-2019
//Allrightsreserved
//***********************************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
//加入以下代码,支持printf函数,而不需要选择useMicroLIB
#if1
#pragmaimport(__use_no_semihosting)
//标准库需要的支持函数
struct__FILE
{
inthandle;
};
FILE__stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(intx)
x=x;
}
//重定义fputc函数
intfputc(intch,FILE*f)
while((USART1->
SR&
0X40)==0);
//循环发送,直到发送完毕
USART1->
DR=(u8)ch;
returnch;
}
#endif
/*使用microLib的方法*/
/*
{
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET){}
intGetKey(void){
while(!
(USART1->
SR&
USART_FLAG_RXNE));
return((int)(USART1->
DR&
0x1FF));
*/
//串口1中断服务程序
//注意,读取USARTx->
SR能避免莫名其妙的错误
u8USART_RX_BUF[USART_REC_LEN];
//接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,接收完成标志
//bit14,接收到0x0d
//bit13~0,接收到的有效字节数目
u16USART_RX_STA=0;
//接收状态标记
//初始化IO串口1
//bound:
波特率
voiduart_init(u32bound){
//GPIO端口设置
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
//使能USART1,GPIOA时钟
USART_DeInit(USART1);
//复位串口1
//USART1_TXPA.9
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
//PA.9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
//复用推挽输出
GPIO_Init(GPIOA,&
GPIO_InitStructure);
//初始化PA9
//USART1_RXPA.10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
//浮空输入
GPIO_Init(GPIOA,&
//初始化PA10
//Usart1NVIC配置
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//IRQ通道使能
NVIC_Init(&
NVIC_InitStructure);
//根据指定的参数初始化VIC寄存器
//USART初始化设置
USART_InitStructure.USART_BaudRate=bound;
//一般设置为9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
//字长为8位数据格式
USART_InitStructure.USART_StopBits=USART_StopBits_1;
//一个停止位
USART_InitStructure.USART_Parity=USART_Parity_No;
//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
//无硬件数据流控制
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
//收发模式
USART_Init(USART1,&
USART_InitStructure);
//初始化串口
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//开启中断
USART_Cmd(USART1,ENABLE);
//使能串口
#ifEN_USART1_RX//如果使能了接收
voidUSART1_IRQHandler(void)//串口1中断服务程序
{
u8Res;
#ifdefOS_TICKS_PER_SEC//如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
if(USART_GetITStatus(USART1,USART_IT_RXNE)!
=RESET)//接收中断(接收到的数据必须是0x0d0x0a结尾)
{
Res=USART_ReceiveData(USART1);
//(USART1->
DR);
//读取接收到的数据
if(Res=='
1'
){
LED0=0;
}elseif(Res=='
0'
LED0=1;
}
}
OSIntExit();
delay.h"
//ALIENTEKMiniSTM32开发板范例代码3
//串口实验
//技术支持:
//广州市星翼电子科技有限公司
intmain(void)
u8t;
u8len;
u16times=0;
delay_init();
//延时函数初始化
NVIC_Configuration();
//设置中断优先级分组
uart_init(9600);
//串口初始化为9600
LED_Init();
//初始化与LED连接的硬件接口
while
(1)
}
4.编译生成*.HEX文件;
5.下载验证,将程序(USART.hex)下载到MiniSTM32开发板中,运行程序;
6.运行串口调试助手XCOM,波特率设置为9600,选择单条发送,其他选项设置为默认值;
发送指令字符串‘1’,验证MiniSTM32开发板上的指示灯DS0是否亮起;
发送指令字符串‘0’,验证MiniSTM32开发板上的指示灯DS0是否熄灭;
运行结果:
二、ADC实验
1.用定时器6触发DAC1和DAC2输出不同电压(不超过3.3V),用定时器3触发ADC1,使其两个通道分别采集并输出DAC1和DAC2输出的电压。
2.参考《STM32不完全手册-库函数版本_V3.0》的第三篇-第二十章-ADC实验,第二十二章–DAC实验;
以及《STM32中文参考手册_V10》的第11章-模拟/数字转换(ADC),第12章-数字/模拟转换(DAC);
2.1STM32ADC简介
STM32拥有1-3个ADC(STM32F101/102系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率)。
STM32的ADC是12位逐次逼近型的模拟数字转换器。
它有18个通道,可测量16个外部和2个内部信号源。
各通道的A/D转换可以单次、连续、扫描或间断模式执行。
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
STM32F103系列最少都拥有2个ADC,我们选择的STM32F103RCT包含有3个ADC。
STM32的ADC最大的转换速率为1Mhz,也就是转换时间为1us(在ADCCLK=14M,采样周期为1.5个ADC时钟下得到),不要让ADC的时钟超过14M,否则将导致结果准确度下降。
STM32将ADC的转换分为2个通道组:
规则通道组和注入通道组。
规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。
在你程序正常执行的时候,中断是可以打断你的执行的。
同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。
通过一个形象的例子可以说明:
假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;
你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;
因此你可以使用规则通道组循环扫描室外的5个探头并显示AD转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后,系统又会回到规则通道组继续检测室外温度。
从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。
可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在释放按钮后需再次配置AD循环扫描的通道。
上面的例子因为速度较慢,不能完全体现这样区分(规则通道组和注入通道组)的好处,但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对AD转换的分组将简化事件处理的程序并提高事件处理的速度。
STM32其ADC的规则通道组最多包含16个转换,而注入通道组最多包含4个通道。
关于这两个通道组的详细介绍,请参考《STM32中文参考手册_V10》的第155页,第11章。
STM32的ADC可以进行很多种不同的转换模式,这些模式在《STM32中文参考手册_V10》的第11章也都有详细介绍,我们这里就不在一一列举了。
我们本章仅介绍如何使用规则通道的单次转换模式。
STM32的ADC在单次转换模式下,只执行一次转换,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这是CONT位为0。
以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在ADC_DR寄存器中,EOC(转换结束)标志将被置位,如果设置了EOCIE,则会产生中断。
然后ADC将停止,直到下次启动。
2.2ADC主要特征
●12位分辨率
●转换结束、注入转换结束和发生模拟看门狗事件时产生中断
●单次和连续转换模式
●从通道0到通道n的自动扫描模式
●自校准
●带内嵌数据一致性的数据对齐
●采样间隔可以按通道分别编程
●规则转换和注入转换均有外部触发选项
●间断模式
●双重模式(带2个或以上ADC的器件)
●ADC转换时间:
─STM32F103xx增强型产品:
时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
─STM32F101xx基本型产品:
时钟为28MHz时为1μs(时钟为36MHz为1.55μs)
─STM32F102xxUSB型产品:
时钟为48MHz时为1.2μs
─STM32F105xx和STM32F107xx产品:
●ADC供电要求:
2.4V到3.6V
●ADC输入范围:
VREF-≤VIN≤VREF+
●规则通道转换期间有DMA请求产生。
2.3STM32的ADC通道与GPIO对应表
ADC1
ADC2
ADC3
通道0
PA0
通道1
PA1
通道2
PA2
通道3
PA3
通道4
PA4
PF6
通道5
PA5
PF7
通道6
PA6
PF8
通道7
PA7
PF9
通道8
PB0
PF10
通道9
PB1
通道10
PC0
通道11
PC1
通道12
PC2
通道13
PC3
通道14
PC4
通道15
PC5
通道16
温度传感器
通道17
内部参照电压
3.以工程实践作业中的“ADC13通道”的程序源码为例验证ADC实验;
5.下载验证,将程序(stm32-ucosii_demo.hex)下载到MiniSTM32开发板中,运行程序;
6.运行串口调试助手XCOM,波特率设置为115200,其他选项设置为默认值;
运行结果:
输出文本示例:
Aver_InTemperSen:
31.533529℃
Aver_ExtraVolt:
3.299194V
Aver_InVolt:
1.217459V
(其中‘InTemper’为内部温度,‘ExtraVolt’为外部电压,‘InVolt’为内部电压)
小组介绍
组长叶秋思负责分配任务,焊接电路板,硬件调试;
组员王凌峰负责原理图设计,封装器件,布局布线;
组员卢健聪负责实验验证,报告编排;
实验结论:
这次工程实践让我们初步认识了STM32开发板,学会了在KEIL编译环境下进行简单的代码调试,以及通过串口发送指令控制LED灯亮灭。
为今后进一步学习STM32打下了基础。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 工程 实践 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)