stm32f407之MyDebugger(操作寄存器)

发布者:RainbowJoy最新更新时间:2018-09-20 来源: eefocus关键字:stm32f407  MyDebugger  操作寄存器 手机看文章 扫描二维码
随时随地手机看文章

九、MyDebugger

         已经学习了usart和DMA,因为后面的学习,最好有一个直观点的人性化的显示终端。可以通过串口将数据和文字信息发送往电脑,然后在上位机软件上观察数据以及调试信息。为此,我写了一个文件,以供日后调试之用,命名为MyDebugger。

         首先,参照之前的程序,略加修改,将USART的接收功能全部去掉,DMA的配置分开,独立写成一个配置DMA的函数USART3_DMA_config(),把发送的部分写到MyDebugger_Message(char *str_address, unsigned int str_len)函数内,很简单地实现了一个发送字符消息的函数。然后写一个操作板子上指示灯的函数,用以日后指示调试信息。具体的实现,请看下程序(实现MyDebugger的验证程序)。

         把验证程序分离写成头文件形式。方便以后其他工程使用。把程序稍作修改,利用条件编译,为以后可能的添加其他通信方式提供方便。要使用USART3作为调试通信方式,必须先定义宏MyDebug_with_USART3,如下图所示:


实现MyDebugger的验证程序:

/*********************************************  

    标题:MyDebugger  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

      

    描述:实现一个调试工具  

            

    author:小船  

    data:2012-02-04  

**********************************************/  

#include   

#include  

  

/******LED宏定义*******/  

#define green 0x00001000  

#define orange 0x00002000  

#define red 0x00004000  

#define blue 0x00008000  

  

/******全局变量及类型声明*******/  

bool USART_DMA_Completed;  

enum LED_State {on, off, turn};  

  

/******函数声明*******/  

void LEDs_Init(void);  

void USART3_DMA_config(void);  

void USART3_config(void);  

bool MyDebugger_Message(char *str_address, unsigned int str_len);  

void MyDebugger_LEDs(uint32_t LED, enum LED_State state);  

  

void main ()  

{   

  SysTick_Config(SystemCoreClock / 1000); //设置systemtick一毫秒中断  

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

  LEDs_Init();  

  USART3_DMA_config();  

  USART3_config();  

    

  USART_DMA_Completed = 1;  

    

  while(1)  

  {   

    MyDebugger_Message("My name is Xian Yongwen\n",   

                            sizeof("My name is Xian Yongwen\n")/sizeof(char));  

      

    MyDebugger_Message("广东石油化工学院\n",   

                            sizeof("广东石油化工学院\n")/sizeof(char));  

  }  

}  

  

/*********************************************  

  函数名:MyDebugger_Message  

  参数:char *str_address  :要发送的字符串地址  

        unsigned int str_len  :字符串的长度  

  返回值:bool  是否操作成功  

  功能:通过USART3发送信息  

**********************************************/  

bool MyDebugger_Message(char *str_address, unsigned int str_len)  

{   

    if( USART_DMA_Completed )  //之前数据已经发送完成  

    {    

      DMA1_Stream3->CR &= 0xFFFFFFFE;   //除能DMA1_Stream3  

      while(DMA1_Stream3->CR & 0x00000001); //确保DMA可以被设置       

      DMA1->LIFCR |= 0x0f800000;  //传送前清空DMA1_Stream3所有中断标志    

      DMA1_Stream3->M0AR = (uint32_t)str_address; //设置内存地址  

      if((USART3->SR & (1<<7))) //发送数据寄存器空  

      {  

        USART3->CR3 &= ~(1<<7);//usart3 dma发送模式除能  

        USART_DMA_Completed = 0;  

        DMA1_Stream3->NDTR = str_len; //设置dma传输数据的数量  

        DMA1_Stream3->CR |= 1;//使能dma  

        USART3->CR3 |= (1<<7);//usart3 dma发送模式使能  

        return true;  

      }   

    }   

    return false;  

}  

  

/****************************************  

  函数名:MyDebugger_LEDs  

  参数:uint32_t LED  :要操作哪些LED  

        enum LED_State state  :作何操作  

  返回值:无  

  功能:改变LED的状态  

****************************************/  

void MyDebugger_LEDs(uint32_t LED, enum LED_State state)  

{  

  uint32_t tmp;  

  switch (state)  

  {  

    case on:  

      {  

        GPIOD->BSRRL |= LED;   

        break;  

      }  

    case off:  

      {  

        GPIOD->BSRRH |= LED;  

        break;  

      }  

    case turn:  

      {  

        tmp = (~GPIOD->ODR) & LED;     

        GPIOD->ODR &= ~LED;  

        GPIOD->ODR |= tmp;  

        break;  

      }   

  }  

}  

  

/****************************************  

  函数名:USART3_DMA_config  

  参数:无  

  返回值:无  

  功能:DMA1数据流3与usart3关联的相关配置  

****************************************/  

void USART3_DMA_config(void)  

{  

  RCC->AHB1ENR |= (1<<21); //使能DMA1时钟  

  DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3  

  while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置  

    

  DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志  

    

  DMA1_Stream3->PAR = (uint32_t)&USART3->DR;//设置外设地址USART3->DR地址0x40004804  

                                             //设置内存地址  

  DMA1_Stream3->FCR &= 0x00000000;  

  DMA1_Stream3->FCR |= (1<<7);//设置fifo  

  /*  

    设置dma通道4,即usart3tx  

    优先级最高  

    传输方向内存到外设  

    内存递增模式  

    传输完成中断使能  

  */  

  DMA1_Stream3->CR |= (0x08000000 | 0x00030000 | (1<<6)  

                       | (1<<10) | (1<<4) | (1<<2)|(1<<1));   

    

  NVIC->IP[14] = 0xA0;  

  NVIC->ISER[0] |= (1<<14);  

    

}  

  

/**************************  

  函数名:USART3_config  

  参数:无  

  返回值:无  

  功能:配置usart3  

************************/  

void USART3_config(void)  

{  

  RCC->APB1ENR |= (1<<18);  //使能usart3时钟  

  RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  

  USART3->BRR = 0x0000016C;   //波特率115200  

  /*  

   使能usart3  

  usart3发送使能  

  8bit  

  一位停止位  

  无校验  

  */  

  USART3->CR1 |= ( ( 1<<13 ) | ( 1<<3 ) );   

    

  GPIOD->AFR[1] |= 0x00000077;//选择PD8,9复用功能   

    

  GPIOD->MODER &= 0xFFF0FFFF; //设置PD8,9,复用模式  

  GPIOD->MODER |= 0x000A0000;   

      

  GPIOD->OSPEEDR &= 0xFFFCFFFF; //PD8速度50m  

  GPIOD->OSPEEDR |= 0x00020000;  

    

  GPIOD->PUPDR &= 0xFFFCFFFF; //PD8  

  GPIOD->PUPDR |= 0x00010000;  

}  

  

/****************************************  

  函数名:LEDs_Init  

  参数:无  

  返回值:无  

  功能:初始化板子上的LED  

****************************************/  

void LEDs_Init(void)  

{  

  RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  

    

  GPIOD->MODER &= 0x00FFFFFF; //设置PD12,13,14,15输出  

  GPIOD->MODER |= 0x55000000;   

    

  GPIOD->OTYPER &= 0xFFFF0FFF; //设置PD12,13,14,15推挽输出  

    

  GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m  

    

  GPIOD->PUPDR &= 0x00FFFFFF;  //PD12,13,14,15 无上拉无下拉  

    

  GPIOD->BSRRH = 0xf000;  //reset register GPIOx_BSRRH, write only  

                          //set register GPIOx_BSRRL, write only  

}  

  

void DMA1_Stream3_IRQHandler(void)  

{  

  if(DMA1->LISR & 0x08000000)//DMA传输完成  

  {  

    USART_DMA_Completed = 1;  

    DMA1->LIFCR |= 0x08000000;//清除中断标志  

  }  

  if(DMA1->LISR & 0x03000000)     //如果发生传输错误或直接模式错误,亮橙色LED  

  {  

    MyDebugger_LEDs( orange, on);  

    DMA1->LIFCR |= 0x03000000;  

  }  

  if(DMA1->LISR & (1<<22))  //如果发生fifo错误,亮红色指示灯  

  {  

    MyDebugger_LEDs( red, on);  

    DMA1->LIFCR |= (1<<22);  

  }  

}  


实用程序:



头文件:MyDebugger.h


[plain] view plaincopy

// file:MyDebugger.h

#ifndef __MyDebugger_H  

#define __MyDebugger_H  

  

#include   

#include  

  

/******LED宏定义*******/  

#define green 0x00001000  

#define orange 0x00002000  

#define red 0x00004000  

#define blue 0x00008000  

  

/******全局变量及类型声明*******/  

enum LED_State {on, off, turn};  

  

/******函数声明*******/  

void MyDebugger_Init(void);  

bool MyDebugger_Message(char *str_address, unsigned int str_len);  

void MyDebugger_LEDs(uint32_t LED, enum LED_State state);  

  

#endif  



源文件:MyDebugger.c



[plain] view plaincopy

// file:MyDebugger.c  

#include   

  

#ifdef MyDebug_with_USART3  

  

bool USART_DMA_Completed = true;  

  

/****************************************  

  函数名:USART3_DMA_config  

  参数:无  

  返回值:无  

  功能:DMA1数据流3与usart3关联的相关配置  

****************************************/  

void USART3_DMA_config(void)  

{  

  RCC->AHB1ENR |= (1<<21); //使能DMA1时钟  

  DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3  

  while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置  

    

  DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志  

    

  DMA1_Stream3->PAR = (uint32_t)&USART3->DR;//设置外设地址USART3->DR地址0x40004804  

                                             //设置内存地址  

  DMA1_Stream3->FCR &= 0x00000000;  

  DMA1_Stream3->FCR |= (1<<7);//设置fifo  

  /*  

    设置dma通道4,即usart3tx  

    优先级最高  

    传输方向内存到外设  

    内存递增模式  

    传输完成中断使能  

  */  

  DMA1_Stream3->CR |= (0x08000000 | 0x00030000 |   

                        (1<<6) | (1<<10) | (1<<4));   

    

  NVIC->IP[14] = 0xA0;  

  NVIC->ISER[0] |= (1<<14);  

}  

  

/**************************  

  函数名:USART3_config  

  参数:无  

  返回值:无  

  功能:配置usart3  

************************/  

void USART3_config(void)  

{  

  RCC->APB1ENR |= (1<<18);  //使能usart3时钟  

  RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  

  USART3->BRR = 0x0000016C;   //波特率115200  

  /*  

   使能usart3  

  usart3发送使能  

  8bit  

  一位停止位  

  无校验  

  */  

  USART3->CR1 |= ( ( 1<<13 ) | ( 1<<3 ) );   

    

  GPIOD->AFR[1] |= 0x00000077;//选择PD8,9复用功能   

    

  GPIOD->MODER &= 0xFFF0FFFF; //设置PD8,9,复用模式  

  GPIOD->MODER |= 0x000A0000;   

    

//  GPIOD->OTYPER &= 0xFFFFDFFF; //设置PD9推挽输出  

    

  GPIOD->OSPEEDR &= 0xFFFCFFFF; //PD8速度50m  

  GPIOD->OSPEEDR |= 0x00020000;  

    

  GPIOD->PUPDR &= 0xFFFCFFFF; //PD8  

  GPIOD->PUPDR |= 0x00010000;  

}  

  

void DMA1_Stream3_IRQHandler(void)  

{  

  if(DMA1->LISR & 0x08000000)//DMA传输完成  

  {  

    USART_DMA_Completed = 1;  

    DMA1->LIFCR |= 0x08000000;//清除中断标志  

  }  

}  

#endif  

  

/*********************************************  

  函数名:MyDebugger_Message  

  参数:char *str_address  :要发送的字符串地址  

        unsigned int str_len  :字符串的长度  

  返回值:bool  是否操作成功  

  功能:通过USART3发送信息  

**********************************************/  

bool MyDebugger_Message(char *str_address, unsigned int str_len)  

{     

#ifdef MyDebug_with_USB  

    bool USB_Actioned;  

#endif  

      

#ifdef MyDebug_with_USART3  

    bool USART3_Actioned;  

    if( USART_DMA_Completed )  //之前数据已经发送完成  

    {    

      DMA1_Stream3->CR &= 0xFFFFFFFE;   //除能DMA1_Stream3  

      while(DMA1_Stream3->CR & 0x00000001); //确保DMA可以被设置       

      DMA1->LIFCR |= 0x0f800000;  //传送前清空DMA1_Stream3所有中断标志    

      DMA1_Stream3->M0AR = (uint32_t)str_address; //设置内存地址  

      if((USART3->SR & (1<<7))) //发送数据寄存器空  

      {  

        USART3->CR3 &= ~(1<<7);//usart3 dma发送模式除能  

        USART_DMA_Completed = 0;  

        DMA1_Stream3->NDTR = str_len; //设置dma传输数据的数量  

        DMA1_Stream3->CR |= 1;//使能dma  

        USART3->CR3 |= (1<<7);//usart3 dma发送模式使能  

        USART3_Actioned = 1;  

      }   

    }  

#endif  

      

#ifdef MyDebug_with_USB  

//以后或许实现用USB发送调试信息的代码  

      

       //如果操作USB成功  

        USB_Actioned = 1;  

#endif  

  

#ifdef MyDebug_with_USART3  

  #ifndef MyDebug_with_USB      

    return USART3_Actioned;  

  #endif    

#endif  

  

#ifdef MyDebug_with_USB  

  #ifndef MyDebug_with_USART3      

    return USB_Actioned;  

  #endif    

#endif  

  

#ifdef MyDebug_with_USART3  

  #ifdef MyDebug_with_USB      

    return (USART3_Actioned | USB_Actioned);  

  #endif  

#endif      

}  

  

/****************************************  

  函数名:LEDs_Init  

  参数:无  

  返回值:无  

  功能:初始化板子上的LED  

****************************************/  

void LEDs_Init(void)  

{  

  RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  

    

  GPIOD->MODER &= 0x00FFFFFF; //设置PD12,13,14,15输出  

  GPIOD->MODER |= 0x55000000;   

    

  GPIOD->OTYPER &= 0xFFFF0FFF; //设置PD12,13,14,15推挽输出  

    

  GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m  

    

  GPIOD->PUPDR &= 0x00FFFFFF;  //PD12,13,14,15 无上拉无下拉  

    

  GPIOD->BSRRH = 0xf000;  //reset register GPIOx_BSRRH, write only  

                          //set register GPIOx_BSRRL, write only  

}  

  

/****************************************  

  函数名:MyDebugger_LEDs  

  参数:uint32_t LED  :要操作哪些LED  

        enum LED_State state  :作何操作  

  返回值:无  

  功能:改变LED的状态  

****************************************/  

void MyDebugger_LEDs(uint32_t LED, enum LED_State state)  

{  

  uint32_t tmp;  

  switch (state)  

  {  

    case on:  

      {  

        GPIOD->BSRRL |= LED;   

        break;  

      }  

    case off:  

      {  

        GPIOD->BSRRH |= LED;  

        break;  

      }  

    case turn:  

      {  

        tmp = (~GPIOD->ODR) & LED;     

        GPIOD->ODR &= ~LED;  

        GPIOD->ODR |= tmp;  

        break;  

      }   

  }  

}  

  

/*********************************************  

  函数名:MyDebugger_Init  

  参数:无  

  返回值:无  

  功能:初始化MyDebugger  

**********************************************/  

void MyDebugger_Init(void)  

{  

  LEDs_Init();  

    

#ifdef MyDebug_with_USART3  

  USART3_DMA_config();  

  USART3_config();  

#endif  

}  




主程序文件:main.c



[plain] view plaincopy

/*********************************************  

    标题:MyDebugger  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

      

    描述:实现一个调试工具  

            

    author:小船  

    data:2012-02-04  

**********************************************/  

#include   

#include   

  

uint32_t Gb_TimingDelay;  

  

void Delay(uint32_t nTime);  

  

void main ()  

{   

  SysTick_Config(SystemCoreClock / 1000); //设置systemtick一毫秒中断  

  //char test[15] = {0, 1, 2, 3, 4,  10, 11, 12, 13, 14, 15, 0xfe, 0xf0, 0x07, 0x09};  

  SCB->AIRCR = 0x05AF0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

  MyDebugger_Init();  

  while(1)  

  {   

    MyDebugger_Message("My name is Xian Yongwen\n\r",   

                            sizeof("My name is Xian Yongwen\n\r")/sizeof(char));  

      

    MyDebugger_LEDs(blue, on);  

    Delay(500);  

      

    MyDebugger_Message("广东石油化工学院\n\r",   

                            sizeof("广东石油化工学院\n\r")/sizeof(char));  

      

    MyDebugger_LEDs(blue, off);  

    Delay(500);  

  }  

}  

  

void Delay(uint32_t nTime)  

{   

  Gb_TimingDelay = nTime;  

  

  while(Gb_TimingDelay != 0);  

}  

  

void SysTick_Handler(void)  

{  

  if (Gb_TimingDelay != 0x00)  

  {   

    Gb_TimingDelay--;  

  }  

}  

运行结果:

关键字:stm32f407  MyDebugger  操作寄存器 引用地址:stm32f407之MyDebugger(操作寄存器)

上一篇:STM32F4xx 取得摄像头数据并进行处理
下一篇:stm32f407之DMA(操作寄存器)

推荐阅读最新更新时间:2024-03-16 16:14

基于STM32F407的万能红外遥控器
利用stm32f407的PA8引脚的复用功能输入捕获功能,将遥控器每个按键所对应的波形记录下来,再通过红外发射头发射出去,进而来控制电器。 由于要对所有遥控器适用,这就要求程序要能够在不知道红外编码方式的前提下学习,所以我决定将遥控器发出来的所有波形都记录下来,用的时候再按这个波形发射就能够实现遥控,中间不需要解码出相应的键值码。 编程学习波形的大致思路: 将遥控器每一个按键所对应的波形学习下来(即储存高低电平的时间 参考nec编码协议部分内容)每一位信息应该对应两个时间,所以要存储200多个时间信息,建立二维数组进行存储,利用输入捕获捕获到下降沿的时候开始计时,并立即设置为上升沿捕获,上升沿时来时读取低电平时间存到数
[单片机]
stm32f407】独立看门狗 iwdog
独立看门狗 STM32F4的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在15~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是关键字寄存器IWDG_KR 在关键字寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其 复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号
[单片机]
【<font color='red'>stm32f407</font>】独立看门狗 iwdog
STM32寄存器操作方式学习-通用定时/计数器之影子寄存器
在这幅图中细心的朋友可能会发现,有些寄存器的方框下面有阴影,这就是表示该寄存器有相应的影子寄存器。 这种寄存器表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);正如手册上的14.3.1节所说,根据TIMx_CR1寄存器中APRE位的设置,preload register的内容可以随时传送到shadow register,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把preload register的内容传送到sha
[单片机]
STM32<font color='red'>寄存器</font><font color='red'>操作</font>方式学习-通用定时/计数器之影子<font color='red'>寄存器</font>
基于STM32F407最小系统板三种矩阵键盘实现方法
这里采用的八个端口为PA0-PA7。 此处先给出矩阵键盘的原理图: 一、八个端口采用开漏输出,配置上拉电阻,实现同51一样的双向IO口功能。 //按键初始化函数 void KEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_P
[单片机]
基于<font color='red'>STM32F407</font>最小系统板三种矩阵键盘实现方法
stm32f407之CAN控制器(操作寄存器
CAN控制器 首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说。这里只是以我个人理解,简单说说CAN通信。CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符,不是单独的谁发给谁,而是,你总是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发。 然后我们可以了解一下stm32的CAN控制器。 如上图所示,stm32有
[单片机]
<font color='red'>stm32f407</font>之CAN控制器(<font color='red'>操作</font><font color='red'>寄存器</font>)
stm32跑马灯——寄存器和位操作
寄存器版: GPIO基础: 每组io口有7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。 硬件连接: 例如: 由上图1可知:要使用到LED0和LED1,他们的IO口分别为PB5和PE5 由上图2可知:要使用到LED0和LED1,他们的IO口分别为PA8和PD2 GPIO的输出模式为推挽输出。 代码: 使能IO口时钟:配置寄存器RCC APB2ENR. 初始化IO口模式:配置寄存器GPIOx CRH/CRL 操作IO口,输出高低电平:配置寄存器GPIOX_ODR或者BSRR/BRR. 这里采用上图1的的原理图: led.h: #ifndef __LED_H //避免重复引用 #d
[单片机]
stm32跑马灯——<font color='red'>寄存器</font>和位<font color='red'>操作</font>
STM32F407 SPI2 寄存器操作
//以下是SPI模块的初始化代码,配置成主机模式 //SPI口初始化 //这里针是对SPI2的初始化 void SPI2_Init(void) { u16 tempreg=0; RCC- AHB1ENR|=1 1; //使能PORTB时钟 RCC- APB1ENR|=1 14; //SPI2时钟使能 GPIO_Set(GPIOB,7 13,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB13~15复用功能输出 GPIO_AF_Set(GPIOB,13,5); //PB13
[单片机]
Stm32f407 key中断方式示例
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 中断:这个概念一般有点难以理解,但是又是一个非常重要的功能,基本所有的单片机(或者说处理器)都有中断。可见中断的重要性。51单片机都有5个中断源,这是我接触到的最简单的中断系统了。 打个比方,还是手机的那个例子,上次我说的是
[单片机]
<font color='red'>Stm32f407</font> key中断方式示例
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved