完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
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 中。 #ifndef __GPIO_H #define __GPIO_H #include #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< GPIO 输出使能 与 输入使能(去使能) *******************************************************/ #define PA_OUT_ENABLE(x) PA->OUTEN|=(1< #define PA_OUT_DISABLE(x) PA->OUTEN&=~(1< GPIO输出置高 ****************************************************/ #define PA_OUT_HIGH(x) PA -> OUTSET = (1< GPIO输出置低 *******************************************************/ #define PA_OUT_LOW(x) PA -> OUTCLR = (1< GPIO输出翻转 ******************************************************/ #define PA_OUT_TOGGLE(x) PA->OUTTGL = (1< GPIO中断使能与去使能 ******************************************************/ #define PA_INT_ENABLE(x) PA->INTMASK&=~(1< #define PA_INT_DISABLE(x) PA->INTMASK|=(1< /**************************************************** GPIO引脚中断类型选择 *****************************************************/ #define PA_INT_LEVEL(x) PA->INTTYPE&=~(1< #define PA_INT_EDGE(x) PA->INTTYPE|=(1< GPIO选择单/双边沿触发中断 *****************************************************/ #define PA_INT_BE_ENABLE(x) PA->INTBV|=(1< #define PA_INT_BE_DISABLE(x) PA->INTBV&=~(1< GPIO中断触发极性选择 ******************************************************/ #define PA_INT_POL_HIGH(x) PA->INTPOL|=(1< #define PA_INT_POL_LOW(x) PA->INTPOL&=~(1< GPIO中断标志位清除 *****************************************************/ #define PA_INT_FLAG_CLR(x) PA->RIS=(1< 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、管脚使能、管脚高低电平的设置操作。 二、流水灯实现: #ifndef __LED_H #define __LED_H #include #include ///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 #include #include #include #include "delay.h" #include /*************************************************************** 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)); } } #include #include #include "delay.h" #include "LED.h" int main() { Device_Init(); //系统初始化 while(1) { _cror_(); } } 关于GPIO基本常用操作与流水灯的操作就为大家讲解到这。 |
|
|
|
只有小组成员才能发言,加入小组>>
3323 浏览 9 评论
3000 浏览 16 评论
3498 浏览 1 评论
9073 浏览 16 评论
4093 浏览 18 评论
1198浏览 3评论
614浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2343浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1902浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 01:14 , Processed in 1.413404 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号