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;