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

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho