首页 > 其他分享 >STM32入门学习笔记

STM32入门学习笔记

时间:2023-07-29 17:07:04浏览次数:38  
标签:TIM2 NVIC 定时器 入门 中断 笔记 STM32 TIM GPIO


 【1-1】、定时器定时中断&定时器外部时钟

第一步:RCC开启时钟,是每个代码的第一步
第二步:选择时基单元的时钟源,对于定时中断,我们选择内部时钟源
第三步:配置时基单元 ,包括预分频器、自动重装器、计数模式等等,可以用结构体进行配置
第四步:配置输出中断控制,允许更新中断输出到NVIC
第五步:配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步:运行控制
整个模块配置完成后,我们还需要使能一下计数器,要不然计数器是不会运行的,当定时器使能后,计数器就会开始计数了,当计数器更新时,触发中断。这个时候我们再写一个中断函数,这样这个中断函数就能每隔一段时间自动执行一次。

STM32入门学习笔记_初始化

1.定时器初始化

代码如下:

void Timer_Init(void)
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//时基单元的结构体
   
   
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//初始化TIM2时钟
   
   TIM_InternalClockConfig(TIM2);//选择时基单元时钟(内部时钟、可写可不写(默认开启内部时钟))
   
   TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//1分频(不分频)
   TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上计数)
   TIM_TimeBaseInitStruct.TIM_Period=10000-1;//ARR自动重装器的值 //////决定计时时间的两个参数      定时频率(CK_CNT_OV)=CK_PSC/(PSC+1)/(ARR+1)   CK_PSC为内部时钟72M
   TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSC预分频器的值//////决定计时时间的两个参数       PSC和ARR有一个数的偏差                    
   TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才用,这里不用)
   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//配置时基单元
   
   TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
   
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
   
   NVIC_InitTypeDef NVIC_InitStructure;
   NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道 
   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
   NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
   NVIC_Init(&NVIC_InitStructure);//初始化优先级
   
   
   TIM_Cmd(TIM2,ENABLE);//启动定时器
}

2.定时器中断

代码如下:

void TIM2_IRQHandler(void)//定时器中断函数
{
   if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//判断中断标志位
   {
      num++;
      TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
   }
}

STM32入门学习笔记_优先级_02

        该处定时器中断一段在哪里使用就写在哪里,不需要在.h文件中声明,其中定时器中断的num变量如果在主函数中定义,中断函数在初始化函数的.c文件中使用num变量(跨文件使用),必须在使用文件中用extern uint16_t num定义才可以。


3.定时器外部时钟

(1)我们首先需要选择外部时钟源模式2(函数TIM_ETRClockMode2Config),其中TIM2对应的ETR外部时钟引脚为A0。

(2)初始化GPIOA_Pin_0

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟
   
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
   
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0X00);//选择外部时钟源模式2

STM32入门学习笔记_优先级_03

 当外部对A0口输入一个方波的脉冲,就会触发定时器中断进行计数。

总结  

        以上就是今天要讲的内容,本文仅仅简单介绍了定时器定时中断的使用和定时器外部时钟的使用。


标签:TIM2,NVIC,定时器,入门,中断,笔记,STM32,TIM,GPIO
From: https://blog.51cto.com/u_16102721/6893694

相关文章

  • [k8s]k8s入门笔记
    ......
  • Python面向对象编程-学习笔记(二)
    5.类的继承classEmployee:raise_amount=1.04def__init__(self,first,last,pay):self.first=firstself.last=lastself.pay=payself.email=first+'.'+last+'@company.com'cla......
  • Hyper-V Best Practices读书笔记
    1.安装Hyper-V:Install-WindowsFeature-Namehyper-v,Multipath-IO-IncludeAllSubFeature-IncludeManagementTools-RestartNew-VMSwitch-NameSW-1G-NetAdapterName"LocalAreaConnection2"IfyouhaveonlyoneNIC,runthefollowingcommand:New-VMSwit......
  • 小鱼书学习笔记
    第3章神经网络将输入信号的总和转换为输出信号,这种函数一般称为激活函数(activationfunction)激活函数的作用在于决定如何来激活输入信号的总和。本书在使用“感知机”一词时,没有严格统一它所指的算法。一般而言,“朴素感知机”是指单层网络,指的是激活函数使用了阶跃函数A的模型。......
  • React18学习笔记
    目录使用Create-React-App创建项目使用Vite创建项目JSX语法基础标签属性事件插入JS变量和表达式条件判断循环实践:列表页组件Props组件通讯HooksuseState基本使用特点使用useState实现问卷的增删改使用immer解决不可变数据问题useEffectuseRefuseMemo......
  • Redis从入门到放弃(4):3种新数据类型
    1、介绍前面的文章已经介绍了redis的5种基本数据类型,redis6中另外还有3种特殊的数据类型,分别是Bitmaps(位图)、HyperLogLogs(基数统计)和geospatial(地理位置)。本文将继续探讨它们的特性、原理以及应用场景。2、Bitmaps(位图)Bitmaps是一种位图数据结构,用于存储位的集合。在Red......
  • c语言学习笔记5
    内存空间在C语言中,内存空间可以被划分为以下几个部分:1.栈(Stack):这部分内存由编译器自动分配和释放,用于存放函数的参数值,局部变量等。其操作方式类似于数据结构中的堆栈,先进后出。2.堆(Heap):堆是用于动态内存分配的。与栈不同,堆的分配和释放必须由程序员自己操作。在C语言中,使用m......
  • 线性基学习笔记
    线性基简介线性基是一种擅长处理异或问题的数据结构.设值域为\([1,N]\),就可以用一个长度为$⌈\log_2{N}⌉$的数组来描述一个线性基。特别地,线性基第\(i\)位上的数二进制下最高位也为第\(i\)位。一个线性基满足,对于它所表示的所有数的集合\(S\),\(S\)中任意多个数异或所得的......
  • C++ Primer Plus学习笔记
    仅限main函数,如果没有返回语句,编译器会加隐含的返回语句:return0;WIN1064位系统中,sizeof(int)==sizeof(long)==4.C++17之后,新增byte数据类型,在标头<cstddef>中定义,取值范围[0-255],初始化:std::byteb{42};char取值范围[-128,127]原始字符串R"(string)"R"+*(......
  • 【Linux】Kali Linux 安全学习笔记(1) - Docker Kali 部署与安装软件
    由于最近要做安全方面的工作,经网友们的推荐选定了kalilinux作为实施平台。但vm直装的方式太过麻烦了,本次kalilinux将采用docker镜像的方式进行部署使用。直接使用run运行命令启动rolling镜像,若镜像不存在,docker会自动进行checkout到本地,如下图:dockerrun-itkal......