打印
[Cortex-M0技术交流]

【第三期】三生石的M0学习笔记第1贴--GPIO

[复制链接]
2577|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2011-10-13 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2011-10-14 01:51 编辑

http://v.youku.com/v_show/id_XMzEyMzM5NTQ4.html

这个视频时 怎么测创建KEIL 的M0工程和NU-LINK+KEIL下载


串口和ISP的问题还没解决,所以先写了个GPIO的而调试方法就变成了蜂鸣器的响铃次数了。
对GPIO的操作主要就几个函数
1,int32_t DrvGPIO_Open(E_DRVGPIO_PORT port, int32_t i32Bit, E_DRVGPIO_IO mode)
这个函数主要是打开GPIO,并且设置GPIO的工作模式,输入输出等等。并且是直接对位进行操作
第一个变量时,端口。第二个变量时第几口,第三个是工作模式
2,int32_t DrvGPIO_Close(E_DRVGPIO_PORT port, int32_t i32Bit)
这个是关闭那个端口的第几个口。
3,int32_t DrvGPIO_ClrBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这个函数为把那个端口的第几个口的电平拉低, 这个函数工作在IO口为OUTPUT的模式下
4,int32_t DrvGPIO_SetBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这个函数为把那个端口的第几个口的电平拉高, 这个函数工作在IO口为OUTPUT的模式下
5,int32_t DrvGPIO_GetBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这二个函数是取得端口电压
6,void DrvGPIO_EnableEINT0(E_DRVGPIO_INT_TYPE TriggerType, E_DRVGPIO_INT_MODE Mode, GPIO_EINT0_CALLBACK pfEINT0Callback)
看名字也知道 时能外部中断0
7,void DrvGPIO_DisableEINT0(void)
see name 关闭外部中断0
8,int32_t DrvGPIO_InitFunction(E_DRVGPIO_FUNC function)
设置IO口处于第几功能。  例如UART,SPI等, 如果使用这些功能就要进行相应的设置!


对GPIO的主要操作就是这些
如果我们要把一个IO口拉高,那么顺序就是
打开IO口并且设置为输出(Open函数)---->拉高IO口(SetBit函数)---->任务结束以后就(Close函数)。
如果我们要使用UART功能首先就要把GPIO的UART打开
DrvGPIO_InitFunction(E_FUNC_UART0);
相应的外部中断等等都是如此



*本实验主要验证GPIO口的 输出,输入功能。 置高,置低。对GPIO进行基本的操作*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvUART.h"
#include "DrvSYS.h"

#define SUCCESS 0xff
#define FALI 0x00

#define OPENBEEP DrvGPIO_SetBit(E_GPB,10)
#define CLOSEBEEP DrvGPIO_ClrBit(E_GPB,10)
/*
typedef struct DRVUART_STRUCT
{
uint32_t u32BaudRate;
E_DATABITS_SETTINS u8cDataBits;
E_STOPBITS_SETTINS u8cStopBits;
E_PARITY_SETTINS u8cParity;
E_FIFO_SETTINGS u8cRxTriggerLevel;
uint8_t u8TimeOut ;
}STR_UART_T;
*/
uint8_t DrvUART_Init(uint32_t band)
{
STR_UART_T param; //声明串口结构体,里面就是对串口操作的一些变量

UNLOCKREG();
SYSCLK->WRCON.XTL12M_EN=1; // 使能12M时钟
DrvSYS_Delay(5000);
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); //select IP clock source
DrvGPIO_InitFunction(E_FUNC_UART0); //设置GPIO口为UART功能
//Select UART configure
param.u32BaudRate = band; //设置波特率为 115200
param.u8cDataBits = DRVUART_DATABITS_8; //设置数据为8位
param.u8cStopBits = DRVUART_STOPBITS_1; //停止位1位
param.u8cParity = DRVUART_PARITY_NONE; //无效验码
param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; //Rx Trigger Leve 1 byte
param.u8TimeOut = 0; //时间益处

if(DrvUART_Open(UART_PORT0,¶m)==E_SUCCESS) //initialize UART0
{
return SUCCESS;
}
else
return FALI;
}
//蜂鸣器初始化.
//因为IO口初始化以后默认输出为高
//所以初始化以后马上拉低IO口
void DrvDeep_Init()
{
DrvGPIO_Open(E_GPB,10,E_IO_OUTPUT);
DrvGPIO_ClrBit(E_GPB,10);
}

//连续响铃函数
//u8Count为响铃的次数
void DrvDeep_RingCount(uint8_t u8Count)
{
while(u8Count--)
{
OPENBEEP;
DrvSYS_Delay(80000); //系统延时函数
CLOSEBEEP;
DrvSYS_Delay(80000);
}
}
//主函数
//注意要将GPA3和GPA4连接在一起, 不然实验没效果!
//GPA3和GPA4在排针的最后一排二个。
int main()
{

int32_t i32Err;
DrvDeep_Init();

if(DrvUART_Init(115200)==FALI) //打开串口。如果打开失败,响铃5下
{
DrvDeep_RingCount(5);
}
printf("\nSet UART0->UART0 is sucess\n"); //打开成功,打印消息
printf("\n---------------------------\n");
/*---------------------------------------------------------------------------------------------------------*/
/* Basic Setting -----DrvGPIO_Open,DrvGPIO_SetBit,DrvGPIO_GetBit */
/*---------------------------------------------------------------------------------------------------------*/
DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT); //GPA3设置成输出模式
DrvGPIO_Open(E_GPA,4,E_IO_INPUT); //GPA4设置成输入模式

DrvGPIO_ClrBit(E_GPA,3); //GPA3口拉低

if(DrvGPIO_GetBit(E_GPA,4)==0 ) //检测GPA4口的电压,如果为第,证明GPA3口拉底成功!
{
printf("\nSet GPIO->SetBit is sucess\n");
printf("\n GetBit is sucess\n");
printf("\n DrvGPIO_Open is sucess\n");

DrvDeep_RingCount(3); //响铃三下
}
/*---------------------------------------------------------------------------------------------------------*/
/* Basic Setting -----DrvGPIO_ClrBit */
/*---------------------------------------------------------------------------------------------------------*/
DrvGPIO_SetBit(E_GPA,3); //GPA3拉高

if(DrvGPIO_GetBit(E_GPA,4)==0) //检测GPA4口的电压,如果为高PA3口拉高成功!
{
printf("\n ClrBit is sucess for %d\n",DrvGPIO_GetBit(E_GPA,1));
DrvDeep_RingCount(3);
}
while(1);

}

UART-GPIO.rar

441.41 KB

相关帖子

沙发
hotpower| | 2011-10-14 01:52 | 只看该作者
俺帮你改了,注意要用code

使用特权

评论回复
板凳
kyzb001|  楼主 | 2011-10-14 08:59 | 只看该作者
谢谢大叔!
我想用code来着。  狂点...就是点不出来....

对了  printf要注意咯。  如果项目很小的话,可以毫无顾忌的使用printf。
但是有一定量的画, 建议不要使用printf

使用特权

评论回复
地板
564451696| | 2011-10-14 09:11 | 只看该作者
顶顶,你真快,俺休息玩玩玩。。。

使用特权

评论回复
5
kyzb001|  楼主 | 2011-10-14 12:03 | 只看该作者
顶顶,你真快,俺休息玩玩玩。。。
564451696 发表于 2011-10-14 09:11

嘿嘿!  那当然要速度...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

623

帖子

1

粉丝