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

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常