<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記——測(cè)試閃燈程序

          STM32學(xué)習(xí)筆記——測(cè)試閃燈程序

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          //所使用的是STM32F103C8共有48個(gè)管腳,共有兩組GPIO,為GPIOA和GPIOB,每組有從0到15共16個(gè)引腳

          //注意對(duì)STM32F103C8的操作和對(duì)庫(kù)函數(shù)的使用,在使用時(shí),要時(shí)刻參考《STM32F10xxx使用手冊(cè)》和《STM32的函數(shù)說(shuō)明》這兩個(gè)文檔

          本文引用地址:http://www.ex-cimer.com/article/201611/322894.htm

          #include"stm32f10x_lib.h"

          GPIO_InitTypeDefGPIO_InitStructure;//定義GPIO配置的結(jié)構(gòu)體變量包括GPIO引腳,引腳速度,引腳模式

          ErrorStatusHSEStartUpStatus;//枚舉類型,錯(cuò)誤狀態(tài)變量定義存儲(chǔ)外部高速時(shí)鐘HSE狀態(tài)

          voidRCC_Configuration(void);//RCC配置函數(shù)RCC:復(fù)位和時(shí)鐘控制

          voidNVIC_Configuration(void);//NVIC配置函數(shù)NVIC:嵌套向量中斷控制器

          voidDelay(vu32nCount);

          intmain(void)

          {

          #ifdefDEBUG

          debug();

          #endif

          RCC_Configuration();//系統(tǒng)時(shí)鐘配置函數(shù)

          NVIC_Configuration();//NVIC配置函數(shù)

          //使能APB2總線外設(shè)時(shí)鐘APB1,APB2兩條連接總線的外設(shè)。具有多個(gè)預(yù)分頻器用于配置AHB的頻率,高速APB(APB2)和低速APB(APB1)

          //區(qū)域。AHB和高速APB的最高頻率為72MHz,低速APB的最高頻率為36MHz

          //APB2是的I/O腳可達(dá)18MHz的反轉(zhuǎn)速度

          //AHB到APB(1,2)橋,該橋用來(lái)連接所有的APB設(shè)備

          //兩個(gè)AHB/APB橋在AHB和兩個(gè)APB總線之間提供完全同步地方連接。APB1被限制在36MHz,APB2工作在全速狀態(tài)(根據(jù)設(shè)備的不同

          //可以達(dá)到72MHz)

          //有些外設(shè)連接到APB1上,有些外設(shè)連接到APB2上,具體的情況參看使用手冊(cè)。

          //所以在外設(shè)使用前,要先調(diào)用函數(shù)使能相應(yīng)總線的時(shí)鐘

          //通用輸入/輸出GPIO備用輸入/輸出AFIO

          //IO端口寄存器必須以32位字的方式訪問(wèn),不允許以半字或者字節(jié)的方式訪問(wèn)

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//使能相應(yīng)的外設(shè)的時(shí)鐘

          //這里使能GPIOA,GPIOB和備用IO(AFIO)的時(shí)鐘

          //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//關(guān)閉調(diào)試端口重新映射使用仿真器調(diào)試時(shí),不能用此語(yǔ)

          //下面是GPIO的設(shè)置,注意方法

          //配置相應(yīng)的IO。注意配置IO功能時(shí),使用的是GPIO配置的結(jié)構(gòu)體。前面已經(jīng)定義了GPIO的結(jié)構(gòu)體變量

          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//選擇所有腳#defineGPIO_Pin_All((u16)0xFFFF)

          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//配置成推挽式輸出

          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//輸出模式下I/O輸出速度50MHZ

          GPIO_Init(GPIOA,&GPIO_InitStructure);//用定義的結(jié)構(gòu)體初始化PA口

          GPIO_Init(GPIOB,&GPIO_InitStructure);//用定義的結(jié)構(gòu)體初始化PB口

          while(1)

          {

          GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//寫(xiě)一個(gè)字?jǐn)?shù)據(jù)到PB口寫(xiě)入的數(shù)據(jù)是當(dāng)前GPIOB讀取的值然后取反

          //就相當(dāng)于把GPIOB的值取反

          Delay(0x8FFFFF);//延時(shí)

          GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//寫(xiě)一個(gè)字?jǐn)?shù)據(jù)到PB口把GPIOB的值取反

          Delay(0x8FFFFF);//延時(shí)

          }

          }

          //復(fù)位和時(shí)鐘設(shè)置函數(shù)注意配置的方法

          voidRCC_Configuration(void)

          {

          //復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值

          RCC_DeInit();//將外設(shè)RCC寄存器重設(shè)為缺省值

          //打開(kāi)外部高速晶振

          RCC_HSEConfig(RCC_HSE_ON);//設(shè)置外部高速晶振HSERCC_HSE_ON:打開(kāi)HSE晶振,RCC_HSE_OFF:關(guān)閉HSE晶振

          //RCC_HSE_Bypass:HSE晶振被外部時(shí)鐘旁路

          //等待外部高速時(shí)鐘準(zhǔn)備好

          HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE起振,返回錯(cuò)誤狀態(tài)。前面已經(jīng)定義了ErrorStatus枚舉類型的變量

          //HSEStartUpStatus,SUCCESS:HSE晶振穩(wěn)定且就緒,ERROR:HSE晶振未就緒

          if(HSEStartUpStatus==SUCCESS)//外部高速時(shí)鐘已經(jīng)準(zhǔn)備好

          {

          //開(kāi)啟FLASH的預(yù)取功能

          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能或失能預(yù)取指緩存,F(xiàn)LASH_PrefetchBuffer_Enable:預(yù)取指緩存使能

          //FLASH_PrefetchBuffer_Disable:預(yù)取指緩存失能

          //FLASH延遲2個(gè)周期

          FLASH_SetLatency(FLASH_Latency_2);//設(shè)置FLASH存儲(chǔ)器代碼延時(shí)時(shí)鐘周期數(shù),可以設(shè)置FLASH_Latency_0:0延時(shí)周期,

          //FLASH_Latency_1:1延時(shí)周期,F(xiàn)LASH_Latency_2:2延時(shí)周期

          //配置AHB(HCLK)時(shí)鐘=SYSCLK

          RCC_HCLKConfig(RCC_SYSCLK_Div1);//設(shè)置AHB時(shí)鐘是系統(tǒng)時(shí)鐘SYSCLK的多少分頻,這里設(shè)為1分頻,還可以指定2,4,8,16,64,128,256,512

          //分頻

          //配置APB2(PCLK2)鐘=AHB時(shí)鐘

          RCC_PCLK2Config(RCC_HCLK_Div1);//設(shè)置高速AHB時(shí)鐘APB2是AHB的多少分頻,這里設(shè)為1分頻,還可以指定為2,4,8,16分頻

          //配置APB1(PCLK1)鐘=AHB1/2時(shí)鐘

          RCC_PCLK1Config(RCC_HCLK_Div2);//設(shè)置低速AHB時(shí)鐘APB1是AHB的多少分頻,這里設(shè)為2分頻,還可以指定為1,2,4,8,16分頻

          //配置PLL時(shí)鐘==外部高速晶體時(shí)鐘*9PLLCLK=8MHz*9=72MHz

          RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//設(shè)置PLL時(shí)鐘及倍頻系數(shù)第一個(gè)參數(shù)設(shè)置PLL的輸入時(shí)鐘源

          //可以有RCC_PLLSource_HSI_Div2:HSI時(shí)鐘頻率除以2,RCC_PLLSource_HSE_Div1:HSE時(shí)鐘頻率,RCC_PLLSource_HSE_Div2:

          //HSE時(shí)鐘頻率除以2

          //第二個(gè)參數(shù)設(shè)置PLL的倍頻系數(shù),可以是2~16倍頻,這里設(shè)為9倍頻

          //警告:必須正確設(shè)置軟件,使PLL輸出時(shí)鐘頻率不超過(guò)72MHz

          //使能PLL時(shí)鐘

          RCC_PLLCmd(ENABLE);//使能或失能PLL,參數(shù)可以取ENABLE或DISABLE,如果PLL被用于系統(tǒng)時(shí)鐘,那么它不能被失能

          //等待PLL時(shí)鐘就緒

          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//檢查指定的RCC標(biāo)志位設(shè)置與否,輸入?yún)?shù)為待檢查的RCC標(biāo)志位

          //其取值情況詳見(jiàn)《STM32的函數(shù)說(shuō)明(中文)》P211.返回值為RCC_FLAG的新?tīng)顟B(tài),SET或RESET

          {

          }

          //配置系統(tǒng)時(shí)鐘=PLL時(shí)鐘

          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設(shè)置系統(tǒng)時(shí)鐘SYSCLK,輸入?yún)?shù)用于指定用作系統(tǒng)時(shí)鐘的時(shí)鐘源

          //可以為:RCC_SYSCLKSource_HSI:選擇HSI作為系統(tǒng)時(shí)鐘,RCC_SYSCLKSource_HSE:選擇HSE作為系統(tǒng)時(shí)鐘,RCC_SYSCLKSource_PLLCLK

          //選擇PLL作為系統(tǒng)時(shí)鐘

          //檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘

          while(RCC_GetSYSCLKSource()!=0x08)//函數(shù)RCC_GetSYSCLKSource()返回用作系統(tǒng)時(shí)鐘的時(shí)鐘源。

          //返回值可以是:0x00:HSI作為系統(tǒng)時(shí)鐘,0x04:HSE作為系統(tǒng)時(shí)鐘,0x08:PLL作為系統(tǒng)時(shí)鐘

          {

          }

          }

          }

          //嵌套向量中斷控制器配置函數(shù)

          voidNVIC_Configuration(void)

          {

          #ifdefVECT_TAB_RAM

          NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//設(shè)置向量表的位置和偏移,第一個(gè)參數(shù)指定向量表的位置在RAM還是在

          //程序存儲(chǔ)器flash中,取值可以是NVIC_VectTab_RAM:向量表位于RAM,NVIC_VectTab_FLASH:向量表位于FLASH。第二個(gè)參數(shù)為

          //向量表基地址的偏移量,對(duì)于FLASH,該參數(shù)值必須高于0x08000100,對(duì)于RAM,必須高于0x100.它同時(shí)必須是256(64*4)的整數(shù)倍

          #else

          NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

          #endif

          }

          voidDelay(vu32nCount)

          {

          for(;nCount!=0;nCount--);

          }

          #ifdefDEBUG

          //assert_failed編寫(xiě)于文件main.c或其他用戶C文件中

          voidassert_failed(u8*file,u32line)

          {

          while(1)

          {

          }

          }

          #endif



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();