您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > STM32单片机IO端口编程
STM32单片机IO端口编程2.1STM32单片机管脚和命名规则2.2STM32单片机时钟配置2.3STM32单片机I/O端口配置2.4STM32单片机I/O端编程步骤•STM32单片机管脚•STM32系列单片机命名规则2.1STM32单片机管脚和命名规则PA口16脚PB口16脚PC口3脚PD口2脚STM32F103CBT6共有37个I/O管脚:PA口16脚+PB口16脚+PC口3脚+PD口2脚。•STM32单片机管脚:以STM32F103Cx为例,采用的封装形式LQFP48一般而言,嵌入式系统在工作前,都要进行初始化工作,其中包括调用RCC_Configuration(复位和时钟设置)函数。用于系统复位和初始化STM32系列微控制器的时钟。2.2STM32单片机时钟配置2.2.1STM32时钟系统2.2.2RCC_Configuration(复位和时钟设置)函数STM32系列微控制器中,有5个时钟源:HSI(HighSpeedInternal):高速内部时钟、HSE(HighSpeedExternal):高速外部时钟、LSI(LowSpeedInternal):低速内部时钟、LSE(LowSpeedExternal):低速外部时钟、PLL(PhaseLockedLoop):锁相环倍频输出。其中的HSI、HSE、或PLL可被用来驱动系统时钟。其中的LSI、LSE作为二级时钟源。STM32时钟系统结构图(P56)2.2.1STM32时钟系统•外设总线:包括APB1(AdvancedPeripheralBus1)和APB2(AdvancedPeripheralBus2)APB2:用于高速外设APB1:用于低速外设•AMBA片上总线:已成为一种流行的工业片上总线标准。它包括AHB(AdvancedHighperformanceBus)和APB(AdvancedPeripheralBus),前者作为系统总线,后者作为外设总线。STM32系统结构图连接在APB1(低速外设)上的设备:有连接在APB2(高速外设)上的设备:有连接在AHB(AdvancedHighperformanceBus)上的设备:有1、使能挂接在APB1总线上的外设对应的时钟命令:RCC_APB1PeriphClockCmd()函数例如,使能TIM2对应的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd()函数2、使能挂接在APB2总线上的外设对应的时钟命令:例如,使能GPIO端口对应的时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);3、使能挂接在AHB总线上的外设对应的时钟命令:RCC_AHBPeriphClockCmd()函数例如,使能DMA对应的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA,ENABLE);使用操作符“|”可以一次选中上表中的一个或多个取值的组合作为该参数的值。STM32F103xx增强型模块框图基于ARMCortex内核的MCU和普通的8/16位单片机在系统结构上最大区别:普通的8/16位单片机:只有1个系统时钟频率,而基于ARMCortex内核的MCU:具有多个时钟频率,分别供给内核和不同外设模块使用。本课程的学习难点之一:就是ARM时钟比单片机时钟复杂得多。为什么ARM时钟这么复杂?原因二:时钟分开有助于实现低功耗。原因一:高速时钟供中央处理器等高速设备使用,低速时钟供外设等低速设备使用。时钟输出使能∵STM32处理器因为低功耗的需要,各模块需要分别独立开启时钟。∴当需要使用某个外设模块时,记得一定要先使能对应的时钟。否则,这个外设不能工作。2.2.2RCC_Configuration()函数1、RCC复位和时钟配置寄存器组2、枚举类型ErrorStatus3、RCC_Configuration():(复位和时钟设置)函数(ResetandClockConfiguration(),复位和时钟设置函数)STM32单片机的复位和时钟设置:共包括10个设置寄存器①一个32位的时钟控制寄存器(RCC_CR)②一个32位的时钟配置寄存器(RCC_CFGR)③一个32位的时钟中断寄存器(RCC_CIR)④一个32位的APB2外设复位寄存器(RCC_APB2RSTR)⑤一个32位的APB1外设复位寄存器(RCC_APB1RSTR)⑥一个32位的AHB外设时钟使能寄存器(RCC_AHBENR)⑦一个32位的APB2外设时钟使能寄存器(RCC_APB2ENR)⑧一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR)⑨一个32位的备份域控制寄存器(RCC_BDCR)⑩一个32位的控制/状态寄存器(RCC_CSR)Backupdomaincontrolregister(RCC_BDCR)详见参考手册V10_1第P60编程时,时钟的具体配置是从RCC(ResetandClockConfiguration,复位和时钟配置)寄存器组开始。在固件库中,用结构体RCC_TypeDef定义RCC寄存器组:在文件“stm32f10x_map.h”中,定义如下:/*------------------------Real-TimeClock-----------------------------------*/typedefstruct{vu32CR;vu32CFGR;vu32CIR;vu32APB2RSTR;vu32APB1RSTR;vu32AHBENR;vu32APB2ENR;vu32APB1ENR;vu32BDCR;vu32CSR;}RCC_TypeDef;1、RCC复位和时钟配置寄存器组/*Peripheralbaseaddressinthebit-bandregion*/#definePERIPH_BASE((u32)0x40000000)/*Peripheralmemorymap*/#defineAPB1PERIPH_BASEPERIPH_BASE#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)#defineRCC_BASE(AHBPERIPH_BASE+0x1000)#ifdef_RCC#defineRCC((RCC_TypeDef*)RCC_BASE)#endif/*_RCC*/该宏定义的功能:在程序中,所有写RCC的地方,编译器的预处理程序,都将它替换为:((RCC_TypeDef*)0x40021000)2、枚举类型ErrorStatus在文件“stm32f10x_type.h”中,包含typedefenum{ERROR=0,SUCCESS=!ERROR}ErrorStatus;该语句,定义了新枚举类型名ErrorStatus,代表左侧定义的枚举类型。3、RCC_Configuration(复位和时钟设置)函数:在“HelloRobot.h”中ErrorStatusHSEStartUpStatus;voidRCC_Configuration(void){/*将外设RCC寄存器组重新设置为默认值,即复位。RCCsystemreset*/RCC_DeInit();/*打开外部高速时钟晶振HSE,EnableHSE*/RCC_HSEConfig(RCC_HSE_ON);/*等待HSE外部高速时钟晶振稳定,或者在超时的情况下退出,WaittillHSEisready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//SUCCESS:HSE晶振稳定就绪{/*设置AHB时钟=SYSCLK=48MHz,HCLK(即AHB时钟)=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置高速PCLK2时钟(即APB2clock)==AHB时钟/2=24MHz,PCLK2=HCLK/2*/RCC_PCLK2Config(RCC_HCLK_Div2);/*设置低速PCLK1时钟(即APB1clock)=AHB时钟/4=12MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);//RCC_HCLK_Div4:APB1clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz)/*设置Flash延时时钟周期数:为2*/FLASH_SetLatency(FLASH_Latency_2);/*EnableFlashPrefetchBuffer预取指令指令缓冲区,这2句与RCC没有关系*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*利用锁相环将HSE外部8MHz晶振6倍频到48MHz。PLLCLK=8MHz*6=48MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);//此处不同于鸥鹏公司的程序:PLLCLK=8MHz*6=48MHz/*EnablePLL*/RCC_PLLCmd(ENABLE);/*WaittillPLLisready,等待锁相环输出稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*SelectPLLassystemclocksource*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLLCLK作为SYSCLK,所以SYSCLK为48MHz/*WaittillPLLisusedassystemclocksource*/while(RCC_GetSYSCLKSource()!=0x08){}}/*Enableperipheralclocks--------------------------------------------------*//*GPIOA,GPIOBandSPI1clockenable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABLE);/*EnableGPIOC,GPIODclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);}枚举类型变量/*设置低速PCLK1时钟(即APB1clock)=AHB时钟/4=12MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);//RCC_HCLK_Div4:APB1clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz)/*设置Flash延时时钟周期数:为2*/FLASH_SetLatency(FLASH_Latency_2);/*EnableFlashPrefetchBuffer预取指令指令缓冲区,这2句与RCC没有关系*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*利用锁相环将HSE外部8MHz晶振6倍频到48MHz,作为PLLCLK。PLLCLK=8MHz*6=48MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);//此处不同于鸥鹏公司的程序:PLLCLK=8MHz*6=48MHz/*EnablePLL*/RCC_PLLCmd(ENABLE);/*WaittillPL
本文标题:STM32单片机IO端口编程
链接地址:https://www.777doc.com/doc-3379390 .html