IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> LK32T102 单片机 操作GPIO实现流水灯(1) -> 正文阅读

[嵌入式]LK32T102 单片机 操作GPIO实现流水灯(1)

前言:??

??????LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。

? ? ? ? LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。

? ? ? ? 我们初步的了解这款单片机后,我们一起来学习探索一下如何使用 GPIO操作?来实现这个好玩的“花样流水灯功能”。

功能实现:

一、创建模板:

????????LK32T102这块单片机是 cortex-M0 架构的,学习过STMF103ZET6 这款单片机的同学应该知道 cortext-M3 架构的。其实LK32T102这个款单片机的操作与STM32F103ZET6的操作大致相同。

????????下面开始创建项目,STMF103一样的,我这里也是直接使用写好的模板。

? ? ?

????????这里的布局与STM32F103的布局大致相同,自己 编写的程序放在 HARDWARE 中,要调用和操作的函数(例如:GPIO操作)放在了FWLEB 中,然后主函数放在USER 中。

<GPIO.h>

#ifndef __GPIO_H
#define __GPIO_H

#include <SC32F5832.h>

#define DIGITAL		(0<<4)    
#define ANALOGY		(1<<4)

#define ODEN			(1<<13)
#define ODDIS			(0<<13)

#define DRV_HIGH	(1<<10)
#define DRV_LOW		(0<<10)

#define PUPD_NULL  (0<<6)
#define PUPD_PU    (2<<6)
#define PUPD_PD    (1<<6)
#define PUPD_REPEATER  (3<<6)

/******************************************************
		读取 GPIO 电平状态
*******************************************************/
#define Read_PA_Sta(x) (PA->PIN&(1<<x))
#define Read_PB_Sta(x) (PB->PIN&(1<<x))
#define Read_PC_Sta(x) (PC->PIN&(1<<x))
/******************************************************
		GPIO 输出使能 与 输入使能(去使能)
*******************************************************/
#define PA_OUT_ENABLE(x) PA->OUTEN|=(1<<x)					// 输出使能
#define PB_OUT_ENABLE(x) PB->OUTEN|=(1<<x)
#define PC_OUT_ENABLE(x) PC->OUTEN|=(1<<x)

#define PA_OUT_DISABLE(x) PA->OUTEN&=~(1<<x)			// 输入使能
#define PB_OUT_DISABLE(x) PB->OUTEN&=~(1<<x)		
#define PC_OUT_DISABLE(x) PC->OUTEN&=~(1<<x)		
/******************************************************
		GPIO输出置高
****************************************************/
#define PA_OUT_HIGH(x) PA -> OUTSET = (1<<x)
#define PB_OUT_HIGH(x) PB -> OUTSET = (1<<x)
#define PC_OUT_HIGH(x) PC -> OUTSET = (1<<x)
/******************************************************
		GPIO输出置低
*******************************************************/
#define PA_OUT_LOW(x) PA -> OUTCLR = (1<<x)
#define PB_OUT_LOW(x) PB -> OUTCLR = (1<<x)
#define PC_OUT_LOW(x) PC -> OUTCLR = (1<<x)
/*****************************************************
		GPIO输出翻转
******************************************************/
#define PA_OUT_TOGGLE(x) PA->OUTTGL = (1<<x)
#define PB_OUT_TOGGLE(x) PB->OUTTGL = (1<<x)
#define PC_OUT_TOGGLE(x) PC->OUTTGL = (1<<x)
/*****************************************************
		GPIO中断使能与去使能
******************************************************/
#define PA_INT_ENABLE(x) PA->INTMASK&=~(1<<x)					//中断使能
#define PB_INT_ENABLE(x) PB->INTMASK&=~(1<<x)	
#define PC_INT_ENBALE(x) PC->INTMASK&=~(1<<x)	

#define PA_INT_DISABLE(x) PA->INTMASK|=(1<<x)			//中断屏蔽
#define PB_INT_DISABLE(x) PB->INTMASK|=(1<<x)
#define PC_INT_DISBALE(x) PC->INTMASK|=(1<<x)

/****************************************************
		GPIO引脚中断类型选择
*****************************************************/
#define PA_INT_LEVEL(x) PA->INTTYPE&=~(1<<x)					//配置为电平触发中断
#define PB_INT_LEVEL(x) PB->INTTYPE&=~(1<<x)	
#define PC_INT_LEVEL(x) PC->INTTYPE&=~(1<<x)	

#define PA_INT_EDGE(x) PA->INTTYPE|=(1<<x)				//配置为边沿触发中断
#define PB_INT_EGDE(x) PB->INTTYPE|=(1<<x)			
#define PC_INT_EGDE(x) PC->INTTYPE|=(1<<x)			
/****************************************************
		GPIO选择单/双边沿触发中断
*****************************************************/
#define PA_INT_BE_ENABLE(x) PA->INTBV|=(1<<x)					//双边沿触发
#define PB_INT_BE_ENABLE(x) PB->INTBV|=(1<<x)			
#define PC_INT_BE_ENABLE(x) PC->INTBV|=(1<<x)			

#define PA_INT_BE_DISABLE(x) PA->INTBV&=~(1<<x)				//单边沿触发
#define PB_INT_BE_DISABLE(x) PB->INTBV&=~(1<<x)	
#define PC_INT_BE_DISABLE(x) PC->INTBV&=~(1<<x)	
/*****************************************************
		GPIO中断触发极性选择
******************************************************/
#define PA_INT_POL_HIGH(x) PA->INTPOL|=(1<<x)			// 上升沿或高电平触发
#define PB_INT_POL_HIGH(x) PB->INTPOL|=(1<<x)	
#define PC_INT_POL_HIGH(x) PC->INTPOL|=(1<<x)	

#define PA_INT_POL_LOW(x) PA->INTPOL&=~(1<<x)				// 下降沿或低电平触发
#define PB_INT_POL_LOW(x) PA->INTPOL&=~(1<<x)
#define PC_INT_POL_LOW(x) PA->INTPOL&=~(1<<x)
/****************************************************
		GPIO中断标志位清除
*****************************************************/
#define PA_INT_FLAG_CLR(x)	PA->RIS=(1<<x)
#define PB_INT_FLAG_CLR(x)	PB->RIS=(1<<x)
#define PC_INT_FLAG_CLR(x)	PC->RIS=(1<<x)

extern void GPIO_AF_SEL(uint8_t AD,PA_Type* GPIOx,uint8_t gpiopin,uint8_t fun_num);
extern void GPIO_OD_SEL(uint8_t OD,PA_Type* GPIOx,uint8_t gpiopin);
extern void GPIO_DRV_SEL(uint8_t DRV,PA_Type* GPIOx,uint8_t gpiopin);
extern void GPIO_PUPD_SEL(uint8_t PUPD,PA_Type* GPIOx,uint8_t gpiopin);

#endif

? ? ? ? 这个函数是针对IO进行操作和设置。我们来设置一个举例一下(PB1数字模式,输出使能):

?????

void PB_Init()
{
    GPIO_AF_SEL(DIGITAL,PB,1,0);
    PB->OUTSENT(1);
}

这个函数是GPIO的初始化函数,也是我们这块单片机最长用到的。

extern void GPIO_AF_SEL(uint8_t AD,PA_Type*?GPIOx ,uint8_t gpiopin,uint8_t fun_num);

AD:DIGITAL(数字模式)/? ANALOGY?(模拟模式 该模式的选择参考“用户编程手册”第19页。

GPIOx:这里放置 IO组(PA/PB/PC)

gpiopin:这里放置管脚号(0-15)

fun_num:这里选择管脚功能(这个参考管脚的模式和需要的功能去选择)

????????关于GPIO初始化 涵盖一下三个操作,分别为初始化GPIO、管脚使能、管脚高低电平的设置操作。

二、流水灯实现:

<LED.h>

#ifndef __LED_H
#define __LED_H	

#include <SC32F5832.h>
#include <GPIO.h>

///LED灯

//点亮LED
#define ON_LED(x) 	PB_OUT_LOW(x)		//点亮指定LED灯  范围 0~7 
#define LED1_ON 		PB_OUT_LOW(0)		//PB0 -D9  输出低电平 LED1点亮
#define LED2_ON	 		PB_OUT_LOW(1)		//PB0 -D10 输出低电平 LED1点亮
#define LED3_ON 		PB_OUT_LOW(2)		//PB0 -D11 输出低电平 LED1点亮
#define LED4_ON 		PB_OUT_LOW(3)		//PB0 -D12 输出低电平 LED1点亮
#define LED5_ON 		PB_OUT_LOW(4)		//PB0 -D14 输出低电平 LED1点亮
#define LED6_ON 		PB_OUT_LOW(5)		//PB0 -D15 输出低电平 LED1点亮
#define LED7_ON 		PB_OUT_LOW(6)		//PB0 -D16 输出低电平 LED1点亮
#define LED8_ON 		PB_OUT_LOW(7)		//PB0 -D17 输出低电平 LED1点亮

//熄灭LED
#define OFF_LED(x) 	PB_OUT_HIGH(x)		//熄灭指定LED灯  范围 0~7
#define LED1_OFF		PB_OUT_HIGH(0)		//PB0 -D9  输出低电平 LED1点亮
#define LED2_OFF		PB_OUT_HIGH(1)		//PB0 -D10 输出低电平 LED1点亮
#define LED3_OFF		PB_OUT_HIGH(2)		//PB0 -D11 输出低电平 LED1点亮
#define LED4_OFF		PB_OUT_HIGH(3)		//PB0 -D12 输出低电平 LED1点亮
#define LED5_OFF		PB_OUT_HIGH(4)		//PB0 -D14 输出低电平 LED1点亮
#define LED6_OFF		PB_OUT_HIGH(5)		//PB0 -D15 输出低电平 LED1点亮
#define LED7_OFF		PB_OUT_HIGH(6)		//PB0 -D16 输出低电平 LED1点亮
#define LED8_OFF		PB_OUT_HIGH(7)		//PB0 -D17 输出低电平 LED1点亮


void _crol_( void );	//循环左移流水灯
void _cror_( void );	//循环右移流水灯
void LED_init(void);	//LED初始化

#endif

<LED.c>

#include <SC32F5832.h>
#include <DevInit.h>
#include <LED.h>
#include "delay.h"
#include <GPIO.h>

/***************************************************************
						LED初始化
****************************************************************/
void LED_init(void)    
{
    /*--- LED1 - LDE8 IO初始化为 数字输出模式 ---*/
    // 函数原型:
	// GPIO_AF_SEL(uint8_t AD,PA_Type* GPIOx,uint8_t gpiopin,uint8_t fun_num);
	// PB0 - PB7 -> LED1 - LED8  初始化IO口
	GPIO_AF_SEL(DIGITAL, PB, 0, 0);       // LED1 - D9
	GPIO_AF_SEL(DIGITAL, PB, 1, 0);       // LED2 - D10
	GPIO_AF_SEL(DIGITAL, PB, 2, 0);       // LED3 - D11
	GPIO_AF_SEL(DIGITAL, PB, 3, 0);       // LED4 - D12
	GPIO_AF_SEL(DIGITAL, PB, 4, 0);       // LED5 - D14
	GPIO_AF_SEL(DIGITAL, PB, 5, 0);       // LED6 - D15
	GPIO_AF_SEL(DIGITAL, PB, 6, 0);       // LED7 - D16
	GPIO_AF_SEL(DIGITAL, PB, 7, 0);       // LED8 - D17

	/*--- LED1 - LDE8 IO口设置为 输出使能 ---*/
	PB_OUT_ENABLE(0);	  
	PB_OUT_ENABLE(1);	  
	PB_OUT_ENABLE(2);	 
	PB_OUT_ENABLE(3);	 
	PB_OUT_ENABLE(4);	 
	PB_OUT_ENABLE(5);	 
	PB_OUT_ENABLE(6);	 
	PB_OUT_ENABLE(7);
    
    /*--- 初始状态为 关闭状态 ---*/
	LED1_OFF;LED2_OFF;LED3_OFF;LED4_OFF;
	LED5_OFF;LED6_OFF;LED7_OFF;LED8_OFF;

}
/***************************************************************
						LED循环右移
****************************************************************/
void _cror_( void )
{
	//u8 PB_Value = 1;
	u8 i;
	
	for(i = 0; i <= 8; i++)
	{
		delay_ms(200);
		PB_OUT_ENABLE(i);	
		PB_OUT_LOW((i));
		
		delay_ms(200);
		PB_OUT_DISABLE(i);	
	}
}
/***************************************************************
						LED循环左移
****************************************************************/
void _crol_( void )
{
	//u8 PB_Value = 1;
	u8 i;
	
	for(i = 8; i >= 1; i--)
	{
		delay_ms(200);
		PB_OUT_ENABLE((i - 1));	
		PB_OUT_LOW((i - 1));
		
		delay_ms(200);
		PB_OUT_DISABLE((i - 1));	
	}
}

<main.c>

#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include "LED.h"

int main()
{
	Device_Init();	//系统初始化
	while(1)
	{
		_cror_();
	}
}

? ? ? ? 关于GPIO基本常用操作与流水灯的操作就为大家讲解到这。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 16:02:04  更:2021-11-15 16:02:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:53:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码