当前位置:   article > 正文

STM32学习笔记-2(持续更新)

STM32学习笔记-2(持续更新)

型号:STM32F103

学习平台:bilibili江协科技的stm32教程

学习内容:EXIT外部中断、TIM定时中断、I2C协议、MCU6050

目录

一、EXIT外部中断

1.简介

2.应用实例(旋转编码器计次)

二、TIM定时中断

1.简介

2.应用实例(定时器定时中断,1秒)

3.心得体会

三、I2C协议

1.简介

2.应用实例:

四,MCU6050

1.简介

2.应用实例:


一、EXIT外部中断

1.简介

        1)基础理解:需要先理解中断系统,组成:①中断②中断优先级③中断嵌套

        2)简述:

                ①EXIT外部中断,中断的一种,监测GPIO的电平信号,但该电平变化时,立即向NVIC发出中断申请,需要通过NVIC的裁决来中断CPU主程序,转向执行EXIT制定的中断程序

                ②触发方式:上升沿/下降沿/双边沿/软件触发

                ③支持所有GPIO口,但不同同时触发相同Pin的中断。

                ④触发响应方式:中断响应/事件响应

        3)NVIC:

                ①简述:嵌套中断向量控制器,是内核外设,统一分配中断优先级和管理中断,EXIT需要通过NVIC来中断CPU。

                ②通俗理解:一个排队管理员,让大家(中断请求)排好队(按优先级排队),每次只能挑最前面(优先级最高)进去房间(CPU)

                ③结构:如图1,NVIC可以输入多种中断,如EXIT、TIM、ADC等等,最后通过优先级的机制,输出一个中断请求给CPU。         

图1

                ④优先级分组:

                        抢占:中断嵌套

                        响应:优先排队

                        两者相同则按中断号排队

                           

图2

2.应用实例(旋转编码器计次)

        1)代码:

                ①中断配置部分:

  1. void Encoder_Init(void)
  2. {
  3. //使能GPIOB与AFIO的时钟
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  6. //用结构体配置GPIO口,此处我们用PB0与PB1,因为器件有两个相,以此来判断正反,所以利用两个中断
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOB, &GPIO_InitStructure);
  12. //配置AFIO外部中断引脚选择,我们用的是0号与1号
  13. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  14. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
  15. //用EXTI结构体来配置
  16. EXTI_InitTypeDef EXTI_InitStructure;
  17. EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;//选择0与1号中断线
  18. EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能
  19. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//外部中断模式
  20. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿
  21. EXTI_Init( &EXTI_InitStructure );
  22. //配置NVIC,中断优先级
  23. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组2
  24. NVIC_InitTypeDef NVIC_InitStructure;
  25. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//选择0号外部中断
  26. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能,通道开启
  27. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级设置1
  28. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级设置1
  29. NVIC_Init( &NVIC_InitStructure );
  30. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;;//选择1号外部中断
  31. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能,通道开启
  32. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级设置1
  33. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级设置1
  34. NVIC_Init( &NVIC_InitStructure );
  35. }

                ②中断函数部分:

  1. void EXTI0_IRQHandler(void)
  2. {
  3. if (EXTI_GetITStatus(EXTI_Line0) == SET)//判断正向的相位差中第二个相的中断标志位是否SET,既触发
  4. {
  5. if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)//判断正向的相位差中第一个相是否处于低电平,既利用相位差来计次,(详细的请看原视频,b站江协科技的stm32教程)
  6. {
  7. Encoder_Count ++;//计次加
  8. }
  9. EXTI_ClearITPendingBit(EXTI_Line0);//中断标志位清0
  10. }
  11. }
  12. void EXTI1_IRQHandler(void)
  13. {
  14. if (EXTI_GetITStatus(EXTI_Line1) == SET)//判断反向的相位差中第二个相的中断标志位是否SET,既触发
  15. {
  16. if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)//判断反向的相位差中第一个相是否处于低电平,既利用相位差来计次
  17. {
  18. Encoder_Count --;//计次减
  19. }
  20. EXTI_ClearITPendingBit(EXTI_Line1);//中断标志位清0
  21. }
  22. }

        2)实现结果:

                ①正向

                ②反向

二、TIM定时中断

1.简介

        1)简述:

                ①定时器是一个强大且复杂的外设,能对输入的时钟进行计数,但计数值累计至设定值时触发中断。(还有其他功能,如输出比较等等)

                ②具有16位计数器(即最大计数值为65536,实际代码写入为65535)、预分频器、自动重装寄存器的时基单元。

                ③分类

图1 定时器分类表

            图2 基本定时器结构图

图3 定时中断基本结构

2.应用实例(定时器定时中断,1秒)

        1)代码:

                ①定时器以及中断配置部分

  1. void Timer_Init(void)
  2. {
  3. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//由于我们使用通用定时器,所以选择TIM2,而TIM2在总线APB1上,所以开启APB1的时钟
  4. TIM_InternalClockConfig(TIM2);//TIM2的时基单元由内部时钟驱动
  5. //配置时基单元,内部时钟频率为72MHZ,即每秒72M次计数,72M/7200 = 10000,分频后,每秒计数10000次,则计数10000次,时间为1秒。我们目的就是每秒触发一次中断。
  6. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//用结构体初始化时基单元
  7. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//配置分频值为1.即不分频
  8. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数模式
  9. TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR配置自动重装值
  10. TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//配置psc预分频器
  11. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//不需要,先配置0
  12. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  13. TIM_ClearFlag(TIM2, TIM_FLAG_Update); //(先清除以下中断标志位,否则系统会自动在使能中断后,马上进行一次中断)
  14. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//(配置时钟的中断为更新中断并且使能)
  15. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC,选择分组2
  16. NVIC_InitTypeDef NVIC_InitStructure;
  17. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  20. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  21. NVIC_Init(&NVIC_InitStructure);
  22. TIM_Cmd(TIM2, ENABLE);
  23. }

                ②主函数部分

  1. int main(void)
  2. {
  3. OLED_Init();
  4. Timer_Init();
  5. OLED_ShowString(1, 1, "Num:");
  6. //OLED_Clear();
  7. while(1)
  8. {
  9. OLED_ShowNum(1, 5, Num, 5);
  10. OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);
  11. }
  12. }
  13. void TIM2_IRQHandler(void)
  14. {
  15. if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  16. {
  17. Num ++;
  18. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//每次中断后都让其清除标志位
  19. }
  20. }

        2)结果显示

3.心得体会

        流程不难理解,但是要细究每一处的话,太难,二周目再进行彻底的剖析,现在主要偏向于应用。(没有模电基础,能上岸的话就进行二周目深入学习)

三、I2C协议

1.简介

        一种通信协议,其有两根通信线:SCL与SDA,为同步的半双工通信方式。带有数据应答,支持总线挂载多设备

2.应用实例:

       暂无

四,MCU6050

1.简介

        6轴姿态传感器,可以用于需要检测/矫正姿态的场景。

        测量X、Y、Z轴的加速度以及角速度,所以称为6轴(可以扩展到9轴,通过磁力计实现,9轴可以修正偏航问题)

2.应用实例:

       暂无

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/935898
推荐阅读
相关标签
  

闽ICP备14008679号