前言:??
??????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基本常用操作与流水灯的操作就为大家讲解到这。
|