C 中常用的操作

1)

/* Enable USB , PHY and use remote wake-up */
#define _DRVUSB_ENABLE_USB()   outp32((&USBD->ATTR), 0x7D0)
#define outp32(port,value)     *((volatile unsigned int *)(port))=value

这个宏的作用是,将0x7D0的值设置到ATTR寄存器中。

 

2)

typedef void (*PFN_DRVUSB_INTCALLBACK)(void *);
void * pVoid;
if (pVoid != NULL)
    g_FnIntCallBack = (PFN_DRVUSB_INTCALLBACK)pVoid;

/* 可以将方法的地址直接作为另一个方法的参数传入到方法中 */

typedef void (*PFN_DRVUSB_INTCALLBACK)(void *);

定义的是一个参数为空,返回值为空的方法指针类型

 

3) 判断某一位,然后将改为取反

if(abc & (1<< num))  /* num 是你想要更改的位的位置 */
  abc &= ~(1<<num);

 

4) M0 ADC读电压

  1.给M0提供的电压必须比较稳定,可以使用一个LDO来稳压。添加LDO稳压,需要在LDO输入输出端,添加滤波电容,一般取27/47uF 都可以

  2.M0 ADC输入脚需要加入滤波电容,一般为100nF就可以了。

 5)

    pu32Loader = (uint32_t *)&loaderImageBase;
    for (i = 0; i < u32ImageSize; i += PAGE_SIZE)
    {
        DrvFMC_Erase(LDROM_BASE + i);    
        for (j = 0; j < PAGE_SIZE; j += 4)
        {
            DrvFMC_Write(LDROM_BASE + i + j, pu32Loader[(i + j) / 4]);
        }
    }

上面一段代码将loaderImageBase地址强制转换成uint32_t 类型的指针

这个uint32_t指针类型加上下标之后,可以当做数组来使用。例如

char *p = "abcdef";
此时p[2]值 为'c'。而p表示字符串"abcdef"的首地址,*p的值则相当于p[0],值为'a'。

 

6) 单片机中的按键检测(32位单片机,NUC1xx为例)

按键加滤波电容,加上拉电阻。将端口设置为输入模式,初始设置端口为0。

按键按下则可以读出端口状态为1,可判断按键按下。如下例子:

    /* Up button open */
    SYS->P0_MFP.MFP6_AD6_MISO1 = 0;
    SYS->P0_MFP.ALT6_AD6_MISO1 = 0;
    DrvGPIO_Open(BUTTON_UP_PORT, BUTTON_UP_PIN, E_IO_INPUT);

    /* Read button state */
    return DrvGPIO_GetBit(BUTTON_UP_PORT, BUTTON_UP_PIN) == 0;

 

posted @ 2014-04-07 15:53  侠梦千年  阅读(378)  评论(0编辑  收藏  举报