智林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

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum