第六章《嵌入式系统原理与实践》--沈建华 王慈 清华大学出版社 课后部分习题个人答案

news/2024/4/20 0:43:00/文章来源:https://blog.csdn.net/JamSlade/article/details/129181669

1,2,5,6,9,12

1.一个基本的 I/O 接口,一般包含哪些寄存器?这些寄存器的作用分别是什么?

控制寄存器和数据寄存器。

  1. 数据寄存器用于设置输出数据或读取输入数据;
  2. 控制寄存器决定 GPIO 的方向,即 GPIO 工作于输入还是输出状态。

2. 一个 GPIO 引脚作为输入、输出使用时,有哪几种常用具体配置?各种配置的特点和应用场合?

常见配置有标准输入、上/下拉输入、输入禁用的推拉输出、上/下拉输出、复位或模拟 I/O。

  1. 标准输入:GPIO 被配置为标准输入时,为了防止 MCU 读到不确定的输入状态,该 GPIO 必须被外部电路驱动,即输入不能悬空。
  2. 上/下拉输入:上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用,下拉就是将不确定的信号通过一个电阻钳位在低电平。
  3. 输入禁用的推拉输出:推拉电路由两个二极管组成,这两个二极管始终处于一个导通、一个截止的状态,对于负载而言,就好像是一个在推、一个在拉,共同完成电流输出任务。推拉电路的输出对外部电路具有驱动能力。
  4. 上/下拉输出:这种模式相当于在推拉输出时串接了一个电阻,限制了输出电流,可以保护 GPIO 引脚,适合于外部弱驱动要求的应用。
  5. 复位或模拟 I/O:一般芯片复位时,GPIO 会被自动配置成这种模式。

5,设计编写一个程序,用中断方式来读取一个按键状态,并控制一个 LED 的亮和灭。即按一下灯亮、再按一下灯灭,可重复操作,要求每次操作执行可靠

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>
int main(void)
{MAP_WDT_A_holdTimer();MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);MAP_Interrupt_enableInterrupt(INT_PORT1);MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK1);MAP_Interrupt_enableMaster();while (1){MAP_PCM_gotoLPM3();}
}
void PORT1_IRQHandler(void)
{uint32_t status;status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);if(status & GPIO_PIN1){MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);}
}

6.简述定时器的一般结构及其扩展功能(输入捕获、输出比较、PWM 等)。

定时器主要由控制寄存器、状态寄存器、初始值寄存器、输出寄存器和计
数器组成

  1. 输入捕获功能可以用于测量周期。只要捕获两次脉冲,然后相减就能得到两次脉冲的间隔时间
  2. 输出比较功能可以用于产生特定波形。当计数器的值与比较寄存器的值相等时,可在输出引脚输出指定信号
  3. PWM 是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其原理是冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同

9 设计编写一个程序,实现一个“呼吸灯”的功能。就是 LED 灯的亮度慢慢变亮、再慢慢变暗,周而复始不断循环,要求亮度变化感觉柔和,循环周期与人的呼吸周期差不多

通过之前的实验自主尝试

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
void myDelay(int time) 
{int i = 500 * time;while (i--);
}int main() {GPIO_setAsOutputPin(led1);int level[17] = { 32,28,24,20,16,12,8,4,0,4,8,12,16,20,24,28,32 };int len = sizeof(level) / sizeof(int);while (1) {int times = 0for (int i = 0;i < len;i++){while(time++ < 20){GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN0);myDelay(i);GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0);myDelay(32 - i);}}}
}

参考网上资料找到的另一种写法

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>
uint32_t flag = 1;
Timer_A_PWMConfig pwmConfig =
{TIMER_A_CLOCKSOURCE_SMCLK,TIMER_A_CLOCKSOURCE_DIVIDER_1,320,TIMER_A_CAPTURECOMPARE_REGISTER_1,TIMER_A_OUTPUTMODE_RESET_SET,2
};
const uint8_t port_mapping[] =
{//port2,use red ledPM_TA0CCR1A,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE
};int main(void)
{MAP_WDT_A_holdTimer();MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT,CS_CLOCK_DIVIDER_1);MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT,CS_CLOCK_DIVIDER_2);MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);//configure port mappingMAP_PMAP_configurePorts((const uint8_t *)port_mapping,PMAP_P2MAP,1,PMAP_DISABLE_RECONFIGURATION);MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,GPIO_PIN0|GPIO_PIN1|GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);MAP_SysTick_enableModule();MAP_SysTick_setPeriod(3000);MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);MAP_SysTick_enableInterrupt();MAP_Interrupt_enableSleepOnIsrExit();MAP_Interrupt_enableMaster(); GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN2);while (1){MAP_PCM_gotoLPM0();}
}
void SysTick_Handler(void)
{if(flag){if(pwmConfig.dutyCycle <= 288){pwmConfig.dutyCycle += 2;}else{flag = 0;pwmConfig.dutyCycle -= 2;}}else{if(pwmConfig.dutyCycle >= 2){pwmConfig.dutyCycle -= 2;}else{flag = 1;pwmConfig.dutyCycle += 2;}}MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);
}

通过和同学讨论之后,发现其实可以不使用中断,可以直接延迟处理,修改版如下

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>void myDelay(int time) 
{int i = 500 * time;while (i--);
}
uint32_t flag = 1;
Timer_A_PWMConfig pwmConfig =
{TIMER_A_CLOCKSOURCE_SMCLK,TIMER_A_CLOCKSOURCE_DIVIDER_1,320,TIMER_A_CAPTURECOMPARE_REGISTER_1,TIMER_A_OUTPUTMODE_RESET_SET,32
};
const uint8_t port_mapping[] =
{PM_TA0CCR1A,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE,PM_NONE
};int main(void) {MAP_WDT_A_holdTimer();MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT,CS_CLOCK_DIVIDER_1);MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT,CS_CLOCK_DIVIDER_2);MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);MAP_PMAP_configurePorts((const uint8_t*)port_mapping, PMAP_P2MAP, 1, PMAP_DISABLE_RECONFIGURATION);MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);while (1) {myDelay(10);if (pwmConfig.dutyCycle == 288)flag = 0;if (pwmConfig.dutyCycle == 32)flag = 1;if (flag)pwmConfig.dutyCycle += 32;elsepwmConfig.dutyCycle -= 32;MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);}
}

12 简述看门狗定时器的基本概念及其使用方法。

看门狗定时器是一个特殊的定时器,可以通过对系统进行复位来防止系统故障,主要功能是看门狗功能和普通定时器功能。

  1. WDT 设置一定的计时时间,使能后,计数器开始计数。当计时时间到后,则触发系统复位
  2. 如果在定时时间到达之前,进行喂狗(计数器重装) 动作,则不会引起系统复位。
  3. 看门狗的定时时间可以由用户设定,可以根据需要在指定的时间内复位系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73049.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次docker虚拟机横向移动渗透测试

本次渗透在几个docker虚拟机间多次横向移动&#xff0c;最终找到了一个可以进行docker逃逸的出口&#xff0c;拿下服务器。渗透过程曲折但充满了乐趣&#xff0c;入口是172.17.0.6的docker虚拟机&#xff0c;然后一路横向移动&#xff0c;最终在172.17.0.2出实现了docker逃逸&a…

【vue2每日小知识】实现store中modules模块的封装与自动导入

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;省去我们store仓库中分模块时的需要每次导入index的问题 目录 【前言】在store中如何简…

ELK日志分析--Filebeat

ELK架构 Filebeat简介 Filebeat安装 Filebeat简单使用 专用日志搜集模块 案例模块-Nginx 模块 重读日志文件 使用Processors(处理器)过滤和增强数据 1.ELK架构 2.Filebeat简介 可以使用 Filebeat 收集各种日志&#xff0c;之后发送到指定的目标系统上&#xff0c;但是同…

软件测试面试题 —— 整理与解析(1)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

【华为OD机试真题】用 C++ 实现 - 数字加减游戏

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示&#xff0c;虽然月薪一两万&#xff0c;但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境&#xff0c;焦虑就会逐步放大&#xff0c;这时候副业赚钱的重要性就体现出来了。 发展第二职业&#xff0c;可以让程序员们增加抗风险能力&#xf…

数据结构-考研难点代码突破(树型查找 - 红黑树(RBT)插入流程图,删除)

文章目录1. 红黑树的定义和性质红黑树的插入操作流程红黑树的删除&#xff08;了解&#xff09;1. 红黑树的定义和性质 红黑树查找与删除的效率和AVL树相同。 但是因为AVL树在插入或删除节点可能破坏AVL树结构&#xff0c;而重新调整树的开销大。所以引出了红黑树。 红黑树的…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值&#xff0c;来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量&#xff0c;也可以是从前面接口请求中提取到需要的数据&#xff0c;然后进行遍历循环。 二、ForEach控制器相关…

技能提升:Python技术应用工程师职业技能提升

职业技术培训-Python技术应用工程师分为高级培训班、中级培训班及初级培训班。 Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的语言。最初被设计用于编写自动化脚本Shell&#xff08;适用于Linux操作系统&#xf…

Linux PWM 开发指南

Linux PWM 开发指南 1 概述 1.1 编写目的 介绍 PWM 模块的详细设计方便相关人员进行 PWM 模块的代码设计开发。 1.2 使用范围 适用于 Linux-3.10&#xff0c;linux-4.4 和 Linux-4.9 内核&#xff0c;Linux-5.4 内核。 1.3 相关人员 PWM 驱动的开发人员/维护人员等 2 术…

数据库系统概论——绪论

1、绪论 1.1、数据库系统概述 数据库系统的构成示意图 1.1.1、数据库系统基本概念 基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 1&#xff09;数据&#xff08;data&#xff09; 定义&#xff1a;描述事物的符号记录称为数据数据是数据库中存储的基本对象…

中科检测赴中科院广州电子CASAIM开展座谈会,围绕3D打印、三维扫描和精密测量展开深入交流

2月9日&#xff0c;中科检测技术服务(广州)股份有限公司&#xff08;简称&#xff1a;中科检测&#xff09;一行到访中科院广州电子技术有限公司&#xff0c;参观广东省增材制造工程实验室和三维扫描及精密测量重点实验室&#xff0c;就3D打印、三维扫描和精密测量相关技术内容…

NTP同步时钟为医院提供标准的时间信号

NTP同步时钟应用于城市重要公共领域&#xff0c;如车站、学校、医院、等。NTP同步时钟可提供准确的公众时间&#xff0c;为人们的日常生活提供便利&#xff0c;避免了因时钟不准确而带来的不便。NTP同步时钟采用智能模块化设计&#xff0c;与同类产品相比&#xff0c;更突出了安…

JavaScript Web API实战:7个小众技巧让你的网站瞬间提升用户体验

随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。但据了解&#xff0c;在100 多个 API中&#xff0c;只有5%被开发人员积极使用。 让我们来看看一些有用的Web API&#xff0c;它们可以帮助您将网站推向月球&#xff01; 1、 截屏接口 Screen Capt…

ELK日志分析--Logstash

Logstash简介 Logstash安装 测试运行 配置输入和输出 使用Geoip过滤器插件增强数据编辑 配置接收 Beats 的输入 1.Logstash简介 Logstash管道具有两个必需元素input和output&#xff0c;以及一个可选元素filter。输入插件使用来自源的数据&#xff0c;过滤器插件根据你的…

shell的测试语句

一、shell的条件测试语句 在写shell脚本时&#xff0c;经常遇到的问题就是判断字符串是否相等&#xff0c;可能还要检查文件状态或进 行数字测试&#xff0c;只有这些测试完成才能做下一步动作。 1.1、shell脚本中的条件测试如下&#xff1a; 1、文件测试 2、字符串测试 3、数…

《计算机组成与系统结构(第二版) 裘雪红 李伯成 西安电子科技大学出版社》课后习题答案(带解析)(三)

声明&#xff1a;此系列答案配套《计算机组成与系统结构&#xff08;第二版&#xff09; 裘雪红 李伯成 西安电子科技大学出版社》一书相关内容。所有内容为博主个人编辑&#xff0c;仅作参考学习交流之用&#xff0c;转载请注明出处。如发现错误&#xff0c;请联系博主及时勘误…

java JMM 内存屏障

内存屏障的目的 每个CPU都会有自己的缓存&#xff08;有的甚至L1,L2,L3&#xff09;&#xff0c;缓存的目的就是为了提高性能&#xff0c;避免每次都要向内存取。但是这样的弊端也很明显&#xff1a;不能实时的和内存发生信息交换&#xff0c;分在不同CPU执行的不同线程对同一…

基于SPI的增强式插件框架设计

很久之前&#xff0c;为了诊断线上的问题&#xff0c;就想要是能有工具可以在线上出问题的时候&#xff0c;放个诊断包进去马上生效&#xff0c;就能看到线上问题的所在&#xff0c;那该是多么舒服的事情。后来慢慢的切换到 java 领域后&#xff0c;这种理想也变成了现实&#…

【selenium 自动化测试】如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我&#xff0c;selenium学习难吗&#xff0c;基础入门的学习内容很多是3以前的版本资料&#xff0c;对于有基础的人来说&#xff0c;3到4的差别虽然有&#xff0c;但是不足以影响自己&#xff0c;但是对于没有学过的人来说&#xff0c;通过资料再到自己写的…