可以這樣訪(fǎng)問(wèn)參數(shù):
GPIO_InitStruct-> GPIO_Pin =0X多少多少
;因?yàn)樗侵羔?/div>
注意:兩個(gè)都是指針固然不假但是比較后發(fā)現(xiàn)問(wèn)題:
GPIO_Init(GPIOA, &GPIO_InitStructure);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
前者沒(méi)有&后者有&,然后回頭看定義會(huì)發(fā)現(xiàn)GPIOX是已經(jīng)定義了的地址
#ifdef _AFIO #define AFIO ((AFIO_TypeDef *) AFIO_BASE) #endif /*_AFIO */ #ifdef _GPIOA #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #endif /*_GPIOA */ #ifdef _GPIOB #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) #endif /*_GPIOB */ #ifdef _GPIOC #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #endif /*_GPIOC */ #ifdef _GPIOD #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) #endif /*_GPIOD */ #ifdef _GPIOE #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) #endif /*_GPIOE */
所以它本身就是一個(gè)指向物理寄存器地址的指針,并且被賦予首地址,現(xiàn)在又定義了一個(gè)指針參量相當(dāng)于把它的值賦給后者表示為:
例如:GPIO_TypeDef* GPIOA=((GPIO_TypeDef *) GPIOA_BASE)
第二個(gè)不同了在定義中未發(fā)現(xiàn)他的地址定義,而且他還是個(gè)結(jié)構(gòu)類(lèi)型
GPIO_InitTypeDef* GPIO_InitStruct,只是定義了一個(gè)GPIO_InitTypeDe型結(jié)構(gòu)指針變量GPIO_InitStruct,而前面有個(gè)GPIO_InitTypeDe變量跟他同名是為了可讀性,如果不加&顯然是不對(duì)的&表示取出變量GPIO_InitStruct的地址所給指針變量GPIO_InitStruct以指向他的首地址。有點(diǎn)繞,但是就是一個(gè)指針的賦值問(wèn)題。
4. GPIO_InitTypeDef GPIO_InitStructure;變量說(shuō)明
GPIO_StructInit(&GPIO_InitStructure);//函數(shù)把GPIO_InitStruct中的每一個(gè)參數(shù)按缺省值填入
缺省值
GPIO_Pin GPIO_Pin_All
GPIO_Speed GPIO_Speed_2MHz
GPIO_Mode GPIO_Mode_IN_FLOATING
5.u8 ReadValue; 變量說(shuō)明
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7); 讀取指定端口管腳的輸入
6.u16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOC); 讀取指定的GPIO端口輸入
7. u8 ReadValue;
ReadValue = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7); 讀取指定端口管腳的輸出
8. u16 ReadValue; ReadValue = GPIO_ReadOutputData(GPIOC); 讀取指定的GPIO端口輸出
9GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 設(shè)置指定的數(shù)據(jù)端口位
10GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 清除指定的數(shù)據(jù)端口位
11GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); 設(shè)置或者清除指定的數(shù)據(jù)端口位
GPIOx:x可以是A,B,C,D或者E,來(lái)選擇GPIO外設(shè)
GPIO_Pin:待設(shè)置或者清除指的端口位該參數(shù)可以取GPIO_Pin_x(x可以是0-15)的任意組合
BitVal: 該參數(shù)指定了待寫(xiě)入的值該參數(shù)必須取枚舉BitAction的其中一個(gè)值
Bit_RESET: 清除數(shù)據(jù)端口位
Bit_SET: 設(shè)置數(shù)據(jù)端口位
12GPIO_Write(GPIOA, 0x1101); 向指定GPIO數(shù)據(jù)端口寫(xiě)入數(shù)據(jù)
13GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); 鎖定GPIO管腳設(shè)置寄存器
14GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); 選擇GPIO管腳用作事件輸出
GPIO_PortSourceGPIOE選擇GPIOE
GPIO_PinSource5事件輸出的管腳5
15.GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE); 使能或者失能事件輸出
事件輸出的新?tīng)顟B(tài)
這個(gè)參數(shù)可以取:ENABLE或者DISABLE
16. 例:
/* I2C1_SCL on PB.08, I2C1_SDA on PB.09 */
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); 改變指定管腳的映
GPIO_Remap_SPI1
SPI1復(fù)用功能映射
GPIO_Remap_I2C1
I2C1復(fù)用功能映射
GPIO_Remap_USART1
USART1復(fù)用功能映射
GPIO_PartialRemap_USART3
USART2復(fù)用功能映射
GPIO_FullRemap_USART3
USART3復(fù)用功能完全映射
GPIO_PartialRemap_TIM1
USART3復(fù)用功能部分映射
GPIO_FullRemap_TIM1
TIM1復(fù)用功能完全映射
GPIO_PartialRemap1_TIM2
TIM2復(fù)用功能部分映射1
GPIO_PartialRemap2_TIM2
TIM2復(fù)用功能部分映射2
GPIO_FullRemap_TIM2
TIM2復(fù)用功能完全映射
GPIO_PartialRemap_TIM3
TIM3復(fù)用功能部分映射
GPIO_FullRemap_TIM3
TIM3復(fù)用功能完全映射
GPIO_Remap_TIM4
TIM4復(fù)用功能映射
GPIO_Remap1_CAN
CAN復(fù)用功能映射1
GPIO_Remap2_CAN
CAN復(fù)用功能映射2
GPIO_Remap_PD01
PD01復(fù)用功能映射
GPIO_Remap_SWJ_NoJTRST
除JTRST外SWJ完全使能(JTAG+SW-DP)
GPIO_Remap_SWJ_JTAGDisable
JTAG-DP失能 + SW-DP使能
GPIO_Remap_SWJ_Disable
SWJ完全失能(JTAG+SW-DP)
17. GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8); 選擇GPIO管腳用作外部中斷線(xiàn)路
作者: xuwei
時(shí)間: 2015-6-23 14:27
昨天的彷徨和沮喪,今天的曙光,邁進(jìn)ARM世界的一小步
本程序?yàn)镾TM32F103VET6的GPIO系統(tǒng)初始化程序,定義了RCC寄存器和系統(tǒng)時(shí)鐘,昨天的問(wèn)題也得到解決,我的程序沒(méi)錯(cuò),錯(cuò)的是由于昨天設(shè)置的時(shí)鐘頻率為72M所以體現(xiàn)不出等在閃爍!以下函數(shù)均使用ST公司的固件庫(kù)。
void mysysint()//系統(tǒng)初始化程序
{
ErrorStatus HSEStartUpStatus;//說(shuō)明標(biāo)志位
RCC_DeInit();//所有外設(shè)全部缺省設(shè)置
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready and if Time out is reached exit */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)//啟動(dòng)成功
{
/*這兩條FLASH指令必須加上,不知為啥?不加上就運(yùn)行幾秒后出錯(cuò),參照系統(tǒng)初始化*/
/* Enable The Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH緩存開(kāi)啟
/* Configure the Latency cycle: Set 2 Latency cycles */
FLASH_SetLatency(FLASH_Latency_2); //設(shè)置FLASH這些位表示SYSCLK(系統(tǒng)時(shí)鐘)周期與閃存訪(fǎng)問(wèn)時(shí)間的比例,為010:兩個(gè)等待狀態(tài),當(dāng) 48MHz < SYSCLK ≤ 72MHz
/* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);//外部時(shí)鐘為8M,PLL的輸入時(shí)鐘=8MHZ,倍頻系數(shù)9,
/* Configure HCLK such as HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);//設(shè)置了啦AHB分頻器的分頻系數(shù)=1,即HCLK=SYSCLK=72MHZ
/* Configure PCLK1 such as PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);//設(shè)置了APB1外設(shè)的時(shí)鐘頻率最大是36M這里是APB1的分頻器設(shè)為2,PCLK1=HCLK/2=72/2=36MHZ正好是最大值
/* Configure PCLK2 such as PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);//設(shè)置PLCK2=HCLK=72MHZ,的APB2分頻器=1
/* Select the PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設(shè)置了SYSCLK的提供者為PLL,頻率由上面算出=72MHZ
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_PLLRDY, DISABLE);//PLL中斷關(guān)閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSERDY,DISABLE);//HSE中斷關(guān)閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSIRDY, DISABLE); //HSI中斷關(guān)閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSERDY, DISABLE); //LSE中斷關(guān)閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSIRDY, DISABLE); //LSI中斷關(guān)閉
/* PLL clock divided by 1.5 used as USB clock source */
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);//設(shè)置USB的時(shí)鐘為=72、1.5=48mhz
/* Configure ADCCLK such as ADCCLK = PCLK2/2 */
RCC_ADCCLKConfig(RCC_PCLK2_Div2);//設(shè)置ADC時(shí)鐘=PCLK2/2= 36MHZ
/* disable the LSE */
RCC_LSEConfig(RCC_LSE_OFF);//外部低速晶振關(guān)閉
/*DISable the RTC clock */
RCC_RTCCLKCmd(DISABLE);
/* DISable the Clock Security System */
RCC_ClockSecuritySystemCmd(DISABLE);
/* Enable the PLL */
RCC_PLLCmd(ENABLE);//使能PLL
int main(void)
{
mysysint();
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能時(shí)鐘
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while (1)
{
/* Set PD0 and PD2 */
/* Set the GPIOA port pin 10 and pin 15 */
GPIO_SetBits(GPIOD, GPIO_Pin_11 | GPIO_Pin_8);//GPIOD->BSRR = 0x00000f00;//置為PD8-PD11
delay(0xfffff);
/* Clears the GPIOA port pin 10 and pin 15 */
GPIO_ResetBits(GPIOD, GPIO_Pin_11 | GPIO_Pin_8);//GPIOD->BRR = 0x00000f00;
delay(0xfffff);
}
}
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲欧洲天堂
|
国产手机在线视频
|
日本精品视频在线
|
色综合小说
|
久久性生活视频
|
日韩视频免费观看
|
天天狠狠|
欧美偷拍视频
|
亚洲欧美第一页
|
一级黄片毛片
|
婷婷天堂
|
精品亚洲国产成人av制服丝袜
|
久久久久久久影院
|
亚洲精品a
|
极品美女一区二区三区
|
91网站免费看|
欧美成人一级
|
色姑娘综合
|
日本免费一级片
|
日韩伦理在线观看
|
精品免费在线观看
|
麻豆av在线
|
亚洲精品a|
日本美女一级片
|
91性高潮久久久久久久久
|
亚洲综合二区
|
干干干操操操
|
视频一区二区在线播放
|
国产精品久免费的黄网站
|
大尺度做爰呻吟舌吻网站
|
国产一区二区三区在线观看视频
|
一区二区三区四区国产
|
久久婷婷网
|
一区在线视频
|
日本亚洲欧美
|
h视频免费在线观看
|
欧美在线播放视频
|
黄色高清网站
|
a免费视频
|
亚洲精品视频在线
|
中文字幕av网站
|