智林Z32R开发板用3.5库函数操作中断和灯

2024-02-18 06:32

本文主要是介绍智林Z32R开发板用3.5库函数操作中断和灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

智林的开发板,带的例子是直接操作管脚的。

但是新的库,是用函数的。根据网上资料,http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=970817,在其基础上实现:

按pb3,灯闪,有声音,按pb2,停止。

操作杆的14口,与PC13,可以中断。

工程下载: http://download.csdn.net/detail/sunnf/6010039

/*******************************************************************************************
*      STM32F103RB智林发板 EXTI实验程序
*    
*    功能 :  外部中断灯 和声音
*            
*
*********************************************************************************************/
#include "stm32f10x.h"

typedef volatile  unsigned char  uint8;
typedef volatile  unsigned int   uint16;
typedef volatile  unsigned long  uint32;

#define          vallue_temp000           0
#define          vallue_temp001           1
#define          vallue_temp002           2
#define          vallue_temp003           3
#define          vallue_temp004           4

unsigned char value_temp;                 //花样流水灯变量

//===========================================================================================//
//GPIO端口配置寄存器
void GPIO_InitStructReadtempCmd(void)
{
 GPIO_InitTypeDef GPIO_InitStruct;        //固件库自带GPIO结构体

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5;       //配置GPIOB引脚0和5 0脚是嗽叭
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;        //配置输出速率50MHZ
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;         //配置为推挽式输出
 GPIO_Init(GPIOB, &GPIO_InitStruct);              //指定初始化GPIO寄存器

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;           //,其实对应PB14端口
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;           //标示的pb3,其实对应PA0端口
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;           //标示的pb2,其实对应Pc3端口
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOC, &GPIO_InitStruct);
}

//===========================================================================================//
//配置GPIO外设时钟
void RCC_ABP2PeriphReadtempyCmd(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //打开GPIOA外设时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //打开GPIOB外设时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //打开GPIOC外设时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);  //打开AFIO 复用功能外设时钟 没有这行中断没有
                                                            //但是调试时,总是进入void EXTI15_10_IRQHandler(void),运行时好像没有进入。很奇怪。
                                                            //如有高手知道,请知之qq:280215407
}

//===========================================================================================//
//EXTI配置外部中断
void EXTI_InitStructReadtempCmd(void)
{
 EXTI_InitTypeDef EXTI_InitStruct;

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0 );  //配置复用GPIOA_0 引脚做为外设线路
 EXTI_ClearITPendingBit(EXTI_Line0 );              //清除EXTI_Line0 中断挂起位
 EXTI_InitStruct.EXTI_Line = EXTI_Line0;             //选择中断线路
 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;        //配置EXTI为中断请求线路
 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;      //配置输入线路下升沿为中断请求
 EXTI_InitStruct.EXTI_LineCmd = ENABLE;                        //外部中断使能
 EXTI_Init(&EXTI_InitStruct);                  //初始化EXTI寄存器
 
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14 ); //配置复用GPIOA_14 引脚做为外设线路
 EXTI_ClearITPendingBit(EXTI_Line14);              //清除EXTI_Line14 中断挂起位
 EXTI_InitStruct.EXTI_Line = EXTI_Line14;            //选择中断线路
 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;        //配置EXTI为中断请求线路
 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;      //配置输入线路下升沿为中断请求
 EXTI_InitStruct.EXTI_LineCmd = ENABLE;                        //外部中断使能
 EXTI_Init(&EXTI_InitStruct);                  //初始化EXTI寄存器
 
 
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13 ); //配置复用GPIOC_13 引脚做为外设线路
 EXTI_ClearITPendingBit(EXTI_Line13);              //清除EXTI_Line3 中断挂起位
 EXTI_InitStruct.EXTI_Line = EXTI_Line13;            //选择中断线路
 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;        //配置EXTI为中断请求线路
 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;      //配置输入线路下升沿为中断请求
 EXTI_InitStruct.EXTI_LineCmd = ENABLE;                        //外部中断使能
 EXTI_Init(&EXTI_InitStruct);   
}

//===========================================================================================//
//配置相应中断(嵌套向量控制器 NVIC)
void NVIC_InitStructReadtempCmd(void)
{
 NVIC_InitTypeDef NVIC_InitStruct;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);         //配置EXTI中断组
 NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;          //配置中断通道0
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;    //先占优先级设置为1
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        //从中断优先级设置为1
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;               //使能中断
 NVIC_Init(&NVIC_InitStruct);                 //初始化嵌套向量控制器NVIC寄存器
          //注意这里EXTI5_10_IRQn是EXTI3到EXTI14共用一个中断响应函数
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);          //配置EXTI中断组
 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;         //配置中断通道13,14
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;    //先占式优先级设置为0
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;        //从中断优先级设置为0
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;               //使能中断
 NVIC_Init(&NVIC_InitStruct);                 //初始化嵌套向量控制器NVIC寄存器
}            //注意这里EXTI15_10_IRQn是EXTI13到EXTI14共用一个中断响应函数

//===========================================================================================//
//延时子函数   //不是很精确啊 340为1毫秒
void Delay_us(uint32 CountLing)
{
 signed char i;
 while(CountLing--)
 {
  i = 10;
  while(i--);
 }
}

//===========================================================================================//
//LED跑马灯子函数
void GPIO_DISPLAY_LiusdengCmd(void)
{
 switch         (value_temp)          
 {
  case    vallue_temp000 :            //0
       {
        GPIO_SetBits(GPIOB, GPIO_Pin_5);   //配置指定端口位输出高电平
       Delay_us(100000);           //延时

       GPIO_ResetBits(GPIOB, GPIO_Pin_5);
       Delay_us(100000);

       } break;

  case    vallue_temp001 :           //1
       {
        GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_5);
       Delay_us(100000);

       GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_5);
       Delay_us(100000);

       } break;
                 //2
  case    vallue_temp002 :    
       {
        GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5);
       Delay_us(100000);

       GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5 );
       Delay_us(100000);

       GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5 );
       Delay_us(100000);

       GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5  );
       Delay_us(100000);
       } break;
                  //3
  case    vallue_temp003 :
       {
        GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5);
       Delay_us(100000);

       GPIO_SetBits(GPIOB, GPIO_Pin_0);
       GPIO_ResetBits(GPIOB, GPIO_Pin_5 );
       Delay_us(100000);

      

       } break; 

  case    vallue_temp004 :           //4
       {
        GPIO_SetBits(GPIOB, GPIO_Pin_All);
       Delay_us(100000);
 
       GPIO_ResetBits(GPIOB, GPIO_Pin_All);
       Delay_us(100000);
 
       } break;


  default:        break;
   
 }
}

//===========================================================================================//
//函数主体  
int main(void)
{
 SystemInit();                  //系统时钟初始化 进入72M 主频
 RCC_ABP2PeriphReadtempyCmd();         //初始化外设时钟子函数
 GPIO_InitStructReadtempCmd();         //初始化GPIO配置子函数
 EXTI_InitStructReadtempCmd();         //初始化外部中断配置子函数
 NVIC_InitStructReadtempCmd();         //初始化嵌套向量控制器子函数
  
 while(1)                    //进入大循环
 {
  GPIO_DISPLAY_LiusdengCmd();         //循环显示LED跑马灯子函数
 }
}

//===========================================================================================//
//EXTI0外部中断服务程序
void EXTI0_IRQHandler(void)
{
 value_temp++;                            //变量加加
 if(value_temp == 5)                        //判断变量等于5
 {
  value_temp = 0;                         //清零
 }
 EXTI_ClearITPendingBit(EXTI_Line0 );     //清除EXTI0中断挂起位
}
//===========================================================================================//
//EXTI13 14外部中断服务程序
void EXTI15_10_IRQHandler(void)
{
 if (EXTI_GetITStatus(EXTI_Line13))
 {
  value_temp = 3;                 //清零
  EXTI_ClearITPendingBit(EXTI_Line13 );      //清除EXTI13中断挂起位
 }
 
 if (EXTI_GetITStatus(EXTI_Line14))
 {
  value_temp = 0;                 //清零
  EXTI_ClearITPendingBit(EXTI_Line14 );      //清除EXTI14中断挂起位 游戏杆 向下
 }
//  if((GPIO_ReadInputData(GPIOB) & 0x2000) == GPIO_ReadInputData(GPIOB) )
//  {
//   value_temp = 3;                 //清零
//   EXTI_ClearITPendingBit(EXTI_Line13 );      //清除EXTI13中断挂起位
//  }
//  else if((GPIO_ReadInputData(GPIOC) & 0x2000) == GPIO_ReadInputData(GPIOC)  )
//  {
//   value_temp = 0;                 //清零
//   EXTI_ClearITPendingBit(EXTI_Line13 );      //清除EXTI13中断挂起位
//  }
//  

}

 

这篇关于智林Z32R开发板用3.5库函数操作中断和灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720326

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言