本帖最后由 hotpower 于 2011-10-21 01:10 编辑
一:先说一下写任何程序的通用思路:1.芯片注册解锁;函数为: UNLOCKREG();
2.设定晶振;
函数为: SYSCLK->;PWRCON.XTAL12M_EN = 1;
(这里用的是常用的外部12M晶振,还可以是XTAL32K_EN,OSC22M_EN,OSC10K_EN)
3.等待时钟就绪;函数为: DrvSYS_Delay(5000);
4.写自己的程序
二:GPIO常用函数:1.设置端口模式:DrvGPIO_Open(端口,引脚,模式);
端口为E_GPA到E_GPE;
引脚为对应数字1,2......
模式有:E_IO_INPUT,E_IO_OUTPUT,E_IO_OPENDRAIN,E_IO_QUAST;
2.端口清零:DrvGPIO_ClrBit(端口,引脚)
3.端口置位:DrvGPIO_SetBit(端口,引脚)
4.端口统一设置:DrvGPIO_SetPortBits(端口,所有引脚的高低电平)
三:本函数设计思想:模拟资料里的实验1,2.自己设置通过串口来控制LED灯闪烁模式。
源程序如下:
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "DrvUART.h"
void init(void) //初始化
{
UNLOCKREG(); //解锁
SYSCLK->;PWRCON.XTL12M_EN = 1; //设定12M外部晶振
DrvSYS_Delay(5000);
}
void set_gpio(void) //设置GPIO模式
{
DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5,E_IO_OUTPUT);
}
void set_uart() //设置串口
{
STR_UART_T param;
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); // 使能UART时钟
DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置
param.u32BaudRate = 115200; // 波特率
param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
param.u8cParity = DRVUART_PARITY_NONE; // 校验位
param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
param.u8TimeOut = 0; // FIFO超时设定
DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值
}
void mode_1(void) //模式一
{
uint8_t i = 10;
while(i--)
{
DrvGPIO_ClrBit(E_GPA, 2);
DrvSYS_Delay(300000);
DrvGPIO_SetBit(E_GPA, 2);
DrvGPIO_ClrBit(E_GPA, 3);
DrvSYS_Delay(300000);
DrvGPIO_SetBit(E_GPA, 3);
DrvGPIO_ClrBit(E_GPA, 4);
DrvSYS_Delay(300000);
DrvGPIO_SetBit(E_GPA, 4);
DrvGPIO_ClrBit(E_GPA, 5);
DrvSYS_Delay(300000);
DrvGPIO_SetBit(E_GPA, 5);
}
}
void mode_2(void) //模式二
{
uint8_t i = 10;
while(i--)
{
DrvGPIO_SetPortBits(E_GPA,0x03<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x9<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x0c<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x6<<2);
DrvSYS_Delay(300000);
}
}
void mode_3(void) //模式三
{
uint8_t i = 10;
while(i--)
{
DrvGPIO_SetPortBits(E_GPA,0x1<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x2<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x4<<2);
DrvSYS_Delay(300000);
DrvGPIO_SetPortBits(E_GPA,0x8<<2);
DrvSYS_Delay(300000);
}
}
void uart(void)
{
uint8_t mode;
set_uart();
printf("请选择模式1-3\n");
scanf("%d\n",&mode);
printf("您选择了模式%d\n",mode);
do
{
switch (mode)
{
case 1 : mode_1();break;//模式一
case 2 : mode_2();break;//模式二
case 3 : mode_3();break;//模式三
default: printf("输入有误");
}
printf("继续选择其它模式请输入相应模式号 1-3\n");
printf("退出请输入 0");
scanf("%d\n",&mode);
printf("您选择了模式%d\n",mode);
}while(mode!=0);
}
int main(void)
{
init();
set_gpio();
uart();
while(1);
//return 0;
}
|