二、IAR for ARM中STM32項目創建及其啟動文件分析


IAR for ARM

STM32F10X官方固件庫:

鏈接: https://pan.baidu.com/s/1U6vfGqp9IhhkvVuDXcxTtQ
提取碼: 9mcx

IAR for ARM項目文件

下面是我自己寫整理創建的IAR for ARM項目文件
鏈接: https://pan.baidu.com/s/189WZVhEDhhO98BA3I2Jfeg
提取碼: m5fu

啟動文件及一些重要標准庫的分析

啟動文件

在按照網上的教程創建IAR的STM32項目時,網上的教程都要求在項目文件中放入啟動文件startup_stm32f10x_xx.s,可我在編譯時發現,即使把啟動文件去掉,IAR還是可以正常編譯並下載Hex到芯片中並調試,所以我猜測這個啟動文件應該是由IAR自動集成到Hex中的,在IAR主界面,右鍵左邊的項目名稱 -> Options... -> General Options -> Target -> Device - > 選擇ST STM32F103RC,IAR大概會根據你選擇的不同的Device,寫入不同的啟動文件匯編代碼。


2019-6-6更新

最新發現,官方庫的啟動文件雖然不能加斷點,但卻包含中斷服務的聲明,如果沒有包含官方庫的啟動文件,中斷服務將不會啟用,所以最終我還是將startup_stm32f10x_hd.s文件加入到startup目錄中,這樣就可以寫中斷服務了


接下來解析的啟動文件,在固件庫的【/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/】路徑中
因為不能給啟動文件加斷點,以下解析都是基於自己的理解和網上相關教程的解析:
啟動文件的引導地址可以自己定義,如果使用默認的配置,IAR在編譯時,將會使用IAR自己的系統庫作為引導

__iar_program_start 這個入口函數就是IAR內部提供的入口函數,這個函數不能加斷點,似乎只能通過反匯編的形式來分析,我在IAR程序目錄搜索了一邊,真的有很多cstartup.s文件,IAR提供了很多系列芯片的cstartup.s文件


;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* 文件名:     :  startup_stm32f10x_md.s
;* 作者            :  MCD Application Team
;* 版本            :  V3.5.0
;* 日期            :  2011年3月11日
;* 描述            :  STM32F10x是EWARM工具鏈中的中等容量像量表
;*                    :  這個模塊執行了
;*                    :  - 設置初始化SP(堆棧寄存器)
;*                    :  - 配置時鍾系統
;*                    :  - 設置IAR程序的入口函數
;*                    :  - 設置異常中斷服務像量表的入口地址
;*
;*                      After Reset the Cortex-M3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;********************************************************************************
;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;

        MODULE  ?cstartup        ; // 定義模塊名稱

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start  ; // IAR程序暴露的入口地址名稱
        EXTERN  SystemInit        ; // 系統初始化時調用的地址
        PUBLIC  __vector_table    ; // 中斷向量表地址

        DATA    ; // 定義數據段的數據
__vector_table        ; 壓入中斷向量表名稱,以下只截取的部分內容,DCD指令是ARM指令集中的一個壓棧的指令
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     NMI_Handler               ; NMI Handler

............................................  省略  ....................................................

        DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.        ; // 定義默認的中斷函數,這里只是弱定義,可以被用戶自己定義的中斷向量函數覆蓋
;;
        THUMB    ; //  進入THUMB模式(THUMB-2指令集)

        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
        
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER(1)
NMI_Handler
        B NMI_Handler

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER(1)

.................................... 省略 .......................................

USBWakeUp_IRQHandler
        B USBWakeUp_IRQHandler

        END
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/


 
 

stm32f10x_it 【異常中斷服務】

以下是固件庫提供的默認異常中斷函數

// NMI中斷,即不可屏蔽中斷,不可屏蔽中斷請求信號NMI用來通知CPU,發生了“災難性”的事件,如電源掉電、存儲器讀寫出錯、總線奇偶位出錯等。NMI線上中斷請求是不可屏蔽的(即無法禁止的)、而且立即被CPU鎖存。因此NMI是邊沿觸發,不需要電平觸發。
void NMI_Handler(void);

// 硬件錯誤中斷
void HardFault_Handler(void);

// 內存管理異常中斷
void MemManage_Handler(void);

// 總線異常
void BusFault_Handler(void);

// 使用中異常
void UsageFault_Handler(void);

// 系統調用異常,SVC異常是必須立即得到響應的
void SVC_Handler(void);

// This function handles Debug Monitor exception.  調試監視異常
void DebugMon_Handler(void);

// 也是系統調用異常,但PendSV是為系統設備而設的“可懸掛請求”(pendable request),PendSV 的典型使用場合是在上下文切換時(在不同任務之間切換)
void PendSV_Handler(void);

// 系統定時器中斷
void SysTick_Handler(void);

  
 

stm32f10x_rcc【復位與時鍾控制器】

// 復位時鍾
void RCC_DeInit(void);

// 配置外部告訴時鍾
void RCC_HSEConfig(uint32_t RCC_HSE);

// 等待外部高速時鍾啟動
ErrorStatus RCC_WaitForHSEStartUp(void);

// 調整內部高速時鍾(HSI)到指定的值
void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);

// 啟用或禁用內部高速時鍾
void RCC_HSICmd(FunctionalState NewState);

// 配置PLL(鎖相環)的時鍾源和倍頻因子
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);

// 啟用或禁用PLL
void RCC_PLLCmd(FunctionalState NewState);

// 配置PREDIV1分頻因子
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL)
 void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div);
#endif

// 
#ifdef  STM32F10X_CL
 void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div);
 void RCC_PLL2Config(uint32_t RCC_PLL2Mul);
 void RCC_PLL2Cmd(FunctionalState NewState);
 void RCC_PLL3Config(uint32_t RCC_PLL3Mul);
 void RCC_PLL3Cmd(FunctionalState NewState);
#endif /* STM32F10X_CL */ 

// 配置系統時鍾源
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);

// 獲取系統時鍾源
uint8_t RCC_GetSYSCLKSource(void);

// 配置AHB總線時鍾源
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);

// 配置低速APB時鍾源
void RCC_PCLK1Config(uint32_t RCC_HCLK);

// 配置高速APB時鍾源
void RCC_PCLK2Config(uint32_t RCC_HCLK);

// 啟用或禁用RCC中斷
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);


// 配置USB或者OTG時鍾源
#ifndef STM32F10X_CL
 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
#else
 void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource);
#endif /* STM32F10X_CL */ 

// 配置ADC時鍾源
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);


// 配置I2S2時鍾源
#ifdef STM32F10X_CL
 void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource);                                  
 void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource);
#endif /* STM32F10X_CL */ 

// 配置外部低速時鍾源
void RCC_LSEConfig(uint8_t RCC_LSE);

// 啟用或禁用內部低速時鍾
void RCC_LSICmd(FunctionalState NewState);

// 配置RTC時鍾源
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);

// 啟用或禁用RTC時鍾
void RCC_RTCCLKCmd(FunctionalState NewState);

// 獲取各個片上的時鍾頻率
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);

// 啟用或禁用AHB外設時鍾
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);

// 啟用或禁用AHB2外設時鍾
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

// 啟用或禁用APB1外設時鍾
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

// 對外設端口進行復位
#ifdef STM32F10X_CL
void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
#endif /* STM32F10X_CL */ 

// 復位高速APB(APB2)外設
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

// 復位低速APB(APB1)外設
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

// 啟用或禁用備份域
void RCC_BackupResetCmd(FunctionalState NewState);

// 啟用或禁用時鍾安全系統
void RCC_ClockSecuritySystemCmd(FunctionalState NewState);

// 選擇MCO引腳輸出的時鍾源
void RCC_MCOConfig(uint8_t RCC_MCO);

// 根據給定的標志位來獲取一些RCC一些設置的狀態
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);

// 清除RCC標志位的狀態
void RCC_ClearFlag(void);

// 獲取RCC中斷的狀態
ITStatus RCC_GetITStatus(uint8_t RCC_IT);

// 清除中斷掛起
void RCC_ClearITPendingBit(uint8_t RCC_IT);


  
 

stm32f10x_tim 【定時器】

可能是因為STM32時鍾太多了,用於管理時鍾的函數竟有差不多上百個

// 復位指定的通用定時器
void TIM_DeInit(TIM_TypeDef* TIMx);

// 初始化指定的通用定時器,設置基礎頻率
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 初始化比較電平(不是很理解,以后在開發過程中理解了再補充注釋)
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

// 初始化外設定時器
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

// 配置PWM輸出信號
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

// 
void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);

void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct);

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);

void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);

void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState);

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,

                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);


void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);


void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);


void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);


void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);


void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);


void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);


void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);


void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);


void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);


void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);


void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState);


void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState);


void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);


void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);


void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);


void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);


void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);


void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);


void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);


void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);


void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);


void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);


void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);


void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);


void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);


void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource);
void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState);
void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode);
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);


 
 

stm32f10x_usart 【串口通信】

// 復位USART
void USART_DeInit(USART_TypeDef* USARTx);

// 填充指定的USART到默認值
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

// 填充USART_InitTypeDef結構體到默認值
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);

// 填充指定外設的USART的USART_ClockInitTypeDef結構體到默認值
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);

// 填充USART_ClockInitStruct到默認值
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);

// 
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);


void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);


void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address);


void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp);


void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength);


void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


void USART_SendBreak(USART_TypeDef* USARTx);


void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime);


void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler);


void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState);


void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode);


void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState);


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


 
 

stm32f10x_gpio 【通用輸入輸出】


void GPIO_DeInit(GPIO_TypeDef* GPIOx);


void GPIO_AFIODeInit(void);


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);


void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);


uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);


uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);


void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);


void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);



void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);


void GPIO_EventOutputCmd(FunctionalState NewState);


void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);


void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);


void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM