嵌入式作业题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统原理及应用作业题答案
第1章嵌入式系统概述
1. 什么是嵌入式系统?嵌入式系统的组成?
答:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
组成:嵌入式处理器、外围设备、操作系统、应用软件。
2. 典型的嵌入式处理器有哪些?
3. 答:微处理器、微控制器、DSP处理器、片上系统SOC。
4. 典型的RTOS操作系统有哪些?
5. 答:嵌入式LinUX、卩CLinUX、WindoWS Embedded CE、WindoWS Embedded ComPaCt 7 > μC/OS-II > μC/OS-III、VXWorks、eCos 等。
6. 列举身边的嵌入式应用产品?
7. 嵌入式系统的设计可以分成四个阶段:需求分析、架构设计和概要设计、详细设计和开发、测试反馈。
第2章COrteX-M体系结构
8. ARM COrteX系统的处理器分为: A 、__________ R ____ 、____ M ____ 。
9. ARM COrteX-M3为32位微控制器,请问32位指的是CPlJ字长。
10. 3、COrteX-M3处理器能够以小端格式或大端格式访问存储器中的数据字,而访问代码时始使用小端格式______
11. ARM COrteX-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行进行。
12. CM3寄存器分为通用寄存器,包括R0~R15和特殊功能寄存器,包括程序状态寄存器、异常屏蔽寄存器、控制寄存器。
13. 寄存器R13是堆栈指针寄存器。
14. 寄存器R14是程序连接寄存器。
15. 寄存器R15是程序PG
16. CM3的堆栈指针分为__MSP__ _=PSP r O存储器堆栈堆栈分为:向上生长(即向高地址方向生长)的递增堆栈;向下生长(即向低地址方向生长),称为递
减堆栈。
堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个数据项放入的空位置,称为空堆栈。
试判断CM3属于递减堆栈堆栈和满堆栈堆栈。
17. 在CM3中记录程序状态的寄存器是=XPSR= 。
都分别有些什么状态—应用状态、中断状态、可执状态。
18. PRIMASK寄存器的作用是_中断屏蔽寄存器_ o
19. 寄存器CONTRO的作用是控制处理器工作级别及堆栈切换。
20. CM3支持的4GB存储空间被划分成:CODE片上RAM片上外设、片外RAM片外外设、内核私有6个区域。
21. CM沖有一个位绑定区分别位于片上RAM和片上外设区,其大小为1M字节,由32M字节空间的位绑定别名区来访问。
22. CM3支持1£种系统异常,和240种外设中断。
23. SySTiCk是一个___24 位的系统定时器。
通常的功能是_作为操作系统时钟__。
第3章STM32基础及最小系统设计
24. STM32F103RBT7芯片的在片Flash存储器有128KB 字节,在片SRAM 存储器有20KB 字节。
25. STM32F103RBT7芯片工作时电源电压是 3.3 V。
26. STM32最小系统电路包含:MCU芯片、电源电路、时钟电路、复位电路和启动设置电路。
27. 连接在APB1 上的设备有:电源接口、备分接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、WatChDOg、Timer2、Timer3 和Timer4。
28. 连接在APB2 上的设备有:UART1、SPI1、TimerI、ADC1、ADC2、I/O ( PA〜PE,第二功能I/O)。
29. 假定STM32F103单片机外部振荡器是8MHz。
执行下列程序。
While(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; // 等待PLL 就绪
RCC_SYSCLKCOnfig(RCC_SYSCLKSOUrCe_PLLCLK); // 设置PLL 作为时钟源
WhiIe(RCC_GetSYSCLKSource() != 0x08) ;// 等PLL 时钟源启动就绪
}
}
请问,上述程序执行后,HCLK= 72MHZ ,PCLKI= 38MHZ ,PCLK2= 72MHZ ,
30. 利用COrteX-M3内核的24位定时器(SySTiCk),定时10ms,请计算初值并写出初始化程序,SySTiCk配置函数:uint32_t SySTiCk_COnfig(Uint32_t
ticks) o假设HCLK的时钟是72MHz。
1
答:初值=720000-1 o N 10ms,共中N是计数的次数,由于SySTiCk是减计数器,因此初值为720000-1。
72M
Void SySTiCkInit (VOid)
{
SySTiCk_COnfig(720000-1);
}
第5章通用I/O结构及应用
31. STM32F103微控制器的I/O端口有PA~PG,每组多达16 端口。
32. STM32F103微控制器的I/O端口的功能:通用输入/输出、中断功能、复用功能和重映射功能。
33. 请编程实现如图所示4只发光二极管流水。
/********************************************************/
/* 说明:PC8-PC15 连接LED
********************************************************/
#include "stm32f10x.h"
#include "system_stm32f10x.h"
#include "stm32f10x_gpiO.h"
#include "stm32f10x_rcc.h"
VOid DeIayMs( int n);
/********************************************************/
int main(vOid)
{
GPIO」nitTypeDef GPIO_InitStrUCture;
RCC_APB2PeriphClOckCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9
|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStrUCtUre.GPIO_MOde = GPIO_MOde_OUt_PP;
GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_SPeed_50MH z;
GPIO_Init(GPIOC, & GPIO」nitStrUCtUre);
GPIO_Write(GPIOC, OXFFFF);
/******************************************************
while(1)
{
GPIO_ReSetBitS(GPIOC, GPIO_Pin_8);
DeIayMS(500);
GPIO_SetBitS(GPIOC, GPIO_Pin_8);
GPIO_ReSetBitS(GPIOC, GPIO_Pin_9);
DeIayMS(500);
GPIO_SetBitS(GPIOC, GPIO_Pin_9);
GPIO_ReSetBitS(GPIOC,
GPIO_Pin_10);
DeIayMS(500);
GPIO_SetBitS(GPIOC, GPIO_Pin_10);
GPIO_ReSetBitS(GPIOC,
GPIO_Pin_11);
DeIayMS(500);
GPIO_SetBitS(GPIOC, GPIO_Pin_11);
}
34.请编程实现键控蜂鸣器,当按键KEYI按下时,蜂鸣器发声,再按下不发声,按键采用中断方式控制
******************************************************
*
/*说明:KEY1->PA0;Buz->PB4
按键采用中断,在中断服务程中取反PB4
******************************************************
*
#include "stm32f10x.h"
#include "system_stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "misc.h"
中断第二级配置*****************/
void NVIC_COnfigUration(void)
{
NVIC_InitTyPeDef NVIC_InitStrUCture;
NVIC_InitStrUCtUre.NVIC_IRQChanneI = EXTI0_IRQn;
NVIC_InitStrUCtUre.NVIC_IRQChanneIPreemPtiOnPriority =
0;
NVIC_InitStrUCtUre.NVIC_IRQChanneISUbPriOrity = 0;
NVIC_InitStrUCtUre.NVIC_IRQChanneICmd = ENABLE;
NVIC_Init (&NVIC—lnitStructure);
}
中断第三级配置******************/
void
EXTI_COnfigUration(void)
{
EXTI_InitTypeDef EXTI_InitStrUCtUre;
GPIO_EXTILineCOnfig(GPIO_PortSoUrceGPIOA,
GPIO_PinSoUrce0);
EXTLInitStrUCtUre.EXTLLine = EXTI_Line0;
EXTI_InitStrUCtUre.EXTI_MOde =
EXTI_MOde_InterrUpt;
EXTLInitStrUCtUre.EXTLTrigger = EXTI_Trigger_Falling;
EXTLInitStrUCtUre.EXTLLineCmd = ENABLE;
EXTI_Init(&EXTI_lnitStrUCtUre
);
}
按键初始化************************/
void key_init(VOid)
{
GPIO_lnitTypeDef GPIO」nitStrUCtUre;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_lnitStrUCtUre.GPIO_Pin = GPIO_Pin_0 ;
GPIO_lnitStrUCtUre.GPIO_Mode = GPIO_Mode_IPU;
GPIO_lnitStrUCtUre.GPIO_Speed = GPIO_Speed_50MH
z;
GPIO_Init(GPIOA, & GPIO_InitStrUCtUre);
}
蜂鸣器端口初始化******************/
void BUZZer_Init(VOid)
{
GPIO_InitTypeDef GPIO」nitStrUCtUre;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemaPCOnfig(GPIO_Remap_SWJ_NOJTRST,ENABLE)
;
//PB4重映射
//BUzzer
GPIO_InitStrUCtUre.GPIO_Pin =GPIO_Pin_4;
GPIO_lnitStrUCtUre.GPIO_Speed = GPIO_Speed_50MH z;
GPIO_lnitStrUCtUre.GPIO_Mode = GPIO_Mode_OUt_PP;
GPIO_Init(GPIOB, & GPIO_InitStrUCtUre);
GPIO_ResetBits(GPIOB, GPI0_Pin_4);〃置低电平,关闭蜂鸣
器}
int main(void)
{
key_init();
BUZZer_Init();
__set_PRIMASK(0x00); // 一级开关使能
NVIC_COnfigUration();// 二级开关使能
EXTI_COnfigUration();// 三级开关使能
while(1) {; }
嵌入式系统原理及应用作业题答案
35. STM32F103定时器是16 位定时器。
36. STM32F103的基本定时器有:TIM6、TIM7 ,通用定时器有:TIM2~TIM5 ,高级定时器有:TIM1、TIM8。
37. STM32F103定时器的主要功能有:定时功能、输入捕获功能、输出比较功能(PWM )等。
38. 已知系统时钟为72MHz ,采用定时器TIM1产生周期为100ms的定时时间间隔并通过LED发光二极管指示定时过程,发光二极管与PC15 相连。
分析:TIM1的时钟为72MHz ,定时100ms,需要计数7.2X106,已超出计数值范围,因此必须对输入时钟信号进行分频。
分频系数有多种选择,
360分频,则计数值为2000 ,程序采用中断的方式,计时时间到LED 只要在计数范围内即可,只是计数值越大,分频率越高。
对输入时钟进行
状态反转。
/***************************************************** {
说明:已知系统时钟为72MHz ,采用定时器TIM1产生周期为100ms /* --------------------------------------------------------------- 的定时时间间隔并通过LED发光二极管指示定时过程。
TIM1 Configuration: OUtPUt COmPare Timing Mode:
*****************************************************/ TIMICLK = 72 MHz, PreSCaIer =360,period=2000
#include "stm32f10x.h" -------------------------------------------------------------- */
#include "system_stm32f10x.h" TIM_TimeBaSeInitTyPeDef TIM_TimeBaSeStrUCture;
#include "stm32f10x_GPIO.h" RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
#include "stm32f10x_tim.h" TIM_TimeBaSeStrUCtUre.TIM_PeriOd=2000; // 初值
#include "stm32f10x_rcc.h" TIM_TimeBaSeStrUCtUre.TIM_PreSCaler=360-1; // 时钟预分频值
#include "misc.h" TIM_TimeBaSeStrUCtUre.TIM_ClockDivision=TIM_CKD_DIV1;
/***************************************************** TIM_TimeBaSeStrUCtUre.TIM_COUnterMOde=
说明丄ED端口初始化PA15接LED.PD2控制锁存器TIM_COUnterMOde_Down;// 计数方式
*****************************************************/ TIM_TimeBaSeInit(TIM1, &TIM_TimeBaSeStrUCture);
void GPIO_COnfigUration(void) TIM_ITCOnfig(TIM1,TIM」T_UPdate,ENABLE); // 使能中断(三级) { TIM_Cmd(TIM1, ENABLE);
GPIO_InitTyPeDef GPIO_InitStrUCture; }
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); void NVIC_COnfigUration() // 使能第二级中断开关
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); {
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_15 ; NVIC_InitTyPeDef NVIC_InitStrUCture;
GPIO_InitStrUCtUre.GPIO_Mode = GPIO_Mode_OUt_PP; NVIC_InitStrUCtUre.NVIC_IRQChanneI = TIM1_UP_IRQn;
GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_SPeed_50MH z; NVIC_InitStrUCtUre.NVIC_IRQChanneIPreemPtiOnPriority = 0;
GPIO_Init(GPIOC, & GPIO」nitStructure); NVIC_InitStrUCtUre.NVIC_IRQChanneISUbPriOrity = 0;
GPIO_Write(GPIOC, OXFFFF); NVIC_InitStrUCtUre.NVIC_IRQChanneICmd = ENABLE;
/************* ^下面^为74HC573 存控制H ****************/ NVIC_Init (&NVIC—lnitStructure);
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_2; }
GPIO」nitStructure.GPIO_Mode = GPIO_Mode_OUt_PP; int main()
GPIO」nitStructure.GPIO_Speed = GPIO_SPeed_2MH z; {
GPIO」nit(GPIOD, & GPIO_InitStrUCture); GPIO_COnfigUration();
//NLE置高,打开锁存器74HC573 NVIC_COnfigUration();
GPIO_SetBitS(GPIOD, GPIO_Pin_2); TIM1_COnfigUration();
} while(1)
void TIM1_COnfigUration(void) }
第7章USART结构及应用
39. 常见的短距离异步串行通信协议标准有:RS232标准、RS485标准。
40. 在异步串行通信中RS232标准的硬件连线主要有:RX(数据接收线)、TX (数据发送)、GND (地线)组成。
41. STM32F103中的USART模块支持:同步串行数据收和异步串行数据收发。
42. STM32F103中的USART模块支持:全双工异步通信、同步单向通信和半双工单线通信。
43. STM32F103的USART模块程序初始化中主要涉及:波特率、数据位、校验、停止位等设置。
44. STM32F103的USART模块的波特率最高可达: 4.5Mbit∕s。
45. 请利用STM32F103的USART模块实现与计算机之间通信,STM32F103发送:"Please input data!:"到计算机,计算机利用串口调试软件接
收数据,然后计算机发送数据到STM32F103 ,并通过开发析上的LCD显示出接收的数据。
9600bit/s ,数据位8位,停
止位1位,校验位无。
数据接
收采用中断方式进行。
/****************************************************
说明:本程序是功能是STM32通过串口发:"PIeaSe input data!:" 对方通过串口发送数据,本STM32采用中断接收数据,保存在
RXBUffer[]
****************************************************/
#include "stm32f10x.h"
#include "system_stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_USart.h"
#include "misc.h"
NVIC_InitStrUCtUre.NVIC_IRQChanneICmd = ENABLE;
NVIC_Init (&N VIC_lnitStructure);
中断第三级配置***************
Void USartIT_COnfigUration(void)
{
USART_ITCOnfig(USART2,USART_IT_RXNE,ENABLE) ;
USART 初始化***********************/
#include "lcd.h"
#include <string.h>
**/
Char TXBUffer[]={"Please input
data!:"};
Char RXBUffer[]={0};
Char TXCOUnter;
Char RXCOUnter;
中断第二级配置***************
void NVIC_COnfigUration(void)
{
NVIC_InitTyPeDef NVIC_InitStrUCture;
NVIC_InitStrUCtUre.NVIC_IRQChanneI = USART2_IRQn;
NVIC_InitStrUCtUre.NVIC_IRQChanneIPreemPtiOnPriority = 0; void USart_init(void)
{
GPIO_InitTyPeDef GPIO_InitStrUCture;
USART_InitTyPeDef USART_InitStrUCture;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_AFI0,ENABLE);
RCC_APBIPeriPhCloCkCmd(RCC_APBIPeriPh_USART2,
ENABLE);
//RX管脚
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStrUCtUre.GPIO_Mode =
GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, & GPIO_InitStrUCture);
//TX管脚
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_SPeed_50MH z;
分析:如图所示,采用串口2(USART2),用到PA2、PA3两个管脚,STM32F103的USART配置成波特率:
}
whiIe(1) {
LCD_DiSPIayStringLine(Line4,"ReCeive Data:");
LCD_DiSPIayStringLine(Line5,RxBUffer);
}
}
第8章SPI结构及应用
46. SPI主从设备需共享时钟线,因此称为:同步串行通信总线。
47. SPI总线采用主从连接架构,通信双方分为:主控端(MaSter)和从动端(SIaVe)。
48. SPI接口的硬件连接线共有4根,分别是:设备片选线SS、时钟信号线SCLK、串行输出数据线MoSl、串行输入数据线MISo
49. STM32F103中的SPI总线通信中数据帧格式有:8位数据和16位数据。
50. STM32F103中的SPI总线支持硬件CRC校验以实现可靠通信。
51. 请利用STM32F103的SPI总线向LED显示模块发送显示信息,在LED上显示“ 01234567”。
如图所示硬件连接。
GPIO_Init(GPIOA, & GPIO_lnitStructure); WhiIe(USART_GetFIagStatUS(USART2, USART_FLAG_TXE)==
RESET);
USART_ART_BaUdRate = 9600;
USART_ART_WOrdLength=
USART_WOrdLength_8b;
USART_ART_StOPBitS = USART_StOPBitS_1;
USART_ART_Parity = USART_Parity_No;
USART_ART_HardWareFlowControl =
USART_HardWareFlowControl_None;
USART_ART_Mode =
USART_Mode_RX | USART_Mode_Tx;
USART_Init(USART2, & USART_InitStrUCture);
USART_Cmd(USART2, ENABLE);
}
向串口发送一字符串**************/
USART_CIearFIag(USART2, USART_FLAG_TXE);
}
}
∙k∙k∙k∙k∙k∙k∙k∙k∙k∙k∙k∙k∙k
∙k∙k
int main(void)
{
主程序************************ **/
USart_init();
USartIT_COnfigUration();
NVIC_COnfigUration();
__Set_BASEPRI(0x00);// 一级中断开关使能
STM3210B_LCD_lnit();
USART_SendString(TXBUffer,StrIen(TxBUffer)
);
void USART_SendString(Char *str,u8
Iength) {
u8 temp;
for(temp=0;tempvlength;temp++)
{
USART_SendData(USART2, str[temp]);
分析:本题主要是利用STM32F103的SPI模块向74LS595芯片发送数据,STM32F103作为主设备,74LS595作为从设备,硬件连接使
用SPI1 的PA7( MOSI )、PA5( CLK )和NSS( PA4)
#inclUde "stm32f10x.h"
#inclUde "stm32f10x_GPIO.h"
#inclUde "stm32f10x_spi.h"
#inclUde "stm32f10x_rcc.h"
/*此表为7段共阳数码管显示0〜9的字模,数码管上编号为
“SR410361K ”可用*/
第11章
52. A/D 转换是将:连续变化的模拟信号变为对应的离散数字信号。
53. 模拟信号转化为数字信号包含三个关键步骤:采样、量化和编码。
54. A/D 转换的主要技术指示有:位数、采样速率、分辨率等等。
55. STM32F103的ADC 模块是一个12位逐次逼近型 ADC ,包含18个通道,可测量 16个外部信号和 2个内部信号。
56.
当STM32F103的ADC 模块被测电压范围是 0~3.3V 连续变化的模拟信号,ADC 转换的参考电压是3.3V ,请问当被测信号为 3.3V 时对应
的转换后的数字量是:1111 1111 1111十进制4096,十六进制OXfff ),当被测信号为 0V 时对应的数字量是:0000 0000 0000。
当转换后的数 字量为1000 0000 0000(十进制2048,十六进制 0x800)时对应的模拟电压为: 1.65V 。
57.
请利用STM32F103的ADC 模块转换如图所示模拟电压并能过
LCD 显示器显示被测信号电压值。
GPIOJInitStrUCtUre.GPIO_Mode = GPIOJMode_AF_PP; GPIOJInit(GPIOA, & GPIOJInitStrUCtUre); GPIOJInitStrUCtUre.GPIO_Pin = GPIO_Pin_4;
GPIOJInitStrUCtUre.GPIO_Speed = GPIOJSpeed_10MH z;
GPIOJInitStrUCtUre.GPIO_Mode = GPIOJMode_OUt_PP; GPIOJInit(GPIOA, & GPIOJInitStrUCtUre); SPIJInitStrUCtUre.SPIJDireCtiOn = SPIJDireCtionJ2LineSJFUllDUplex;
SPIJInitStrUCtUre.SPI_Mode = SPI_Mode_Master; SPIJInitStrUCtUre.SPIJDataSiZe = SPIJDataSize_16b; SPIJInitStrUCtUre.SPI_CPOL = SPIJCPOLJHigh; SPIJInitStrUCtUre.SPI_CPHA = SPI_CPHA_2Edge;
分析:PBo对应ADCI模块的8号通道。
拟采用软件触发采样,通过查询标志位,获取转换结果。
程序流程图如上图所示#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "stdio.h"
#include "lcd.h"
#include "delay.h"
void adc_init(Void)
{
GPIO_InitTyPeDef GPIO_InitStrUCture;
ADC_InitTyPeDef ADC_InitStrUCture;
/*使能GPIOB时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
/*配置PB0为模拟输入端口*/
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStrUCtUre.GPIO_Mode = GPIO_Mode」N—FLOATING;
GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_Speed_2MH z;
GPIO_Init(GPIOB, & GPIOJnitStrUCtUre);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
/*ADC1的配置*/
ADC_lnitStrUCtUre.ADC_Mode = ADC_Mode_Independent;
ADC_lnitStrUCtUre.ADC_ScanConvMode = DISABLE;
ADC_InitStrUCtUre.ADC_COntinUOUsConvMode = DISABLE;
ADC_lnitStrUCtUre.ADC_ExternalTrigCOnV = ADC_ExternaITrigConv_None;
ADC_InitStrUCtUre.ADC_DataAIign = ADC_DataAlign_Right;
ADC_lnitStrUCtUre.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStrUCtUre);
ADC_RegUIarChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SamPIeTime_13CyCIeS5); //ADC1 规则Channel8 配置ADC_Cmd(ADC1, ENABLE); //能ADC1
ADC_ReSetCaIibratiOn(ADC1); //使能ADC1 复位校准寄存器
WhiIe(ADC_GetReSetCaIibratiOnStatUS(ADC1));// 检查校准寄存器状态
ADC_StartCaIibratiOn(ADC1); //启动ADC 校准
WhiIe(ADC_GetCaIibratiOnStatUS(ADC1)); 〃检查校准状态
}
#define V_REF 3.300
float adc_read(VOid)
第16章μC/QS-II 原理及应用
μ C/QS-II 操作系统的文件结构可分成三部分:与处理器类型无关的代码、与处理器类型有关的代码、与应用程
__________
μ C/QS-II 操作系统中与处理器无关的代码有: QS CQRE.C 、QS TASK.C 、QS TIME.C 、QS FLAG.C 、QS MBQX.C 、QS MUTEX.C 、
QS Q.C 、QS SEM.C 、QS MEM.C 、Q/QS II.C 、μC∕QS II.H 。
μ C/QS-II 操作系统中与处理器有关的代码有: QS_CPU.H 、QS_CPU_A.A 、QS_CPU_C.C 从任务的存储结构来看,μ C/QS-II 的任务由三大要素是:任务代码、任务堆栈、任务控制块。
μ C/QS-II 中创建任务的函数是: INT8U QSTaSkCreate (void (*task)(void *pd), void *pdata, QS_STK *ptOS, INT8U priO) 。
μ C/QS-II 中任务延时函数分别是: void QSTimeDly (INT16U ticks)、INT8U QSTimeDIyHMSM (INT8U hours, INT8U minutes, INT8U SeeOndS, INT16U
milli)。
μ C/QS-II 中的任务在运行中的五种状态:等待状态、睡眠态、就绪态、运行态、被中断态。
μ C/QS-II 中任务的调度原则是: 优先级至上的抢占调度方式。
具本算法是通过两个变量 (QSRdyGrP 、QSRdyTbl[])+两张表(QSMaPTbl[]、
QSUnMaTbl[])相互杳找来完成的。
μ C/QS-II 中任务的初始化函数是 QSlnit();任务的启动函数是 QSStart()。
在编写μ C/QS-II 的中断服务程序时,要用到两个重要的函数 QSIntEnterO 和QSIntExitO 。
时钟节拍函数是:QSTimeTickO 。
μ C/QS-II 中任务与任务之间的通信方式有:信号量、 F 互斥型信号量、消息邮箱、消息队列。
μ C/QS-II 中信号量的创建函数是 QSSemCreateO :信号量的请求函数是 QSSemPenCr )。
信号量的释放函数是 QSSemPostO 。
μ C/QS-II 移植的条件?
要使μC∕QS H 正常运行,处理器必须满足以下要求:
处理器的C 编译器能产生可重入代码。
58. 59.
60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
嵌入式系统原理及应用作业题答案
11
!
i
MFI 注锁艸 "ElibsiHF 1MIU
i
^OSVL-wdtahriil *愜H⅛>*wP■讥片《 Ql i
I
i
DSQf- [i IEllf l " Ii 丹 : ■ ■
|诩”询卉<1
:
ΠS5πnJ i n⅛⅛a
;055«FQiU)
, JSStartQ
至TwK05⅛ι⅛C ∣
;JB2呱询心,'∣5EntIιitrj
CIS l lir ∣⅞Dly□ FflBTi af ∏r}r(] I∏5-T*≡-Ξ∕[j
;
D5TirCjyffl5R ∣O
,X = ~⅛.
用C 语言就可以打开和关闭中断。
处理器支持中断,并且能产生定时中断
(通常在10至IOOHz 之间)。
处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
处理器有将堆栈指针和其它 CPU 寄存器读岀和存储到堆栈或内存中的指令。
72.
μ C/OS-II 移植的内容?
移植的内容主要是完善 OS_CPU.H OS_CPU_C.C OS_CPU_A.AS 三个文件。
移植具体工作包括以下几个内容:
用#define 设置一个常量的值(OS_CPU.H) 声明10个数据类型(OS_CPU.H) 用#define 声明三个宏(OS_CPU.H)
用C 语言编写十个简单的函数(OS_CPU_C.C) 编写4个汇编语言函数(OS_CPU_A.ASM)
{
int year,leap;
scanf( “ %d' ,&year);
if(year%4==0&&year%100!=0∣∣year%400==0)
leap=1;
else leap=0;
if( leap) Printf(是润年”); else Printf(不是润年”); } main() { int i=2; float sum=1.0; while(i<= 50 )
{
sum+=1∕ i ; i+=2; }
Printf( sum=%f\n ",sum); } 75.
专业名词解释:RTOS 、CISC 、RISC 、KemeI 、SChedUIer 、RTC 。
答:ROTS 实时系统,CISC :复杂指令集,RISC :精减指令集,KemeI :内核,Scheduler :调度器,RTC :实时时钟
76. 请画出μ CO 的状态转换图
答:
IlMjtr
:l∞⅛s ⅛Cr⅛⅛⅛ P : i I ;IL∑τb -L ∣dZιr⅞ιka -ΞM⅛ i ι
J W ⅞ M 'l
中對
嵌入式系统原理及应用作业题答案
12
77.
如图所示用STM32F103控制两路LED 发光二极管,要求用 Q/OS-II 操作系统进
行管理 LEDI 和LED2轮流发光,已完底动驱动程序开
发:Led θn( n)n 取1和2对应LED1和LED2 ,点亮LED1 ; Ledoff(n) n 取1和2对应LED1和LED2 ,熄灭LED ,LED 的初始化程序: LED_lnitialize();用于 QOS 工作的定时器初始化程序:
OS_CPU_SysTicklnit()。
要求用uc/os-ll 操作系统管里完成任务代码和主程序。
78.
如图所示,单片机 PB0去控制LED 显示,PB1去控制蜂鸣器。
由两个任务:
TaSkled 、TaSkbUZ 完成控制。
TaSkIed 任务完成LED 灯的闪
烁间隔1S 亮一次。
TaSkbUZ 任务完成蜂鸣器发声,间隔2S 叫一次。
现已完成LED 闪烁的[初始化程序Led_init ()和驱动程序ledToggle(); 蜂鸣器发声的初始化程序
BUZ_Init()和驱动程序buzToggle();用于μC∕OS 工作的定时器初始化程序:OS_CPU_SysTickInit()。
要求用uc/os-II
操作系统管里完成任务代码和主程序。
**********************************
#include "stm32f10x.h" #include "system_stm32f10x.h" #include "stm32f10x_gpio.h"
Main.c_
#include "stm32f10x.h" #include "stm32f10x_conf.h" #include <ucos_ii.h> #include "LED.h" StatiC OS_STK APP_TaSkLED0Stk[50]; StatiC OS_STK
APP_TaSkLED1Stk[50];
StatiC void APP_TaSkLEDO (void *P_arg); StatiC void APP_TaSkLEDI (void *P_arg); int main(void) // 主程序 {
OSInit();
OSTaSkCreate( APP_TaSkLED0, 0,&APP_TaSkLED0Stk[49],2);
OSTaSkCreate( APP_TaSkLED1,0,&APP_TaSkLED1Stk[49],3);
OSStart(); return (0); }
StatiC void APP_TaSkLED0(void *P_arg) // 在 LED0 的任务 while(1)
LED_On(0);
OSTimeDIyHMSM(0,0,0,100); LED_Off(0);
OSTimeDIyHMSM(0,0,0,100);
StatiC void APP_TaSkLED1(void *P_arg) // while(1)
LED_On(1);
OSTimeDIyHMSM(0,0,0,500); LED_Off(1);
OSTimeDIyHMSM(0,0,0,500);
//点亮LED1 // // // 延时 息灭LED1 延时
在LED1的任务
//点亮LED1 // // // 延时 息灭LED1 延时
#include "stm32f10x_rcc.h" #include "stm32f10x_exti.h" #include "misc.h" #include "ucos_ii.h"
LED_Initialize(); LED 1 LED2
嵌入式系统原理及应用作业题答案
13
OS_STK TaSkLed[50]; OS_STK TaSkBUZ[50];
extern void OS_CPU_SySTiCkInit (void); /*****************************************/ void buzToggle() {
GPIO_WriteBit(GPIoB, GPI0_Pin_4,
(1-GPIO_ReadOUtPUtDataBit(GPIOB, GPIO_Pin_4)));
}
void ledToggle() {
GPIO_WriteBit(GPIOC, GPIO_Pin_8,
(1-GPIO_ReadOUtPUtDataBit(GPIOC, GPIO_Pin_8))); }
void Led_init(void) {
GPIO 」nitTypeDef GPIO_InitStrUCture;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStrUCtUre.GPIO_Pin = GPIO_Pin_8 ;
GPIO_InitStrUCtUre.GPIO_Mode = GPIO_Mode_OUt_PP; GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_SPeed_50MH z; GPIO_Init(GPIOC, & GPIO 」nitStructure); }
void BUZZer_Init(VOid) {
GPIO 」nitTypeDef GPIO_InitStrUCture;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemaPCOnfig(GPIO_RemaP_SWJ_NOJTRST,ENABLE);
GPIO_InitStrUCtUre.GPIO_Pin =GPIO_Pin_4;
GPIO_InitStrUCtUre.GPIO_SPeed = GPIO_SPeed_50MH z; GPIO_InitStrUCtUre.GPIO_Mode = GPIO_Mode_OUt_PP; GPIO_Init(GPIOB, & GPIO_InitStrUCture); ^蜂鸣器任***************************/ void TaSk_BUZ(VOid *prag) {
OS_CPU_SySTiCkInit(); BUZZer_Init(); while(1) {
buzToggle();
OSTimeDIyHMSM(0,0,0,500);
}
} void TaSk_Led(VOid *prag) {
Led_init();
while(1)
{
ledToggle();
OSTimeDIyHMSM(0,0,0,500); }
}
/*********************************************** int main(void) {
OSInit();
OSTaSkCreate (TaSk_BU z,0,& TaSkLed[49],2); OSTaSkCreate (TaSk_Led,0, &TaskBuz[49],3); OSStart(); }
LED
^初始^化 ***********
蜂鸣器初始化 *************
GPIO_ReSetBitS(GPIOB, GPIO_Pin_4);// 置低电平,关闭蜂鸣器
/****************
*LED
彳务 *********************。