發表文章

目前顯示的是 8月, 2017的文章

關於 STM32 RCC 的函數庫

圖片
在ST 的資料手冊中,關於 STM32 RCC 的函數庫的文件是UM0427 . based 32-bit MCU STM32F101xx and STM32F103xx firmware library (網路上的文件為 stm32f_firmw.pdf) 在這份文件中Page 261 頁Firmware library functions 表339 中有所說明, 函數名 描述 RCC_DeInit 將外設 RCC 暫存器重設為內定值 RCC_HSEConfig 設置外部高速晶振 (HSE) RCC_WaitForHSEStartUp 等待 HSE 起振 RCC_AdjustHSICalibrationValue 調整內部高速晶振 (HSI) 校準值 RCC_HSICmd 使能或者失能內部高速晶振 (HSI) RCC_PLLConfig 設置 PLL 時鐘源及倍頻係數 RCC_PLLCmd 使能或者失能 PLL RCC_SYSCLKConfig 設置系統時鐘 (SYSCLK) RCC_GetSYSCLKSource 返回用作系統時鐘的時鐘源 RCC_HCLKConfig 設置 AHB 時鐘 (HCLK) RCC_PCLK1Config 設置低速 AHB 時鐘 (PCLK1) RCC_PCLK2Config 設置高速 AHB 時鐘 (PCLK2) RCC_ITConfig 使能或者失能指定的 RCC 中斷 RCC_USBCLKConfig 設置 USB 時鐘 (USBCLK) RCC_ADCCLKConfig 設置 ADC 時鐘 (ADCCLK) RCC_LSEConfig 設置外部低速晶振 (LSE) RCC_

STM32 RCC 的用途

圖片
在第一次使用ARM STM32時看到KEIL C下的範例程式中的內容時,實在不知它的內容是作什麼用途的,因為和以往寫8051的經驗差異很大,當第一個研究是USART的程式碼時看到對於STM32F10x的初始化 /* System Clocks Configuration */   RCC_Configuration();       /* NVIC configuration */   NVIC_Configuration();   /* Configure the GPIO ports */   GPIO_Configuration(); 初始化定義在於上面三個副程式中,而它們的縮寫及解釋如下所示。 RCC: reset and clock control 簡單的講就是時脈控制 NVIC :Nested vectored interrupt controller GPIO:general-purpose I/O 而本篇要說明的是RCC,記得在STM32 F10xx 系統時鐘關連圖中的貼圖,現在看一下範例程式碼的內容。 /******************************************************************************* * Function Name  : RCC_Configuration * Description    : Configures the different system clocks. * Input          : None * Output         : None * Return         : None *******************************************************************************/ void RCC_Configuration(void) {   /* RCC system reset(for debug purpose) */   RCC_DeInit();  /*這個函數是有很多內容的*/   /* Enable HSE */   RCC_HSEConfig(RCC_HSE_ON);

STM32F10x GPIO -3

圖片
在 STM32F10x GPIO -1中我曾貼上一張圖(如下圖)來說明灌電和拉電流的差異。而在STM32中如何利用GPIO的功能來點亮一個LED呢‧? PB0 在電路上的設計如下圖一。                                                                         圖一 PB1在電路上的設計如下圖二。                                                                                圖二 其實這兩種電路在GPIO的初始化都是一樣的,如下列所示: •RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LED, ENABLE); •    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); 而這兩在程式上的應用就有所差異了, 在PB0 這種有外在 Vcc提供電壓的電路,要點亮LED要用 GPIO_ResetBits, /* Turn on LED. */ GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); Set Low /* Turn off  LED */ GPIO_SetBits(GPIO_LED, GPIO_Pin_6); Set High 這種電路適合一開始就打算點亮LED的設計,而這往往不是我們想要的設計,因為在使用電池的手持裝置是耗電的,除非是打算讓LED的亮度十分明亮,否則不是很建設使用。 在PB0 這種沒有外在 Vcc提供電壓的電路,要點亮LED要用 GPIO_SetBits, /* Turn on LED */ GPIO_SetBits(GPIO_LE

STM32F10x GPIO -2

GPIO 的功能 8 種模式 , 可以通過程式設計選擇:  1.  浮空輸入 (Input floating)  2.  輸入 上拉 (Input pull-up) 3.  輸入 下拉 (Input-pull-down) 4.   類比 輸入 ( Analog Input ) 5.  開漏輸出 (Output open-drain) 6.  推挽輸出 (Output push-pull) 7.  複用功能的推挽輸出 (Alternate function push-pull) 8.  複用功能的開漏輸出 (Alternate function open-drain) 在網路上找到一些會 GPIO 的功能用途的說明如下: 1. 輸入浮接(Input floating),可以做為鍵盤掃描使用,電壓準位由外部訊號來決定,沒有訊號驅動,就會呈現高阻抗狀態。 2. 輸入上拉(Input pull-up),啟用內部上拉電阻(20~40K),若使用在按鈕輸入,外部就可以少接上一顆電阻節省外部零件。 3. 輸入下拉(Input-pull-down),啟用內部下拉電阻(20~40K),若使用在按鈕輸入,外部就可以少接上一顆電阻節省外部零件。 4. 類比輸入(Analog),ADC訊號輸入。 5. 開漏輸出(Output open-drain),輸出0時,IO = GND,輸出1時 IO = 浮接,所以需要在外部加上上拉電阻,此模式可以當成雙向IO使用(與8051相同)。 6. 推挽輸出(Output push-pull),輸出0時,IO = GND,輸出1時 IO = VCC。 7. 推挽式交替功能(Alternate function push-pull),啟動I2C,SDA、SCL等… 8. 開漏式交替功能(Alternate function open-drain),啟動TX、MOSI、MISO、SCK等… 由 ST 提供的範例來看,可能會比較好 1. USART 的GPIO規劃 void GPIO_Configuration(void) {   GPIO_InitTypeDef GPIO_InitStructure;   /* Configure USART1 Tx (PA.09) as alternate

STM32F10x GPIO -1

圖片
STM32F10x GPIO  GPIO 的功能 8 種模式 , 可以通過程式設計選擇:  1.  浮空輸入 (Input floating)  2.  輸入 上拉 (Input pull-up) 3.  輸入 下拉 (Input-pull-down) 4.  模擬輸入 ( Analog Input ) 5.  開漏輸出 (Output open-drain) 6.  推挽輸出 (Output push-pull) 7.  複用功能的推挽輸出 (Alternate function push-pull) 8.  複用功能的開漏輸出 (Alternate function open-drain) I/O 口的輸出模式下, 有 3 種輸出速度可選 (2MHz 、 10MHz 和 50MHz) ,這個 速度是指 I/O 口 驅動電 路的回應速度 而不是 輸出信號的速度 ,輸出信號的速度與程式有關(晶片內部在 I/O 口 的輸出 部分安排了多個回應速度不同的輸出驅動電路,使用者可以根據自己的需要選擇合適的驅動 電路)。 通過選擇速度來選擇不同的輸出驅動模組,達到最佳的雜訊控制和降低功耗的目 的 。高頻的驅動電路,雜訊也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非 常有利於提高系統的 EMI 性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅動 模組,很可能會得到失真的輸出信號。 關鍵是GPIO的引腳速度跟應用匹配(推薦8倍以上,必要也可用10倍計算)。比如: 1.  對於USART,假如最大串列傳輸速率只需115.2k,那麼用2M的GPIO的引腳速度就夠了,(因0.1152M *8 < 2M )既省電也雜訊小。 .2. 對於I2C介面,假如使用400k串列傳輸速率,那麼用2M的GPIO的引腳速度或許不夠 (因0.4M *8 > 2M ) ,這時可以選用10M的GPIO引腳速度。 3.  對於SPI介面,假如使用18M或9M串列傳輸速率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。     為什麼要提出這一段 ,因為在GPIO的應用上,我常和硬體工程師有不同的意見, 我們寫韌體 往往是 硬體工程師告訴我們GPIO他們是怎麼設計的,而