久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13106|回復: 1
打印 上一主題 下一主題
收起左側

STM32F103VET6的GPIO簡表及系統初始化程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:82781 發表于 2015-6-23 14:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本庫函數庫供檢閱 與天津第四項目部
如有錯誤純屬正常
宏定義結構體:
typedef struct
{ vu32 CRL; 端口配置低寄存器
vu32 CRH; 端口配置高寄存器
vu32 IDR; 端口輸入數據寄存器
vu32 ODR; 端口輸出數據寄存器
vu32 BSRR; 端口位設置/復位寄存器
vu32 BRR; 端口位復位寄存器
vu32 LCKR; 端口配置鎖定寄存器
} GPIO_TypeDef;
說明GPIO的寄存器的宏定義結構體
typedef struct
{ vu32 EVCR; 事件控制寄存器
vu32 MAPR; 復用重映射和調試I/O配置寄存器
vu32 EXTICR[4]; 外部中斷線路0-15配置寄存器
} AFIO_TypeDef;
定義復用AFIO端口配置寄存器宏定義結構體
#define PERIPH_BASE ((u32)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) ...
#define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_ BASE (APB2PERIPH_BASE + 0x1800)
定義物理寄存器的儲存組織地址
這個下面的就是結構指針,
#ifndef DEBUG GPIO 121/368 譯文英文原版為 UM0427 Oct. 2007 Rev 2, 譯文僅供參考,與英文版沖突的,以英文版為準 ..
. #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 */ ..
.GPIO的庫函數目錄
函數介紹:
1.     GPIO_DeInit(GPIOA); 將外設GPIOx寄存器重設為缺省值
2.     GPIO_AFIODeInit();將復用功能(重映射事件控制和EXTI設置)重設為缺省值
3.     typedef struct
{ u16 GPIO_Pin;//管教寄存器
GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器
GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器
} GPIO_InitTypeDef;//這個宏結構定義并非函數,而是他的寄存器的封裝,要用它去定義變量,系統在這里編譯時并不分配內存
GPIO_Pin
該參數選擇待設置的GPIO管腳,使用操作符“|”可以一次選中多個管腳。可以使用下表中的任意組合。
GPIO_Pin_None 無管腳被選中
GPIO_Pin_0 選中管腳0
GPIO_Pin_1 選中管腳1
GPIO_Pin_2 選中管腳2
GPIO_Pin_3 選中管腳3
GPIO_Pin_4 選中管腳4
GPIO_Pin_5 選中管腳5
GPIO_Pin_6 選中管腳6
GPIO_Pin_7 選中管腳7
GPIO_Pin_8 選中管腳8
GPIO_Pin_9 選中管腳9
GPIO_Pin_10 選中管腳10
GPIO_Pin_11 選中管腳11
GPIO_Pin_12 選中管腳12
GPIO_Pin_13 選中管腳13
GPIO_Pin_14 選中管腳14
GPIO_Pin_15 選中管腳15
GPIO_Pin_All 選中全部管腳
GPIO_Speed
GPIO_Speed用以設置選中管腳的速率
GPIO_Speed_10MHz 最高輸出速率10MHz
GPIO_Speed_2MHz 最高輸出速率2MHz
GPIO_Speed_50MHz 最高輸出速率50MHz
GPIO_Mode
GPIO_Mode用以設置選中管腳的工作狀態
GPIO_Mode_AIN 模擬輸入
GPIO_Mode_IN_FLOATING 浮空輸入
GPIO_Mode_IPD 下拉輸入
GPIO_Mode_IPU 上拉輸入
GPIO_Mode_Out_OD 開漏輸出
GPIO_Mode_Out_PP 推挽輸出
GPIO_Mode_AF_OD 復用開漏輸出
GPIO_Mode_AF_PP 復用推挽輸出
注意: 􀂄 當某管腳設置為上拉或者下拉輸入模式,使用寄存器Px_BSRRPxBRR 􀂄 GPIO_Mode允許同時設置GPIO方向(輸入/輸出)和對應的輸入/輸出設置,:位[7:4]對應GPIO方向,位[4:0]對應配置。
GPIO方向有如下索引
- GPIO輸入模式 = 0x00
- GPIO輸出模式 = 0x01
給出了所有GPIO_Mode的索引和編碼
例子:
GPIO_InitTypeDef GPIO_InitStructure;//定義一個GPIO_InitTypeDef結構變量GPIO_InitStructure
這里注意宏結構和結構變量的區別
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 引腳選擇全部
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;速度選擇最高輸出速率10MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//這個函數才是最后的執行函數最重要以上是設置
原型:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
可以看出定義了兩個指針參數:GPIO_TypeDef* GPIOxGPIO_InitTypeDef* GPIO_InitStruct
第一個表示定義一個GPIO_TypeDef型結構指針變量GPIOx他可傳遞一下參數:
CRL 端口配置低寄存器
CRH 端口配置高寄存器
IDR 端口輸入數據寄存器
ODR 端口輸出數據寄存器
BSRR 端口位設置/復位寄存器
BRR 端口位復位寄存器
LCKR 端口配置鎖定寄存器
可以這樣訪問參數:GPIOx-> IDR=0x多少多少;因為他是指針
第二個表示定義一個GPIO_InitTypeDef型結構指針變量GPIO_InitStruct他可傳遞一下參數:
GPIO_Pin;//管教寄存器
GPIOSpeed_TypeDef GPIO_Speed;//管教速度寄存器
GPIOMode_TypeDef GPIO_Mode;//管教模式寄存器
可以這樣訪問參數:GPIO_InitStruct-> GPIO_Pin =0X多少多少;因為他是指針
注意:兩個都是指針固然不假但是比較后發現問題:
GPIO_Init(GPIOA, &GPIO_InitStructure);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
前者沒有&后者有&,然后回頭看定義會發現GPIOX是已經定義了的地址
#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 */
所以它本身就是一個指向物理寄存器地址的指針,并且被賦予首地址,現在又定義了一個指針參量相當于把它的值賦給后者表示為:
例如:GPIO_TypeDef* GPIOA=((GPIO_TypeDef *) GPIOA_BASE)
第二個不同了在定義中未發現他的地址定義,而且他還是個結構類型
GPIO_InitTypeDef* GPIO_InitStruct,只是定義了一個GPIO_InitTypeDe型結構指針變量GPIO_InitStruct,而前面有個GPIO_InitTypeDe變量跟他同名是為了可讀性,如果不加&顯然是不對的&表示取出變量GPIO_InitStruct的地址所給指針變量GPIO_InitStruct以指向他的首地址。有點繞,但是就是一個指針的賦值問題。
4.     GPIO_InitTypeDef GPIO_InitStructure;變量說明
GPIO_StructInit(&GPIO_InitStructure);//函數把GPIO_InitStruct中的每一個參數按缺省值填入
缺省值
GPIO_Pin GPIO_Pin_All
GPIO_Speed GPIO_Speed_2MHz
GPIO_Mode GPIO_Mode_IN_FLOATING
5u8 ReadValue; 變量說明
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); 設置指定的數據端口位
10GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 清除指定的數據端口位
11GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); 設置或者清除指定的數據端口位
GPIOxx可以是ABCD或者E,來選擇GPIO外設
GPIO_Pin:待設置或者清除指的端口位該參數可以取GPIO_Pin_x(x可以是0-15)的任意組合
BitVal: 該參數指定了待寫入的值該參數必須取枚舉BitAction的其中一個值
Bit_RESET: 清除數據端口位
Bit_SET: 設置數據端口位
12GPIO_Write(GPIOA, 0x1101); 向指定GPIO數據端口寫入數據
13GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); 鎖定GPIO管腳設置寄存器
14GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); 選擇GPIO管腳用作事件輸出
GPIO_PortSourceGPIOE選擇GPIOE
GPIO_PinSource5事件輸出的管腳5
15.GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE); 使能或者失能事件輸出
事件輸出的新狀態
這個參數可以取:ENABLE或者DISABLE
16. 例:
/* I2C1_SCL on PB.08, I2C1_SDA on PB.09 */
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); 改變指定管腳的映
GPIO_Remap_SPI1
SPI1復用功能映射
GPIO_Remap_I2C1
I2C1復用功能映射
GPIO_Remap_USART1
USART1復用功能映射
GPIO_PartialRemap_USART3
USART2復用功能映射
GPIO_FullRemap_USART3
USART3復用功能完全映射
GPIO_PartialRemap_TIM1
USART3復用功能部分映射
GPIO_FullRemap_TIM1
TIM1復用功能完全映射
GPIO_PartialRemap1_TIM2
TIM2復用功能部分映射1
GPIO_PartialRemap2_TIM2
TIM2復用功能部分映射2
GPIO_FullRemap_TIM2
TIM2復用功能完全映射
GPIO_PartialRemap_TIM3
TIM3復用功能部分映射
GPIO_FullRemap_TIM3
TIM3復用功能完全映射
GPIO_Remap_TIM4
TIM4復用功能映射
GPIO_Remap1_CAN
CAN復用功能映射1
GPIO_Remap2_CAN
CAN復用功能映射2
GPIO_Remap_PD01
PD01復用功能映射
GPIO_Remap_SWJ_NoJTRST
JTRSTSWJ完全使能(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管腳用作外部中斷線路

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82781 發表于 2015-6-23 14:27 | 只看該作者
                                                                                                昨天的彷徨和沮喪,今天的曙光,邁進ARM世界的一小步

本程序為STM32F103VET6的GPIO系統初始化程序,定義了RCC寄存器和系統時鐘,昨天的問題也得到解決,我的程序沒錯,錯的是由于昨天設置的時鐘頻率為72M所以體現不出等在閃爍!以下函數均使用ST公司的固件庫。        


void mysysint()//系統初始化程序
{
ErrorStatus HSEStartUpStatus;//說明標志位
RCC_DeInit();//所有外設全部缺省設置

/* 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)//啟動成功
{
/*這兩條FLASH指令必須加上,不知為啥?不加上就運行幾秒后出錯,參照系統初始化*/
/* Enable The Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH緩存開啟
/* Configure the Latency cycle: Set 2 Latency cycles */
  FLASH_SetLatency(FLASH_Latency_2);  //設置FLASH這些位表示SYSCLK(系統時鐘)周期與閃存訪問時間的比例,為010:兩個等待狀態,當 48MHz < SYSCLK ≤ 72MHz
/* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);//外部時鐘為8M,PLL的輸入時鐘=8MHZ,倍頻系數9,

/* Configure HCLK such as HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置了啦AHB分頻器的分頻系數=1,即HCLK=SYSCLK=72MHZ
/* Configure PCLK1 such as PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);//設置了APB1外設的時鐘頻率最大是36M這里是APB1的分頻器設為2,PCLK1=HCLK/2=72/2=36MHZ正好是最大值
/* Configure PCLK2 such as PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);//設置PLCK2=HCLK=72MHZ,的APB2分頻器=1
/* Select the PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設置了SYSCLK的提供者為PLL,頻率由上面算出=72MHZ
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_PLLRDY, DISABLE);//PLL中斷關閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSERDY,DISABLE);//HSE中斷關閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSIRDY, DISABLE); //HSI中斷關閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSERDY, DISABLE); //LSE中斷關閉
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSIRDY, DISABLE); //LSI中斷關閉

/* PLL clock divided by 1.5 used as USB clock source */
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);//設置USB的時鐘為=72、1.5=48mhz
/* Configure ADCCLK such as ADCCLK = PCLK2/2 */
RCC_ADCCLKConfig(RCC_PCLK2_Div2);//設置ADC時鐘=PCLK2/2= 36MHZ
/* disable the LSE */
RCC_LSEConfig(RCC_LSE_OFF);//外部低速晶振關閉

/*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);//使能時鐘
/* 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);
  
  }
}


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人久久在线 | 日韩欧美综合 | 91国内精精品久久久久久婷婷 | 午夜二区| www.xxxx欧美| 在线观看第一区 | 欧美xxxⅹ性欧美大片 | 成人二区 | 国产成人免费视频 | 91在线看片| 精品久久精品 | 9久久婷婷国产综合精品性色 | 亚洲三区在线观看 | 日本精品一区二区三区在线观看视频 | 欧美黄在线观看 | 国产激情网 | 国产91视频免费 | 你懂的在线视频播放 | 欧美久久视频 | 成人免费久久 | 成人免费视频网站在线看 | 国产999精品久久久影片官网 | 亚洲精品久久久久中文字幕二区 | 北条麻妃视频在线观看 | 视频在线日韩 | 国产露脸对白88av | 四虎永久免费地址 | 天天躁日日躁aaaa视频 | 国产999精品久久久久久 | 蜜桃特黄a∨片免费观看 | 亚洲一区二区三区国产 | 麻豆成人在线视频 | 国产精品一区在线 | 精品产国自在拍 | 一区二区精品在线 | 精品成人在线观看 | 日韩a在线 | 亚洲午夜视频在线观看 | 美女黄视频网站 | 亚洲九九| 日韩不卡视频在线 |