精华内容
下载资源
问答
  • 2021年计算机外设包含什么-计算机外设有什么组成.docx
    2021-07-21 01:05:20

    文档介绍:

    计算机外设包含什么:计算机外设有什么组成

    你们知道电脑外设是什么吗?知道电脑外设包含什么吗?下面是xx搜集整理有关电脑外设包含什么的资料以供大家参考学****期望大家喜爱。

    电脑外设

    电脑外设就是除主机外的大部分硬件设备全部可称作外部设备,或叫外围设备,简称外设。计算机系统没有输入输出设备,就如计算机系统没有软件一样,是毫无意义的。

    简述

    外部设备大致可分为三类:1.人机交互设备,如打印机,显示器,绘图仪,语言合成器。2.计算机信息的存放设备,如磁盘,光盘,磁带。

    电脑外设有下列部件

    打印机

    .机-机通信设备,如两台计算机之间可利用电话线进行通信,它们能够经过调制解调器完成。外设能够简单的了解为输入设备和输出设备。如显示器只是用来显示电脑信息的输出设备, 鼠标键盘是用来输入信息的输入设备,全部属于外设。计算机系统中输入、输出设备和外存放器的统称。对数据和信息起着传输、转送和存放的作用。是计算机系统中的主要组成部分。外围设备包括到主机以外的任何设备。外围设备是隶属的或辅助的和计算机连接起来的设备。外围设备能扩充计算机系统。外部设备是指连在计算机主机以外的设备,它通常分为输入设备和输出设备,下面分别对这两种设备加以介绍:

    显示器

    显示器是一个输出设备,现在流行的为液晶显示器(LCD),高端的LCD显示器已经能够和CRT的画质相媲美,完全能够甩掉CRT显示器。LCD显示器也有辐射,只不过大多在背部,辐射量较小。现在常见的显示器的大小从寸到24寸不等。

    鼠标

    鼠标是Windows的基础控制输入设备,比键盘更易用。这是因为Windows含有的图形特征需要用鼠标指定并在屏幕上移动点击决定的。鼠标的外形各异。 1

    键盘

    键盘属于计算机硬件的一部分,它是给计算机输入指令和操作计算机的关键设备之一,汉字汉字、英文字母、数字符号和标点符号就是经过键盘输入计算机的。键盘的款式有很多个,我们通常使用的有101键、105键和108键等等的键盘。不论是哪一个键盘,它的功效和键位排列全部基础分为功效键区、打字键区、xx键区、数字键盘也称小键盘和指示灯区五个区域。

    摄像头正确地掌握键盘的操作能够减小输入的错误和降低疲惫,端坐在计算机前面,手肘贴身躯,手腕要平直,十只手指稍微弯曲放在基础键上,调整好坐姿,身体保持平直放松腰背不要弯曲。输入才正确快速地敲击按键,输入完成以后手指就返回基础键位,力量要平均,速度则视熟练的程度加以提升。

    调制解调器

    调制解调器(MODEM)其作用是利用模拟信号传输线路传输数字信号。我们通常所说的电子信号关键分为两种,一个是"模拟信号",一个是"数字信号"。那么,我们所使用的电话线路传输的是模拟信号,而PC机之间传输的是数字信号。因此当我们想经过电话线把自己的电脑连入Internet时,就必需使用调制解调器来"翻译"两种不一样的信号。连入Internet后,当PC机向Internet发送信息时,因为电话线传输的是模拟信号,因此必需要用调制解调器来把数字信号"翻译"成模拟信号,才能传送到Internet上,这个过程叫做"调制"。当PC机从Internet获取信息时,因为经过电话线从 Internet传来的信息全部是模拟信号,因此PC机想要

    内容来自淘豆网www.taodocs.com转载请标明出处.

    更多相关内容
  • 里面包含chm原版文件以及解压后的网页文件,原版文件为全英文,中文可通过网页文件使用浏览器进行中文翻译
  • APB总线外设接口实现

    2022-04-07 22:54:58
    一、AMBA2 APB外设框图 AMBA2中APB的接口信号里没有PREADY信号和PSTRB信号,这些是在AMBA3及以后的协议中更新出来的,时序图在上一期的文章中已经讲解过了,这里不再重复。 二、APB接口代码分析讲解 这一章主要讲...

    author:jaime_zhang
    e-mail:jaime_zhang@foxmail.com
    有问题欢迎大家来交流。

    一、AMBA2 APB外设框图

    在这里插入图片描述
    AMBA2中APB的接口信号里没有PREADY信号和PSTRB信号,这些是在AMBA3及以后的协议中更新出来的,时序图在上一期的文章中已经讲解过了,这里不再重复。

    二、APB接口代码分析讲解

    在这里插入图片描述在这里插入图片描述

    这一章主要讲接口的实现,APB接口比较简单,实现起来也相对easy,这种接口在我个人看来主要用来读写寄存器这种对数据吞吐率没那么高的操作。APB接口的实现也就是要将总线信号转化为更直观的信号,将复杂时序转化为更简单的时序,我将这种转换简称为“翻译”。
    对于写操作,传输过来的地址和控制信号在第一个时钟周期里,数据在第二个周期完成传输。考虑到APB总线在数据未完成传输前地址不会变化,这里可以简化掉地址的一拍寄存,从而节省寄存器资源,节省面积,相关代码如下。

    assign wr_reg_en = PSEL & PENABLE & PWRITE;
    assign rd_reg_en = PSEL &  (~PENABLE) & (~PWRITE);
    assign wr_reg_strb = PSTRB;
    assign rw_reg_addr = PADDR;
    assign wr_reg_data = PWDATA;
    
    assign PREADY = rw_reg_ready;
    assign PSLVERR = rw_reg_resp;
    assign PRDATA = rd_reg_data;
    

    可以看到这里没有时序逻辑,直接通过组合逻辑即可实现,可见该接口的简洁与轻量级,当PSEL拉高,也就是该外设被选中时,PENABLE为高电平且PWRITE信号为高,也就是在写操作第二个周期里,这是接到寄存器端的写使能信号wr_reg_en为高。读操作同理分析。给到寄存器的strb,addr,data信号都是直接连接传进来的对应总线信号即可。
    对于APB接口的输出信号:PREADY,PSLVERR,PRDATA,这些直接连接寄存器传来的ready,response,data信号即可,ready往往直接接高电平,也就是always ready的状态,对于寄存器而言数据传输也就只需要一拍,所以直接接高电平。PSLVERR信号往往直接接低电平,因为读写寄存器不会出现什么错误,也可以用来判断地址是否超出,即使出现了错误,主设备一般也很少存在处理错误的操作。PRDATA接寄存器传来的读出数据,这里只是一种实现方式,还可以更严格的按照手册描述的实现,但这样足以满足一般使用要求,同时资源开销接近最少。
    有兴趣的可以想想还可以怎么实现,这里就不再讲解第二种实现方式了,给大家留点思考的空间。

    本专栏会从比较基础的数字ic及FPGA项目开始讲起,逐渐加大难度,大家有什么建议或者想了解的都欢迎和我交流,感兴趣的可以订阅一下。
    下期准备讲解AHB总线协议及实现。

    展开全文
  • stm32外设总结-定时器使用

    千次阅读 2022-03-09 13:18:15
    3、单脉冲模式来写延时函数 我们在配置定时器的时候可以看到居然有这样一个选项,翻译下是单脉冲模式的意思 好家伙试了下要是用来做基本定时实验的时候这个功能千万不要勾选,不然的话就会一直亮着,就不会1s闪烁一...


    本文用到的实验平台:

    • 野火MINI-stm32开发板
    • STM32CUBE-IDE开发工具

    1、stm32定时器资源概述

    关于定时器,野火《零死角玩转 STM32F103》一书中介绍如下,并用一张框图概括总结了stm32定时器的功能
    在这里插入图片描述
    基本上定时器都会有时基,要不怎么叫定时器呢,定时器的时钟框图如下所示
    在这里插入图片描述
    时钟源就是内部时钟,高级定时器挂载在APB1总线,基本和通用定时器都是挂载在APB2总线下的,不过最后经过一系列倍频什么的都是72Mhz,如下所示
    在这里插入图片描述
    经过时钟源后就进入了PSC预分频器,就是CK_CNT,CK_CNT用来驱动计数器计数。 PSC 是16 位的预分频器,可以对定时器时钟进行 1~65536 之间的任何一个数进行分频,具体计算方式为:CK_CNT=72Mhz/(PSC+1)

    再之后就进入计数器CNT,CNT也是16位的计数器,最大计数值为65535,当计数值达到自动重装载寄存器的时候就产生更新事件,并重新进行计数。当然自动重装载寄存器的值也是我们设置的,自动重装载寄存器ARR也是一个16位的寄存器,当计数值达到这个值的时候,就会产生更新事件,比如中断事件,触发其他外设的事件,或者复位计数器的事件。

    所以最终定时时间为:

    在这里插入图片描述
    以stm32的基本定时器6为例,打开配置页面就可以看到我们上面讲的一些寄存器了
    在这里插入图片描述

    2、使用定时器基本定时

    以定时器6为例,配置分频系数和自动重装载值
    在这里插入图片描述
    并开启中断
    在这里插入图片描述
    在初始化函数中开启定时器中断
    在这里插入图片描述
    编写中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	static uint32_t time = 0;
        if(htim==(&htim6))
        {
        	time++;
        	if(time == 1000) //1ms计数1000次就是1s
        	{
        		time = 0; //及时复位计数值
        		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        	}
        }
    }
    

    将程序下载到开发板就能看到led一秒闪烁一次了!!!

    3、单脉冲模式来写延时函数

    我们在配置定时器的时候可以看到居然有这样一个选项,翻译下是单脉冲模式的意思
    在这里插入图片描述
    好家伙试了下要是用来做基本定时实验的时候这个功能千万不要勾选,不然的话就会一直亮着,就不会1s闪烁一次了
    在这里插入图片描述

    为啥呢,原来TIMx_CR1的OPM位

    位 3 OPM:单脉冲模式 (One-pulse mode)

    • 0:计数器在发生更新事件时不会停止计数
    • 1:计数器在发生下一更新事件时停止计数(将 CEN 位清零)

    在这里插入图片描述
    都不会停止计数了啊,那就只会发生一次中断了,那就肯定就没有1s的led亮灭了啊,但是根据这个特性我们就可以做延时函数了,嗯,确实不错!!!

    那要延时的话必然得整个us级别的吧,ms的他都有了还整啥,所以我们配一个us的计数

    在这里插入图片描述

    编写延时函数如下:

    void delay_us(uint32_t us)
    {
    	TIM6 -> ARR = us - 1;
    	TIM6 -> CR1 |= TIM_CR1_CEN;
    	while(TIM6->CR1&TIM_CR1_CEN);
    }
    

    之后在主函数中开启定时器

    在这里插入图片描述
    还是来写比肩方便的io翻转的函数
    在这里插入图片描述
    之后我们再用逻辑分析仪来测试读取
    在这里插入图片描述
    可以看到还是有点效果的hhh!!!

    us延时的方案再次加一

    4、外部时钟输入

    一般我们在使用定时器的时候常见的是内部时钟,但其实也可以外部,我们一般都直接忽略过去了,因此这里我做下介绍!
    在这里插入图片描述
    这里我们配置下这个时钟,配置信息如下所示

    在这里插入图片描述
    同时我们可以看到引脚上多了一个外部时钟输入引脚
    在这里插入图片描述
    同时我们开启下外部中断,方我们进行后续的中断处理
    在这里插入图片描述

    那么时钟是啥呢,我们最通俗的理解不就是方波吗,一段时间高一段时间低电平的这个样子,因此我们在软件中来产生一个方波,当然我们同样可以借用外部设备来实现这个功能,效果是一样的!!!

    下面正式开启代码部分的编写

    • 回调函数
      在这里插入图片描述
    • 产生时钟
      在这里插入图片描述
      硬件设备上做一下短接,这样就能看到现象了
      在这里插入图片描述
      根据我们之前的设计,不分频,十个周期进行一次中断,那就是1s一次中断了!!!

    同时我们回去看他的配置页面,关于分频系数这里,比如如果我们设置了分频,那么我们计数时间会变的更长,因为频率被分掉了,没有那么快了,这个可以和使用内部时钟的概念来看!
    在这里插入图片描述

    5、输入捕获测量频率和脉宽

    定时器具有输入捕获功能,可用于测量脉宽,频率等

    大致示意图如下所示
    在这里插入图片描述

    在cubemx中的配置如下所示:
    在这里插入图片描述
    其实他还是时基,然后根据上升沿下降沿来计数的一种方式,这里我用的最小计数周期为1us,然后最大计数值为65535,选择了上升沿捕获。
    在这里插入图片描述
    同时用另一个定时器来生成PWM,关于PWM配置的详细问题,下面的部分有专门的介绍
    在这里插入图片描述
    之后我们在初始化函数中开启捕获
    在这里插入图片描述
    具体代码如下所示

      __HAL_TIM_CLEAR_FLAG(&htim3,TIM_IT_UPDATE);
      HAL_TIM_Base_Start_IT(&htim3);
      HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
    
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,200);
    

    之后我们编写捕获完成回调函数,回调函数的位置如下图所示:
    在这里插入图片描述
    定义一个变量来获取捕获值
    在这里插入图片描述
    之后我们进入调试查看,我们这个代码比较简陋,因此我们只坐一次捕获试试效果!
    在这里插入图片描述
    运行程序,可以看到程序暂停在断点处,同时查看变量情况如下
    在这里插入图片描述
    我们在查看下逻辑分析仪结果,两次上升沿之间时间间隔为1000us左右,基本是没问题的!
    在这里插入图片描述
    那下面我们开始完善代码,让他可以连续读取,并处理脉宽什么的了,简单而言就是捕获到上升研的时候设置下降沿捕获,捕获到下降沿的时候设置为上升沿捕获,这样就行了

    以测量一个按键的高低电平时间为例:

    从原理图上查到按键的位置为PA1
    在这里插入图片描述
    设置为输入模式,最长记录时间65536us

    在这里插入图片描述
    这里我们开启中断用于计数
    在这里插入图片描述

    下面开始编写代码

    事先准备好需要的变量
    在这里插入图片描述

    uint32_t ccr_cnt,period_cnt;
    uint8_t tri_flag,end_flag;
    uint32_t cnt_cl=72000000/72;;
    float time;
    

    计数部分代码如下
    在这里插入图片描述

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	period_cnt++;//中断计数
    }
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    	if(tri_flag==0)
    	{
    		period_cnt=0;//中断次数清零
    		__HAL_TIM_SET_COUNTER(&htim2,0); 
    		ccr_cnt=0;
    		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
    		tri_flag=1;
    	}
    	else
    	{
    		ccr_cnt=__HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
    		//ccr_cnt=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//功能同上
    		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
    		tri_flag=0;
    		end_flag=1;//捕获完成标志
    	}
    }
    

    下面在主函数里编写函数读取
    在这里插入图片描述

    	  	if(end_flag==1)//结束捕获
    	  	{
    	  		time=(float)(period_cnt*1000+(ccr_cnt+1))/cnt_cl;//结果强制转换为浮点型
    	  		printf( "\r\n测得高电平脉宽时间:%.3fs\r\n",time);//输出结果保留小数点后两位
    	  		end_flag=0;
    	  	}
    

    下载到开发板,按下按键,可以看到结果如下,测试正常!
    在这里插入图片描述

    下面我们来读取频率和脉宽,我们用一个定时器生成PWM,用另一组定时器的输入捕获通道来读取他的数值

    TIM2产生PWM
    在这里插入图片描述
    TIM3输入捕获
    在这里插入图片描述

    首先还是设置相关标志位

    #define cnt_clk 72000000/(71+1)
    #define arr 65535 //最大计数周期
    uint32_t ccr_cnt1,ccr_cnt2;
    uint32_t Period_cnt,Period_cnt1,Period_cnt2;
    uint32_t ic_flag,end_flag;
    float duty_cycle,frequency; //记录频率和脉宽
    

    中断函数处理如下
    在这里插入图片描述
    完整代码如下:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	Period_cnt++;
    }
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    	switch(ic_flag)
    	{
    		case 0://第一个上升沿捕获
    		{
    			__HAL_TIM_SET_COUNTER(&htim3,0);
    			ccr_cnt1=0;
    			ccr_cnt2=0;
    			Period_cnt=0;
    			Period_cnt1=0;
    			Period_cnt2=0;
    			__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING); 
    			ic_flag=1;
    			break;
    		}
    		case 1://第一个下降沿捕获
    		{
    			ccr_cnt1=__HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_1);
    			Period_cnt1=Period_cnt;
    			__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);	
    			ic_flag=2;	
    			break;
    		}
    		case 2://第二个上升沿捕获
    		{
    			ccr_cnt2=__HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_1);
    			Period_cnt2=Period_cnt;
    			ic_flag=0;	
    			end_flag=1;
    			break;
    		}
    		default:
    		break;
    	}
    }
    

    最终的输出代码如下所示
    在这里插入图片描述
    源代码如下,因为PWM的速度比较快,所以建议还是加个延时函数比较好

    	  	if(end_flag==1)
    	  	{
    	  		duty_cycle=(float)(Period_cnt1*(arr+1)+ccr_cnt1+1)*100/(Period_cnt2*(arr+1)+ccr_cnt2+1);
    	  		frequency=(float)cnt_clk/(Period_cnt2*(arr+1)+ccr_cnt2+1);
    	  		printf("频率%.2f,占空比%.2f\r\n",frequency,duty_cycle);
    	  		end_flag=0;
    	  	}
    		HAL_Delay(1000);
    

    下载到开发板,打印结果如下所示:
    在这里插入图片描述

    6、PWM输入

    上面我们用的是软件的方式进行的测量脉宽,但是同样的我们可以用硬件的方式,这个在野火的教程中讲的较为详细
    在这里插入图片描述
    具体介绍如下
    在这里插入图片描述
    PWM 信号由输入通道 TI1 进入,因为是 PWM 输入模式的缘故,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2。其中一路是周期,另一路是占空比,具体哪一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可,因为是 PWM 输入的缘故,另一路信号则由硬件配置,无需软件配置。

    同时注意:使用 PWM 输入模式的时候必须将从模式控制器配置为复位模式,这个在我们下面的配置中将体现出来

    PWM输入模式时序如下所示:
    在这里插入图片描述
    测量原理为:PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和 IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候, IC2 捕获,此时计数器CNT 的值被锁存到捕获寄存器 CCR2 中,到了下一个上升沿的时候, IC1 捕获,计数器CNT 的值被锁存到捕获寄存器 CCR1 中。其中 CCR2+1 测量的是脉宽, CCR1+1 测量的是周期。 这里要注意的是 CCR2 和 CCR1 的值在计算占空比和频率的时候都必须加 1, 因为计数器是从 0 开始计数的。

    在cubemx中配置如下所示:

    可以看到两个通道其实是共用一个引脚的
    在这里插入图片描述
    编写输入捕获部分代码如下所示
    在这里插入图片描述
    源代码

    uint32_t Cap_val1,Cap_val2;
    float Duty,Frequency;
    
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    	Cap_val1 = HAL_TIM_ReadCapturedValue (&htim3 ,TIM_CHANNEL_1 );
    	Cap_val2 = HAL_TIM_ReadCapturedValue (&htim3 ,TIM_CHANNEL_2 );
    	if(Cap_val1 != 0)
    	{
    		Duty = (float )(Cap_val2+ 1)*100 / (Cap_val1 +1) ;
    		Frequency = 72000000 / 72 / (float )(Cap_val1 +1) ;
    	}
    }
    
    

    在主函数中编写读取代码
    在这里插入图片描述
    将程序下载到开发板,可以看到效果如下,非常准确
    在这里插入图片描述
    既准确又方便,但是牺牲了一个定时器,看来也不全是好事啊哈哈哈!!!

    7、PWM输出

    PWM是我们经常要用到的外设,在电机控制等方面有很广泛的应用

    百度百科上的解释如下所示 :PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

    通俗点一句话就是:PWM是数字量(01两种状态),PWM常用于模拟,任何模拟值都可以用PWM进行编码

    一般我们在配置PWM的常用操作如下所示:

    选择为PWM输出模式
    在这里插入图片描述
    设置时基等基本参数,之后配置通道
    在这里插入图片描述
    编写代码如下所示

      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //开启pwm通道
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
    
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,200); // 设置tim输出值
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,400);
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,600);
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,800);
    

    使用逻辑分析仪查看值,关于这里的计算,可以参考上面讲到的基本定时器时基配置,基本差不多,区别就在与当计数值达到CCR的时候被截断了!
    在这里插入图片描述
    这样我们就能看到pwm比较完整的状态了,下面我对刚才讲到的一些参数进行说明:

    • PWM模式

    stm32有两种pwm模式:

    模式CNT计数方式说明
    PWM1递增CNT<CCR,通道有效
    PWM1递减CNT>CCR,通道有效
    PWM2递增CNT>CCR,通道有效
    PWM2递减CNT<CCR,通道有效

    简单来说就是如果其他参数相同,PWM1和PWM2模式输出的PWM是互补的!

    • 极性

    上面讲到了通道有效,那么通道有效是高电平还是低电平呢,这个就是极性,就是极性选择高通道有效时候输出的就是高电平,反之输出的是低电平!

    • Pulse

    这个其实就是初始设置的CCR值了,默认情况下是0,我们如果想上电就输出PWM,那就要事先给他设置好相应的值,当然你也可以就是在初始化中使用软件设置!

    软件设置的代码如下:

    首先开启定时器PWM输出

     HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
    

    设置比较值

    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,200);
    
    • fast_mode

    暂时还不清楚

    8、PWM输出的一些模式

    • 对齐模式,这个好像不是PWM独有的,因为他是一种计数模式,定时器的一些功能应该都有的,我们点开定时器的这个计数模式查看如下:可以看到除了向上向下计数还有几种模式可以选的
      在这里插入图片描述
      这其实就是对齐模式,分别为左对齐,右对齐,中心对齐,左右对齐可以统一称为边缘对齐模式,其实也很好理解,pwm不是输出01吗,然后就是计数过程中达到一个值就会突变,就是怎么去靠近这个值得方法呗,用同样的一条水平线去截取下面的图像都会有不同的结果!

    9、PWM互补输出

    顾名思义,互补的PWM就是互相补充嘛,就是PWM之间相互补充输入,一个输出高的时候另一边就输出低电平

    在cubemx中配置互补输出如下所示:
    在这里插入图片描述
    启动代码也要做相应修改,添加互补输出的PWM开启函数:
    在这里插入图片描述
    将程序下载到开发板并接上逻辑分析仪效果如下所示
    在这里插入图片描述
    当然在互补中我们还看到有刹车和死区的部分,其实死区是一直存在的,只是时间比较短,因为这是硬件的伤
    在这里插入图片描述
    野火教程解释如下:在这个半桥驱动电路中, Q1 导通, Q2 截止,此时我想让 Q1 截止 Q2 导通,肯定是要先让Q1 截止一段时间之后,再等一段时间才让 Q2 导通,那么这段等待的时间就称为死区时间,因为 Q1 关闭需要时间(由 MOS 管的工艺决定)。如果 Q1 关闭之后,马上打开 Q2,那么此时一段时间内相当于 Q1 和 Q2 都导通了,这样电路会短路。

    关于死区时间的计算我在下面的图中已经注明,为了较明显的看到死区的效果,我这里增大频率,同时设置一个相对较大的死区时间

    在这里插入图片描述
    将程序下载到开发板可以看到效果如下所示:

    在这里插入图片描述

    10、编码器模式

    关于编码器模式我在之前的一篇文章中有讲到过 直流编码电机双闭环(速度+角度)控制

    这里仅仅是为了让整个体系更完善一点,加入了这个部分,详情可以看那篇文章的介绍!

    cube中的配置如下
    在这里插入图片描述
    这里编码器模式可以选T1,T2,T12三种模式
    在这里插入图片描述
    详情还是看那篇文章吧!

    11、基于定时器的伪系统

    因为系统就是时间的调度吗,所以我们就可以用一个硬件定时器衍生出很多不同的软件定时器(假的),大致思路如下:

    首先产生一个1ms周期的中断

    在这里插入图片描述
    之后我们编写回调函数,利用一个变量的判断实现不同阶段的延时,在延时里面可以设置周期任务之类的,同时在最终将这个变量清零,并翻转led,led的闪烁状况就可以作为系统运行的标志!
    在这里插入图片描述
    源码如下所示:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	static uint32_t time = 0;
        if(htim==(&htim6))
        {
        	time++;
        	if(time % 2 == 0) // 2ms的周期任务
        	{
        		// xxx		
        	}
        	if(time % 5 == 0) // 5ms的周期任务
        	{
        		// xxx		
        	}
        	if(time % 10 == 0) // 10ms的周期任务
        	{
        		// xxx		
        	}
        	if(time == 1000) //1ms计数1000次就是1s
        	{
        		time = 0; //及时复位计数值
        		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //用作系统运行指示灯
        	}
        }
    }
    

    12、更多!!!

    定时器可以算是stm32非常重要的外设了,我这篇也仅仅是部分的记录,还有比如无刷电机控制相关的,一些工业应用诸如刹车,死区等都没有讲或者很详细的介绍,希望以后都能一一接触到,并继续分享!!!

    展开全文
  • 原网站内容是英文,介绍的很详细,特翻译:Nick Gammon的有关I2C的页面(关于I2C的原理介绍很详细:[http://gammon.com.au/i2c](http://gammon.com.au/i2c)(该页面上还有一个“ I2C扫描程序”)。
  • musb 中文翻译和英文文档.可以通过会话请求协议(SRP)发起USB流量,而双角色设备同时支持SRP和主机协商协议(HNP),并且可以根据需要担任主机或外设的角色。MUSBMHDRC还支持拆分事务,这反过来允许它支持使用带有USB ...
  • 本手册介绍了32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库。译文英文原版为 UM0427 Oct. 2007 Rev 2。此份固件库用户手册的整体架构如下: 1....3.固件库具体描述:设置架构和每个外设的函数。
  • stm32外设之ADC|DAC总结

    2022-02-10 21:04:02
    而f4系列的芯片可以同时使用三路ADC 将这些模式翻译下如下所示 当然其实这些笔记里面都讲过了 下面来进行配置,双路ADC的模式太多,这里仅介绍常用的,其他的就不介绍了,可以自行查看手册翻阅,这里使用的是快速...

    最近看了一张图觉得很有意思,可以看看我们目前的阶段hhh

    在这里插入图片描述

    adc是很重要的外部设备,使用adc可以进行很多方面的测量等,但是基本的教程如正点原子,野火等这方面都讲的比较单一,只是知道怎么用就够了,而没有让我们更好的去了解这样的一个设备,因此这里我来将我的理解做一个总结。

    其实at官方也有一本很好的资料讲了这些东西,概述了st的adc的一些功能,如下所示:
    在这里插入图片描述
    我上传到gitee了,链接:STM32的ADC应用笔记

    本文用到的实验平台:

    • 野火MINI-stm32开发板
    • STM32CUBE-IDE开发工具

    一、DAC

    1、直接触发

    在这里插入图片描述
    在初始化中编辑如下代码

      HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
      HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
      HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 4095);
      HAL_DAC_Start(&hdac,DAC_CHANNEL_2);
    

    注意这里初始化代码不可以写成:
    在这里插入图片描述
    这样两个io口输出的都是DAC2的参数,具体原因还不太清楚,实验结果是这样的

    2、使用波形发生器

    在这里插入图片描述
    定时器还是配置为事件更新
    在这里插入图片描述
    初始化中加入代码

      HAL_TIM_Base_Start(&htim2);
      HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
    

    效果如下
    在这里插入图片描述

    关于这里频率的计算:
    在这里插入图片描述
    前面是定时器周期,然后他是单次累加上去的,所以就是从0-4095这样加上去,再从4095-0这样一个来回,就是一次正弦波,所以计数4096*2次,所以周期大概就在439HZ

    3、DAC使用DMA来配置输出

    这里不需要用他的内部波形功能了
    在这里插入图片描述
    开启dma并设置循环模式
    在这里插入图片描述
    这里定时器还是选择事件来更新
    在这里插入图片描述

    这里我们准备好需要的正弦波的数据

    uint16_t sin_Data[] = {
    		2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, 4093, 4031, 3887, 3668, 3382, 3042, 2661,
    		2255, 1841, 1435, 1054, 714, 428, 209, 65, 3, 24, 127, 310, 564, 878, 1240, 1636, 2048
    };
    

    添加初始化函数

      HAL_TIM_Base_Start(&htim2);
      HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_2, (uint32_t *)sin_Data, 32, DAC_ALIGN_12B_R);
    

    使用示波器得到下面的结果
    在这里插入图片描述
    这里计算方法还是一样的,就大概是112khz
    在这里插入图片描述

    二、ADC

    1、stm32adc的理解

    首先来看下正点原子的教程中写的:
    在这里插入图片描述

    • 这里其实就是一个很好的总结了,首先是独立模式和双重模式,就是ADC外设单独使用,比如ADC1,ADC2这样的,不同的外设使用起来互不干扰,双重模式是啥呢,就是两个ADC一起使用,交替进行。
    • 然后是单次,连续,扫描或者间断进行,这就是下面要讲的各个模式的特点了
    • 然后是左右对齐,st的ADC是12位的逐次逼近型的ADC,所以采集的有效数据就是12位的,但是确保存在16位的寄存器中,这样不就有了左对齐和右对齐了吗,当然这样还会在比如我们使用DMA传输的时候,传输什么样大小的字节有关系喽

    下面提到了ADC的时钟,可以看到ADC转换速率最快能有1Mhz,这个结果又是怎么出来的呢,因为ADC转换一次的时间一般就是采样时间+转换时间,而转换时间官方说明了是12.5个周期,而采样时间最小是1.5个周期,这样在最快的时钟下不就是14个周期吗,然后始终是14M,这样就是1Mhz的采样速率了
    在这里插入图片描述
    下面讲到了注入组和规则组,通俗理解注入组就像是中断一样,会打断规则组,完成注入组的采样,之后结束在进入规则组
    在这里插入图片描述
    下面的部分讲到了他的这个两个比较重要的寄存器,一个是使能发送的寄存器,一个是接收数据的寄存器
    在这里插入图片描述
    下面看下ADC的硬件部分
    在这里插入图片描述

    • 首先就讲清楚了作为一个逐次逼近型的ADC的本质,就是和VREF+还有VREF-进行比较接近的,另外还有两个模拟电源接口,就是通过这两个引脚来进行逐次逼近的,当然采样用的还是ADC外设连接的引脚,这个在2中体现出来了,3就是上面讲到的注入通道和规则通道了,4就是我们st给他设置的时钟。这里我们一般使用12Mhz即可,如下所示:
      在这里插入图片描述
    • 5就是使用外部触发来转换,前面提到了ADC_CR2这个寄存器,ADC转换的开始与结束可以由这个寄存器来控制,也可以使用外部事件来触发,常用的就是定时器了,这样效果比再循环中不断地启用定时器效果要好点!

    2、ADC在CUBEMX中的配置了解

    打开cube配置好基本时钟后,选择ADC,使能ADC可以看到如下内容,值得关注的是他也提供了关于内部温度传感器还有参考电压引脚的接口
    在这里插入图片描述
    下面是ADC的配置接口,这里可以很快的看到三个模式(注意F4的话和这个页面不太一样)
    在这里插入图片描述
    关于这个的理解:

    • 扫描模式只在多通道ADC的时候有效,这样配置扫描模式使得通道按照配置的循环次序进行依次转换,而单次模式(就是关闭连续转换模式)无论是单通道还是多通道都是进行一次,连续模式就是不停的扫描
    • 关于不连续转换模式,也称为间断模式,这里官方解释是:该设置只在连续转换失能的时候该参数才有效,否则这个参数就被抛弃
    • 另一种解释就是不连续转换就是不一定要转换完所有通道(连续模式是转换完所有的哦),而是指定这个序列中的n的通道

    下面看看采样周期相关的,在下面的设置中显示了采样周期,如果使用多个通道的话这里就要设置好先后已经周期
    在这里插入图片描述
    同样根据常识,st外设的三种模式,轮询,中断还有DMA

      HAL_ADC_Start(hadc);
      HAL_ADC_Start_IT(hadc);
      HAL_ADC_Start_DMA(hadc, pData, Length);
    

    在这里还有一个比较重要的自校准函数,虽然不知道能有啥用,但校准总比不校准好啊

    HAL_ADCEx_Calibration_Start(&hadc1); //adc的自校准
    

    上面的这几个函数将在下面广泛出现

    3、单通道采集

    直接轮询采集

    相对比较方便,直接设置即可
    在这里插入图片描述
    初始化代码

    HAL_ADC_Start(&hadc1);
    

    采集代码

    	HAL_ADC_PollForConversion(&hadc1, 50); // 转换函数,等待时间50ms
    	singel_adc = HAL_ADC_GetValue(&hadc1); // 获取ADC采样值
    	HAL_ADC_Start(&hadc1); // 再次开启采集
    	//可适当自行延迟
    

    我们查看效果,采集很成功!
    在这里插入图片描述
    现在我们对配置做一些小修改,打开连续转换模式
    在这里插入图片描述
    因为使能了连续转换,故而不在需要我们手动的去使能转换了
    在这里插入图片描述

    使用中断触发

    在前面的配置中加入中断
    在这里插入图片描述

    使用中断采集

    在这里插入图片描述
    中断采集函数,可以看到这里我又注释了启动中断采集函数,因为前面已经使能了连续转换,所以ADC本身就会不断地触发中断,就不需要我们自己在中断函数里面手动采集了

    void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
    {
    	HAL_ADC_PollForConversion(&hadc1, 50);
    	singel_adc = HAL_ADC_GetValue(&hadc1);
    //	HAL_ADC_Start_IT(&hadc1);
    }
    

    使用DMA来传输

    下面我们关掉中断,并打开DMA传输,这里使用半字即可,注意开启循环模式,因为我们前面使能了连续转换模式,所以这里要使能循环模式,那么如果不使能循环模式咋办呢,那就直接也不使能连续转换模式,然后在while循环里面轮询呗,但这样DMA存在的意义就很弱了!!!
    在这里插入图片描述
    下面是代码设置
    在这里插入图片描述
    可以看到单次转换跟是否使用循环模式息息先关啊

    4、使用定时器触发

    无需设置任何中断,事件触发后不断地将数据转移到内存中,所以这里就需要配置DMA来传输,DMA配置如下,这里因为传输大小是16位的,所以设置为半字节即可。
    在这里插入图片描述
    ADC设置如下,无需设置任何中断

    在这里插入图片描述
    定时器设置如下
    在这里插入图片描述
    在main.c中添加代码
    在这里插入图片描述
    这里接收的数据我们根据我们在DMA中设置的来就行DMA中设置的是半字,所以这里设置为uint16_t即可
    在这里插入图片描述
    但是他这里用的DMA接收函数,接收的数据参数是32位的,所以要强制转换下,如下所示
    在这里插入图片描述
    之后我们启用debuge,将变量放到现场表达式查看,可以看到功能正常
    在这里插入图片描述

    5、多通道采集

    多通道轮询采集

    配置多通道轮询模式,这里我关闭连续转换,这里配置各个通道要改为对应的通道1234哦
    在这里插入图片描述
    编写采集函数代码如下:

    	  for(uint8_t i=0;i<4;i++)
    	  {
    		HAL_ADC_Start(&hadc1);
    	  	HAL_ADC_PollForConversion(&hadc1, 50);
    	  	adc_value[i] = HAL_ADC_GetValue(&hadc1);
    	  }
    	  HAL_Delay(10);
    

    下面我们开启连续转换模式试试

    在这里插入图片描述
    代码部分如下所示,经过实测这种方式采样的话,十分混乱,就是各个ad的值在不停的移位,暂不清楚原因,等以后知道了在更新上!!!
    在这里插入图片描述

    下面尝试下多通道中断采集

    使用连续转换试试,然后这样就不用写启动函数

    在这里插入图片描述
    使能中断触发
    在这里插入图片描述
    编写中断采集函数

    void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
    {
    
    	for(uint8_t i=0;i<4;i++)
    	{
    		HAL_ADC_PollForConversion(&hadc1, 50);
    		adc_value[i]=HAL_ADC_GetValue(&hadc1);
    	}
    }
    

    这里我发现两个问题:

    • 采样周期不可以设置的过大,设置的过大,中断会出问题,比如我设置为239.5个周期的时候出现了通道混乱的情况,就是几个通道的值一模一样,同时改变
    • 本身这个通道会错位,就是通道号码和采集数据的数组不对应
    • 然后这个似乎只能用连续采样,选择单次采样的话一直失败,无法进入中断函数

    下面用DMA来采集

    DMA这里使能连续转换,然后DMA开启循环传输,就跟上面的单次采样一样了
    在这里插入图片描述
    之后我们只需要写一个DMA开启的函数即可
    在这里插入图片描述
    我看其他人博客的时候有看到关于DMA传输的时候关于半字还是一个字节的问题,这个我觉得还是有点意思的,这里做一个说明:
    在这里插入图片描述

    • 使用半字还是一个字节都是可以的,因为收到的数据是12位的,所以都行
    • 影响在于如果使用半字的话,那我们用来存的数组也要定义为uint16_t的,如果是一个字节的就是uint32_t
    • 然后一点就是不管是半字还是一个字节启动函数要用32位强制转换,因为这个函数就这么写的

    在这里插入图片描述

    6、注入通道的使用

    注入通道类似中断处理,不过我感觉挺鸡肋的,不知道啥地方能用上,这里只是做个记录,使用四个规则,两个注入
    在这里插入图片描述
    编写函数如下所示
    在这里插入图片描述
    使用的代码如下:

    	  HAL_ADCEx_InjectedStart(&hadc1);
    	  HAL_ADCEx_InjectedPollForConversion(&hadc1, 1000);
    	  adc_val[0] = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1);
    	  adc_val[1] = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_2);
    	  HAL_Delay(50);
    

    使用debug查看仿真
    在这里插入图片描述
    当然除了软件启动之外还可以使用定时器来触发,这个其实就跟其他的一样了,就不继续试验了
    在这里插入图片描述

    7、使用双路ADC采集

    前面有提到ADC除了独立模式就是双ADC模式,使用双ADC可以交替采样从而提高精度,F1系列的芯片最高能使用两路ADC,而f4系列的芯片可以同时使用三路ADC
    在这里插入图片描述
    将这些模式翻译下如下所示
    在这里插入图片描述
    当然其实这些笔记里面都讲过了
    在这里插入图片描述
    下面来进行配置,双路ADC的模式太多,这里仅介绍常用的,其他的就不介绍了,可以自行查看手册翻阅,这里使用的是快速交替采样模式
    在这里插入图片描述
    开启DMA传输
    在这里插入图片描述
    采集函数的编写,一定要注意顺序!!!
    在这里插入图片描述
    这样就OK了,点击调试就能看到结果了!!!

    展开全文
  • 每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用 API (application programming interface 应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行了标准化。...
  • 任务大小还有优先级什么的 信号量和互斥量的使用 然后是信号量互斥量,版本相关的 上面就是内存管理,钩子函数,时间片什么的 最后一行就是深圳优先级了 上述内容点击项目下面都有注释,不太清楚用翻译软件翻译下就...
  • 【解析题】用C语言编写的程序需要用( )程序翻译后计算机才能识别 【解析题】计算机主要技术指标通常是指()。 【解析题】可直接对硬件操作的计算机语言有_______和_______,它们也称为低级语言。 【解析题】...
  • 串行外设接口SPI(一)引言一、接口二、操作方式2.1数据传输2.2时钟极性和相位2.3模式2.4独立的从机配置2.5菊花链配置2.6有效沟通2.7中断三、利弊3.1优势​3.2劣势总结: 引言 Serial Peripheral Interface (SPI)...
  • 2.输入/输出接口,利用这些接口,CPU可以接受外部设备送来的信息或将信息发送给外设。 外部设备一定要通过接口和主机总线相连的原因: 1.时序上的原因 2.外部设备的功能多种多样的原因 3.外部设备的信息既有数字式,...
  • 将该键翻译成能被主机接收的编码,如ASCII码; c.将编码传送给主机。 ②鼠标 1)鼠标是常用的定位输入设备,它把用户的操作与计算机屏幕上的位置信息相联系。 2)常用的鼠标有机械式和光电式两种。 3)工作原理:当...
  • 常用的计算机外设有哪些?

    千次阅读 2021-06-27 01:18:41
    计算机外设:显示器、鼠标、键盘、调制解调器、扫描仪、打印机、数码相机、数字摄像机、光盘刻录机等。1、显示器显示器(display)通常也被称为监视器。显示器是属于电脑的I/O设备,即输入输出设备。它是一种将一定的...
  • 该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函 数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以 轻松应用每一个...
  • 该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函 数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以 轻松应用每一个...
  • STM32F101xx 与 STM32F103xx 固件函数库 介绍 本手册介绍了 32位基于 ARM 微控制器 STM32F101xx 与 STM32F103xx 的固件函数库 该函数库是一个固件函数包它由程序数据结构和宏组成包括了微控制器所有外设的 ...
  • Transifex与GTK文档翻译, Linux镜像文件, 外设接口杂谈
  • 32位基于ARM微控制器STM32F101xx与STM32F103xx 固件函数库 介绍 本手册介绍了32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库 该函数库是一个固件函数包它由程序数据结构和宏组成包括了微控制器所有外设的...
  • IO接口形式不限,它可以是个电路板,也可以是块芯片,甚至可以是个插槽,它的作用就是在cpu和外设之间相互做协调转换,如cpu和外设速度不匹配,它就是变速箱,cpu和外设信号不通用,它就是翻译机。 这样通过加了...
  • LPC17XX单片机的中文手册,特别的适合初学者,有详细的中文注释,详细的介绍了每一个外设如何使用,希望对你有帮助。
  • Cherry德语翻译为“樱桃”。 在输入外设领域。它是全球数一数二的专业键盘制造厂商。 Cherry是以机械键盘闻名天下,而其公司的机械轴分MX Switch和ML Switch。(还有一个MY Switch为薄膜式键盘类别)。 其中最...
  • 基于NEXYS4DDR开发板、蓝牙外设模块、vga外设模块,使用Verilog HDL开发的贪吃蛇游戏
  • 计算机课程英文翻译

    2021-06-25 07:26:12
    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1计算机导论 Intorduction of Computer 2高等数学 Avanced Mathematics 3线性代数 Linear Alberia 4...Management 计算机外设原理与维修 Computer Peripheral
  • 根据官方的数据手册,关于DS18B20的描述,这里翻译如下: 官方的数据手册我也放到我的gitee了,有需要的可以直接下载: DS18B20 DS18B20 数字温度计提供 9 至 12 位(可配置)温度读数,用于指示
  • Android Things:外设I/O接口-I2C

    千次阅读 2017-04-11 15:06:58
    一、接口简介内部集成电路(IIC或者I2C)总线使用小数据负载连接简单的外部设备。...控制时钟信号的设备被称为master,其它所有连接的外设被认为是Slaves,每个设备连接到同一组数据信号以形成总线。 I2C设备连接使用3
  • 1计算机导论 Intorduction of ...Socialist Economic Theory 国际银行学 International Banking 城市经济学 Urban Economics 精益管理 Lean Management 管理学 Management 计算机外设原理与维修 Computer Peripheral
  • 翻译 成汉语),Software下面的5529有例程( Peripheral Examples ),下面的两个子文件夹分别是寄存器和库函数版本的。下图中右面有个下载的标志(因为我已经下载了,所以出现Uninstall),点击可以下载,下载后该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,993
精华内容 3,597
关键字:

外设翻译