本文主要是介绍智林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库函数操作中断和灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!