https://m.toutiao.com/is/F2RmKMr/?=51单片机入门教程 https://m.toutiao.com/is/F2RmKMr/?=51单片机入门教程 中断是为使单片机具有对外部或者内部随机发生的事件实时处理而设置的。 把自己想象成单片机的CPU,你正在洗衣服,但是忽然快递小哥给你打电话让你去拿快递,于是你停下洗衣服去拿快递了。快递小哥的电话就是中断信号,告诉你有其他的事情须要先去做,其次你去拿快递就相当于中断之后要去处理的事情。 51单片机有五个中断源 一.INT0——外部中断0 二.INT1——外部中断1 三.T0——定时器/计数器0中断 四.T1——定时器/计数器1中断
文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛/// 定时器的定时计算 时钟周期定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时长周期就是1/12000000),是计算机中最根本的、最小的时长单位。 机器周期是指完成一个根本操作所须要的时长。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所运用的时长都是机器周期的整数倍,而且语句占用的时长是能够计算出来,而C语言一条语句的时长是确定的。51单片机系列在其规范架构下一个机器周期是12个时钟周期,也就是12/11059200秒。此时有不少增强型的51单片机,其速度都比快速,有的1个机器周期即是4个时钟周期,有的1个机器周期就即是1个时钟周期,也就是说大体上其速度能够到达规范51架构的3倍或12倍。由于项目中运用的是规范的51单片机,机器周期是12个时钟周期。 再讲解下定时器和计数器这两个概念。定时器和计数器是单片机内部的同一个模块,通过配置SFR(特殊功能寄存器)能够达到两种不同的功能,大部分情况下是运用定时器功能,因此也主要来讲定时器功能,计数器功能大家自己了解下即可 配套的单片机进修版采用的12M的没源晶振,那么时钟周期为1/12000000,机器周期为12/12000000,假设定时20ms,那么须要的机器周期为0.02/(12/12000000)=20000个,依据二.1小结讲解的须要在定时器预装65536-20000=45536个值,由于采用的定时模式1,将45536化为十六进制装载到寄存器TH0和TL0中,45536 / 256=177,45536 % 256=244,将177转化为十六进制0XB1装载到TH0,将244转化为十六进制0XF4装载到TL0。 同理能够计算得16位寄存器最大能定时65536*(12/12000000)≈65ms,一般来说定时的时长尽量取在0~65ms中间值,如本例中定时器配置的定时20ms,如需定时1s,只有定时循环50次即可。读者能够计算下定时50ms须要多大的装载初值。 注意:当采用1一.0592M晶振时,采用类似的计算方式! 定时器中断编程 STM32F1的定时器系统由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2~TIM5)和2个高级定时器(TIM1、TIM8)所组成。基本定时器同51单片机内的定时器类似,功能较为简单;通用定时器在其基础上增加了输入捕获与输出比较功能;高级定时器又在通用定时器基础上增加了可编程死去互补输出、重复计数、带刹车(断路)的功能主要针对于工业电机的控制。 2.1 通用定时器 STM32F1的通用定时器内有一个16位自动重载计数器(CNT)由可编程预分频器(PSC)驱动,其可用于测量输入信号的脉冲宽度(输入捕获)或者生产输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几微秒到几毫秒之间调整,此外每一个定时器都是独立的,之间不互相共享任何资源。通用定时器TIM2~TIM5具备如下功能: 16位向上、向下、向上/向下自动装载计数器(TIMx_CNT); 16位可编程预分频器,计数器时钟频率的分频系数为1~65535; 4个独立通道(TIMx_CH1~4),通道可以被用作输入捕获、输出比较、PWM生成和单脉冲模式输出功能; 可以使用外部信号(TIMx_ETR)控制定时器,可实现多个定时器互连的同步电路; 发生更新(计数器溢出、初始化)、触发时间(计数器启动、停止、初始化或者由内部/外部触发计数)、输入捕获以及输出比较事件时会产生中断/DMA请求; 支持针对定位的增量(正交)编码器和霍尔传感器电路; 触发输入作为外部时钟或者按周期的电流管理。 2.2 定时器配置步骤 定时器相关的库函数在stm32f10x_tim,c和stm32f10x_tim.h文件中,使用库函数对定时器进行配置的详细步骤如下: 使能定时器时钟; 定时器是挂载在APB1总线上的设备,因此使能定时器可以调用函数: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); 初始化定时器参数,包含了自动重装值,分频系数,计数方式等; 调用函数:void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); TIM_TimeBaseInitTypeDef为一个结构体类型,包含了定时器初始化的成员变量: TIM_Prescaler: 时钟源经过该预分频器后输出的是定时器时钟,设置范围为0~65535; TIM_CouterMode: 可设置为TIM_CounterMode_Up(向上)、TIM_CounterMode_Down(向下)以及中心对齐计数模式; TIM_Period:设置定时器自动重载计数值,范围为0~65536; TIM_ClockDivision: 时钟分频因子,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比; TIM_RepetitionCounter: 重复计数器,简单的控制PWM输出个数。 设置定时器中断类型,使能定时器; 调用函数:void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); TIM_IT 用来设置定时器中断类型,包含TIM_IT_Update(更新中断)、TIM_IT_Trigger(触发中断)以及输入捕获中断等等; FunctionalState 用来使能或使能定时器中断,ENABLE和DISABLE。 设置定时器中断优先级,使能定时器中断通道; 对NVIC初始化,如前一节中所示。 开启定时器; 调用函数:void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); 编写定时器中断服务函数 由于定时器中断类型有很多,因此在中断服务函数中需要通过状态寄存器的值来判断此次中断属于哪一种类型,然后再执行相应的用户程序。 2.3 应用示例 本次实验通过TIM4定时器的更新中断控制LED灯实现不断闪烁的功能,详细的代码如下所示; time.h time.c main.c 对单片机感兴趣的朋友可以找我,我录制了一些关于单片机的入门教程,有需要的童鞋找我拿就像,免费的,私信我“林老师”就可以拿~点击打开我的头像就能领取 |
|
来自: 山峰云绕 > 《单片机结构硬件底层通讯接口信号时序》