[STC32F12k54入门第一步]GPIO驱动(GPIO输出、GPIO输入、外部中断)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


STC出了一款60MHZ的32位单片机追风剑,博主刚好在群里面就提前购买了。用起来还不错,老规矩写一个教程出来。
全部包括内容:
1、GPIO驱动(GPIO输出、GPIO输入、外部中断)-----本章内容
2、Timer定时器。
3、USART+Modbus_RTU
4、ADC+串联分压
5、硬件SPI+OLED
6、硬件SPI+LCD
7、硬件I2C+INA229电流电压采样模块
8、PWM+A4988驱动步进电机
9、实战项目、没想好做什么
未完,待作者想内容

一、环境配置?

第一步
首先我们需要在官网下载最新版本的ISP下载调试助手。

//资料下载官网
www.STCAI.com

现在最新版本V6.91V
在这里插入图片描述

第二步
是添加STC32F12K54的软件包
在这里插入图片描述
然后选择我们的型号
在这里插入图片描述

然后选择你Keil的安装路径
在这里插入图片描述
再然后打开keil看下有没有我们的板子型号的软件包
这里显示的是STC32F12K64,我们使用的K54,但是选择这个也没有什么影响。
在这里插入图片描述
然后我们还要设置一下魔法棒
在这里插入图片描述
最后是输出文件设置
在这里插入图片描述
第三步程序烧录,我这里是使用USB烧录的,
烧录步骤:
按住P3.2不放,然后在按一下电源键。(方正和STC32G一样的)
最后就没有什么问题了

二、GPIO驱动

引脚的模式就去看我的STC32G入门第一篇,没啥好说的。
注意:STC32F要使用大于32MHZ的频率需要将WTST指令不能置“0”

system.h—>这个库主要是STC32F的引脚初始化、ms延时函数、初始配置

#ifndef __System_H
#define __System_H
#include <STC32G.H>
#include <String.h>
#define MAIN_Fosc		56000000L	//定义主时钟

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int  u32;
#defien GPIO_PIN_RESET   0
#define GPIO_PIN_SET     1

GPIO_Init(void);
void delay_ms(unsigned int ms);

#endif

system.c

#include "System.h"


/*函数名:GPIO_Init(void)
*功能:STC32F初始化和引脚初始化
*形参:无
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
void GPIO_Init(void){
		WTST = 1;  //设置程序指令延时参数,使用大于32MHZ不能将其置0
		EAXFR = 1; //扩展寄存器(XFR)访问使能
		CKCON = 0; //提高访问XRAM速度	
	  P1M1=0x00;     P1M0=0x00;
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
		P2SR = 0xff;   
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口	
}
/*函数名:delay_ms(unsigned int ms)
*功能:ms延时函数
*形参:ms 延时时间
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
void delay_ms(unsigned int ms)
{
	unsigned int i;
	do{
		i = MAIN_Fosc / 6030;
		while(--i);
	}while(--ms);
}

1、GPIO输出

main.c

#include <STC32G.H>
#include "System.h"
/*函数名:main(void)
*功能:P3、P2进行闪烁
*形参:无
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
int main(void){
	GPIO_Init(); //设置输入引脚为准双向口模式
	while(1){
		P3=0x00;
		P2=0x00;
		delay_ms(20);
		P3=0xff;
		P2=0xff; 
		delay_ms(20);
	}	
}

2、GPIO输入

main.c

#include <STC32G.H>
#include "System.h"



/*函数名:main(void)
*功能:读取P3.2的引脚让P2、P3引脚亮
*形参:无
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
int main(void){
	GPIO_Init();
	while(1){
		if(P32==0){
				P2=0x00; //LED亮
				P3=0x00;
     while(P32==0);	
		}else if(P32==1){ 
			P2=0xff;
			P3=0xff;						
		}

	}		
}

3、引脚外部中断

main.c

#include <STC32G.H>
#include "System.h"


/*函数名:GPIO_NVIC(void)
*功能:GPIO的外部中断
*形参:无
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
void GPIO_NVIC(void){
	P3IM0=0x00;
	P3IM1=0xff;
	P3INTE=0xff;
	EA=1;        //开启中断
}

/*函数名:main(void)
*功能:读取P3.2的引脚让P2、P3引脚亮
*形参:无
*返回值:无
*修改时间:2023/6/56
*作者:小夏
*/
int main(void){
	GPIO_Init();
	GPIO_NVIC();
	while(1){

	}		
}
void GPIO_IRQ(void) interrupt 40 
{
	u8 flag;
	flag=P3INTF;
	if(flag)
		P3INTF=0x00;
	if(flag&0x01){
		
	}
	if(flag&0x02){
	
	}
	if(flag&0x04){ //P32引脚
		P21=1;
	}
	if(flag&0x08){//P33引脚
		P21=0;
	}
	if(flag&0x10){
	
	}
	if(flag&0x20){
	
	}
	if(flag&0x40){
	
	}
	if(flag&0x80){
	
	}
}

总结

ok,这就完成了GPIO的全部教学

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32F103ZET6是一款功能强大的微控制器,具有多种外围设备和接口。其中,GPIO外部中断是一种非常有用的功能,可以通过该功能实现对外部事件的快速响应。 在STM32F103ZET6中,GPIO外部中断的实现需要以下步骤: 1. 配置GPIO口为输入模式,并使能外部中断。 2. 配置中断触发方式,可以选择上升沿触发、下降沿触发、双边沿触发等方式。 3. 编写中断服务函数,在该函数中实现对外部事件的处理。 以下是一个简单的示例代码,演示如何在STM32F103ZET6上实现GPIO外部中断: //配置GPIO口为输入模式 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置PA0引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //配置为输入模式,上拉 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA //使能外部中断 NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择中断线路 EXTI_InitStructure.EXTI_Line = EXTI_Line0; //选择中断线0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //选择中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //选择上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线 EXTI_Init(&EXTI_InitStructure); //初始化中断 //编写中断服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断中断是否发生 { //处理外部事件 //... EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位 } } 以上代码演示了如何在PA0引脚上实现上升沿触发的GPIO外部中断,并在中断服务函数中处理外部事件。实际应用中,可以根据需要选择不同的GPIO口和中断触发方式,并编写相应的中断服务函数来实现更加复杂的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片有机机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值