打印
[新手园地]

M0学习-GPIO与UART

[复制链接]
4045|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SYHDJF|  楼主 | 2011-10-20 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
}

相关帖子

沙发
SYHDJF|  楼主 | 2011-10-20 14:01 | 只看该作者
三个表情中第一个和第三个表示大写字母P,第二个表示大写字母D。

使用特权

评论回复
板凳
hotpower| | 2011-10-21 01:11 | 只看该作者
注意发帖要用<>才能code

使用特权

评论回复
地板
SYHDJF|  楼主 | 2011-10-21 22:33 | 只看该作者
哦,没注意。呵呵

使用特权

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

本版积分规则

0

主题

199

帖子

1

粉丝