本帖最后由 jjjkkk00 于 2014-4-29 10:05 编辑
使用bitband功能,可能会满足的你需求。具体的你自己测试下。
优点是:对Bit-band区域的写操作Cortex-M3内核终仍然执行读-修改-写的 过程,但代码量得到简化,并能防止错误的写入。
缺点是:编程工作量增大,因为需要提前计算Bit-band地址。
其中以下缺点可以克服:【可读性】可以通过自定义的宏来改善,【Bit-band地址计算】Bit-band地址也可以用宏。
//BitBand的define使用举例: BitBand_SetVal(GPIOF_BASE, 0xC, 6, 1);//GPIO_SetBits(GPIOF, GPIO_Pin_6);
#define BitBand_SetVal(PPP, Offset, BitNo, Val)\
(*(vu32*) (0x42000000 | ((PPP & 0x0FFFFFFF)<<5) | (Offset<<5) | (BitNo<<2)) = (Val))
#define BitBand_GetAddr(PPP, Offset, BitNo)\
(0x42000000 | ((PPP & 0x0FFFFFFF)<<5) | (Offset<<5) | (BitNo<<2))
下面例举了一个GPIO的操作:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
while (1)
{
GPIO_SetBits(GPIOF, GPIO_Pin_6|GPIO_Pin_7 | GPIO_Pin_8|GPIO_Pin_9);Delay_us(500);GPIO_ResetBits(GPIOF, GPIO_Pin_6|GPIO_Pin_7 | GPIO_Pin_8|GPIO_Pin_9);Delay_us(500);}
对应的bitband代码:
//使用bitband代码,直接操作bitband地址:通过GPIOF.06/07/08/09输出电平,驱动LED
(*(vu32*)0x4242031C) = 1;//RCC_APB2...IOFEN
(*(vu32*)0x42238060) = 1;//GPIOF_CRL...MODE6_0(0x4223806?)
(*(vu32*)0x42238064) = 1;//GPIOF_CRL...MODE6_1
(*(vu32*)0x42238068) = 0;//GPIOF_CRL...CNF6_0
(*(vu32*)0x4223806C) = 0;//GPIOF_CRL...CNF6_1
(*(vu32*)0x42238070) = 1;//GPIOF_CRL...MODE7_0(0x4223807?)
(*(vu32*)0x42238074) = 1;//GPIOF_CRL...MODE7_1
(*(vu32*)0x42238078) = 0;//GPIOF_CRL...CNF7_0
(*(vu32*)0x4223807C) = 0;//GPIOF_CRL...CNF7_1
(*(vu32*)0x42238080) = 1;//GPIOF_CRH...MODE8_0(0x4223808?)
(*(vu32*)0x42238084) = 1;//GPIOF_CRH...MODE8_1
(*(vu32*)0x42238088) = 0;//GPIOF_CRH...CNF8_0
(*(vu32*)0x4223808C) = 0;//GPIOF_CRH...CNF8_1
(*(vu32*)0x42238090) = 1;//GPIOF_CRH...MODE9_0(0x4223809?)
(*(vu32*)0x42238094) = 1;//GPIOF_CRH...MODE9_1
(*(vu32*)0x42238098) = 0;//GPIOF_CRH...CNF9_0
(*(vu32*)0x4223809C) = 0;//GPIOF_CRH...CNF9_1
while(1)
{
(*(vu32*)0x42238198) = 1;//GPIOF_ODR...Pin6
(*(vu32*)0x4223819C) = 1;//GPIOF_ODR...Pin7
(*(vu32*)0x422381A0) = 1;//GPIOF_ODR...Pin8
(*(vu32*)0x422381A4) = 1;//GPIOF_ODR...Pin9
Delay_us(500);
(*(vu32*)0x42238198) = 0;//GPIOF_ODR...Pin6
(*(vu32*)0x4223819C) = 0;//GPIOF_ODR...Pin7
(*(vu32*)0x422381A0) = 0;//GPIOF_ODR...Pin8
(*(vu32*)0x422381A4) = 0;//GPIOF_ODR...Pin9
Delay_us(500);
}
|