void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解
((GPIO_TypeDef *) GPIOA_BASE)表示將GPIOA_BASE強制轉換為指針類型的結構體,?#define?GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 表示用(GPIO_TypeDef *) GPIOA_BASE代替GPIOA ,那么現在GPIOA就表示以 GPIOA_BASE為基地址的一個類型為GPIO_TypeDef結構體的一個指針,所以你程序里可以用GPIOA->CRL。
例如:
#define GPIOA ? ? ? ? ? ? ? ((GPIO_TypeDef *) GPIOA_BASE)?
typedef struct
{
? __IO uint32_t CRL;
? __IO uint32_t CRH;
? __IO uint32_t IDR;
? __IO uint32_t ODR;
? __IO uint32_t BSRR;
? __IO uint32_t BRR;
? __IO uint32_t LCKR;
} GPIO_TypeDef;//除了定義結構體,它還把寄存器做了一個映射,映射到地址
那代碼
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
和
void LED_Init(void)
{
?
?GPIO_InitTypeDef ?GPIO_InitStructure;
?
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE端口時鐘
?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.5 端口配置
?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;? //推挽輸出
?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ?//IO口速度為50MHz
?GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5
?GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.5 輸出高
?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; ? ? //LED1-->PE.5 端口配置, 推挽輸出
?GPIO_Init(GPIOD, &GPIO_InitStructure); ? //推挽輸出 ,IO口速度為50MHz
?GPIO_SetBits(GPIOD,GPIO_Pin_2);? //PE.5 輸出高?
}
中GPIOA就是一個指向結構的指針,也就是首地址。
總結
以上是生活随笔為你收集整理的void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上拉输入与下拉输入
- 下一篇: STM32的时钟系统RCC详细整理(转)