[STM32F1] stm32(F103c8t6)自学笔记

[复制链接]
5084|177
 楼主| t60yz 发表于 2023-11-22 11:35 | 显示全部楼层
和C51中的中断是一样的,只不过32的资源更加丰富;  
19104655d76f5d98d3.png
 楼主| t60yz 发表于 2023-11-22 11:35 | 显示全部楼层
1.2 中断系统内部机制(中断和异常向表)
         由于Stm32中断资源众多,所以这里的中断都是由NVIC统一管理。

左边需要执行的众多中断会根据分组和优先级排队,其中抢占优先级具有最高优先级(可直接由NVIC传入CPU,中断CPU正在执行的主程序或者中断),而响应优先级则具有插队排第一位的权限(优先级次于抢占优先级),当左边排队完成,NVIC会根据左边的排队决定当前该执行哪一个中断然后传给CPU(CPU不知道优先级逻辑,由NVIC处理,节约算力和IO口)
 楼主| t60yz 发表于 2023-11-22 11:35 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:35 | 显示全部楼层
中断和异常向表,建议翻看手册;
83426655d7714e5294.png
 楼主| t60yz 发表于 2023-11-22 11:36 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:36 | 显示全部楼层
1.3 EXTI简介
触发中断,中断响应是正常的流程,但是Stm32还提供了一种额外的中断处理:事件响应。

当选择触发事件响应,那么该中断信号将不会通过NVIC传入CPU,而是直接传给某一个外设并触发它。例如触发ADC模块‘触发DMA等。

总结:中断响应是正常的流程,引脚电平变化触发中断。事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合操作。

注意:相同的pin口的中断不能同时被触发,如PA0、PB0、PC0三个中断同时需要传入NVIC,但是最终只会有一个被传入。

在EXTI内部有对数据筛选处理的模块,最终只有指定的IO数据会传入NVIC,其它的会作为事件触发传给指定的外设。
 楼主| t60yz 发表于 2023-11-22 11:36 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:36 | 显示全部楼层
1.4 EXTI机制
79447655d773f3577b.png
 楼主| t60yz 发表于 2023-11-22 11:36 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:37 | 显示全部楼层
1.5 AFIO复用IO口
7362655d775f0bd87.png
 楼主| t60yz 发表于 2023-11-22 11:37 | 显示全部楼层
2.点触式旋转编码器
2.1 结构原理
75429655d776fe4119.png
 楼主| t60yz 发表于 2023-11-22 11:37 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:37 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:37 | 显示全部楼层
2.2 代码实现(详细步骤说明)
该模块需要用到中断,如何实现呢?其实原理就是将模块IO口使能使其数据能够到达NVIC再到CPU就好了。

五个步骤:

1.打开对应IO口的RCC外设时钟(不打开IO口不能工作);

2.配置IGPO口的模式;

3.配置AFIO,使其选择我们要用的GPIO口,连接到EXTI;

4.配置EXTI模式,选择触发方式及响应方式(中断or事件);

5.配置NVIC,选择一个合适的中断优先级。

53112655d778fbfb8f.png
 楼主| t60yz 发表于 2023-11-22 11:38 | 显示全部楼层
  1. #include "stm32f10x.h"                  // Device header
  2. #include "OLED.h"
  3. #include "mokuaicount.h"
  4. extern int num;

  5. /***************************************************/初始化旋钮模块
  6. #include "xuanniu.h"                  // Device header
  7. #include "stm32f10x.h"

  8. void Xuanniu_init(uint16_t GPIO_Pin)//需要指定端口Pin进行模式设置
  9. {
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//使能GPIOA的时钟
  11.        
  12.         GPIO_InitTypeDef Xuanniu_InitStruct;  

  13.         Xuanniu_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//设置为 上拉输入 模式
  14.         Xuanniu_InitStruct.GPIO_Pin=GPIO_Pin;  //外界参数设置Pin口
  15.         Xuanniu_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz,在输入模式下该设置没用
  16.         GPIO_Init( GPIOA,&Xuanniu_InitStruct); //以上三个都要传入该函数初始化
  17. }

  18. /***************************************************/配置中断
  19. //**该模块由中断函数实现,可接入任意输入模式的模块实现计数
  20. //**这里引入Key实现数据的减法,LightR实现加法
  21. #include "stm32f10x.h"                  // Device header
  22. #include "mokuaicount.h"
  23. #include "Delay.h"
  24. #include "xuanniu.h"


  25. int num;

  26. void Count_interrupt_init(void)
  27. {
  28.         //1、2、**步骤一二在模块内已经实现
  29.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//AFIO时钟需要使能
  30.        
  31.         Xuanniu_init(GPIO_Pin_0|GPIO_Pin_1);
  32.         //3**配置AFIO,选择输入引脚
  33.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//Xuanniu旋钮
  34.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
  35.         //4**配置EXTI寄存器,选择触发方式,这里配置EXTI和GPIO一样需要定义一个结构体
  36.         EXTI_InitTypeDef EXTI_InitStruct;
  37.         EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1;
  38.         EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  39.         EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  40.         EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
  41.         EXTI_Init(&EXTI_InitStruct);
  42.         //5**配置NVIC,选择合适的中断优先级 --------每一个外设要单独配置
  43.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//要先分组,整个系统NVIC只分配一种模式
  44.         //**配置Xuanniu A端
  45.         NVIC_InitTypeDef NVIC_InitStruct_Xuanniu;
  46.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannel=EXTI0_IRQn;
  47.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelCmd=ENABLE;
  48.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelPreemptionPriority=1;
  49.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelSubPriority=1;
  50.         NVIC_Init(&NVIC_InitStruct_Xuanniu);
  51.         //**配置Xuanniu C端
  52.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannel=EXTI1_IRQn;
  53.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelCmd=ENABLE;
  54.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelPreemptionPriority=1;
  55.         NVIC_InitStruct_Xuanniu.NVIC_IRQChannelSubPriority=1;
  56.         NVIC_Init(&NVIC_InitStruct_Xuanniu);
  57.        
  58.        
  59.         //****所有配置完成
  60. }

  61. //中断位置随便放,也不需要声明
  62. void EXTI0_IRQHandler()//正转触发
  63. {
  64.         if(EXTI_GetITStatus(EXTI_Line0)==SET)
  65.         {
  66.                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
  67.                 {
  68.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
  69.                         {
  70.                                 num++;
  71.                         }
  72.                 }
  73.         }
  74.         EXTI_ClearITPendingBit(EXTI_Line0);
  75. }
  76. void EXTI1_IRQHandler()
  77. {
  78.         if(EXTI_GetITStatus(EXTI_Line1)==SET)
  79.         {
  80.                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
  81.                 {
  82.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
  83.                         {
  84.                                 num--;
  85.                         }
  86.                 }
  87.         }
  88.         EXTI_ClearITPendingBit(EXTI_Line1);
  89. }


  90. /***************************************************/主函数
  91. int main(void)
  92. {
  93.         OLED_Init();
  94.         Count_interrupt_init();
  95.         OLED_ShowString(1,1,"Hello,my honey");
  96.         OLED_ShowString(2,1,"Hello WangFang");
  97.         OLED_ShowString(3,1,"Hello Tomorrow");
  98.         while(1)
  99.         {
  100.                 OLED_ShowSignedNum(4,1,num,5);
  101.         }
  102. }
  103. /*********************阿布君***********************/
  104. /****************编码不易,谢谢关注*****************/
  105. /****************QQ:2062808868********************/
 楼主| t60yz 发表于 2023-11-22 11:38 | 显示全部楼层
六、TIM定时中断
1.结构原理
1.1 介绍
37856655d77a84c78f.png
 楼主| t60yz 发表于 2023-11-22 11:38 | 显示全部楼层
1.2 定时器种类
不同型号的开发板拥有的定时器资源不一样

基本定时器只支持向上计数(由0加到重装载值触发中断后清零)

通用定时器和高级定时器都支持向上计数、向下计数、中央对齐三种模式计数

39104655d77b7571bf.png
 楼主| t60yz 发表于 2023-11-22 11:38 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-22 11:38 | 显示全部楼层
1.3 基本定时器框图

3688655d77cdaa5d6.png
 楼主| t60yz 发表于 2023-11-22 11:39 | 显示全部楼层
1.4 通用定时器框图
1316655d77daea361.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部