STM32单片机IO端口编程.ppt
《STM32单片机IO端口编程.ppt》由会员分享,可在线阅读,更多相关《STM32单片机IO端口编程.ppt(73页珍藏版)》请在三一办公上搜索。
1、第2章 STM32单片机IO端口编程,2.1 STM32单片机管脚和命名规则,2.2 STM32单片机时钟 配置,2.3 STM32单片机I/O端口配置,2.4 STM32单片机I/O端编程步骤,STM32单片机管脚,STM32系列单片机命名规则,2.1 STM32单片机管脚和命名规则,STM32F103CBT6 共有37个I/O管脚:PA口 16脚+PB口16脚+PC口3脚+PD口2脚。,STM32单片机管脚:以STM32F103Cx为例,采用的封装形式LQFP48,一般而言,嵌入式系统在工作前,都要进行初始化工作,其中包括调用RCC_Configuration(复位和时钟设置)函数。用于系
2、统复位和初始化STM32系列微控制器的时钟。,2.2 STM32单片机时钟配置,2.2.1 STM32时钟系统,2.2.2 RCC_Configuration(复位和时钟设置)函数,STM32系列微控制器中,有5个时钟源:HSI(High Speed Internal):高速内部时钟、HSE(High Speed External):高速外部时钟、LSI(Low Speed Internal):低速内部时钟、LSE(Low Speed External):低速外部时钟、PLL(Phase Locked Loop):锁相环倍频输出。其中的HSI、HSE、或PLL可被用来驱动系统时钟。其中的LSI
3、、LSE作为二级时钟源。,STM32时钟系统结构图(P56),2.2.1 STM32时钟系统,其中的HSI、HSE、或PLL可被用来驱动系统时钟。,实际PLL是来自于HSI、HSE,外设总线:包括APB1(Advanced Peripheral Bus 1)和APB2(Advanced Peripheral Bus 2),APB2:用于高速外设APB1:用于低速外设,AMBA片上总线:已成为一种流行的工业片上总线标准。它包括AHB(Advanced High performance Bus)和APB(Advanced Peripheral Bus),前者作为系统总线,后者作为外设总线。,STM
4、32系统结构图,连接在APB1(低速外设)上的设备:有,连接在APB2(高速外设)上的设备:有,连接在AHB(Advanced High performance Bus)上的设备:有,1、使能 挂接在APB1总线上的外设 对应的时钟 命令:,RCC_APB1PeriphClockCmd()函数,例如,使能TIM2对应的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);,RCC_APB2PeriphClockCmd()函数,2、使能 挂接在APB2总线上的外设 对应的时钟 命令:,例如,使能GPIO端口对应的时钟:RCC_APB2Peri
5、phClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);,3、使能 挂接在AHB总线上的外设 对应的时钟 命令:,RCC_AHBPeriphClockCmd()函数,例如,使能DMA对应的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA,ENABLE);,使用操作符“|”可以一次选中上表中的一个或多个取值的组合作为该参数的值。,复位和时钟控制(RCC),STM32F103xx增强型模块框图,基于ARM Cortex内核的MCU 和 普通的8/16位单片机 在系统结构上 最大区别:,普通的8/1
6、6位单片机:只有1个系统时钟频率,而基于ARM Cortex内核的MCU:具有多个时钟频率,分别供给内核 和 不同外设模块使用。,本课程的学习难点之一:就是ARM时钟 比 单片机时钟 复杂得多。,为什么ARM时钟这么复杂?,原因二:时钟分开有助于实现低功耗。,原因一:高速时钟供中央处理器等高速设备使用,低速时钟供外设等低速设备使用。,时钟输出使能,STM32处理器因为低功耗的需要,各模块需要分别独立开启时钟。当需要使用某个外设模块时,记得一定要先使能对应的时钟。否则,这个外设不能工作。,2.2.2 RCC_Configuration()函数,1、RCC复位和时钟配置寄存器组,2、枚举类型Err
7、orStatus,3、RCC_Configuration():(复位和时钟设置)函数,(Reset and Clock Configuration(),复位和时钟设置 函数),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_AP
8、B2ENR)一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR)一个32位的备份域控制寄存器(RCC_BDCR)一个32位的控制/状态寄存器(RCC_CSR),Backup domain control register(RCC_BDCR),详见参考手册 V10_1 第P60,编程时,时钟的具体配置是从RCC(Reset and Clock Configuration,复位和时钟配置)寄存器组开始。在固件库中,用结构体RCC_TypeDef 定义 RCC寄存器组:,在文件“stm32f10 x_map.h”中,定义如下:,/*-Real-Time Clock-*/typedef s
9、truct vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR;RCC_TypeDef;,1、RCC复位和时钟配置寄存器组,/*Peripheral base address in the bit-band region*/#define PERIPH_BASE(u32)0 x40000000),/*Peripheral memory map*/#define APB1PERIPH_BASE PERIPH_BASE#defi
10、ne APB2PERIPH_BASE(PERIPH_BASE+0 x1 0000)#define AHBPERIPH_BASE(PERIPH_BASE+0 x2 0000),#define RCC_BASE(AHBPERIPH_BASE+0 x1000),#ifdef _RCC#define RCC(RCC_TypeDef*)RCC_BASE)#endif/*_RCC*/,该宏定义的功能:在程序中,所有写RCC的地方,编译器的预处理程序,都将它替换为:(RCC_TypeDef*)0 x40021000),2、枚举类型ErrorStatus,在文件“stm32f10 x_type.h”中,包含t
11、ypedef enum ERROR=0,SUCCESS=!ERROR ErrorStatus;,该语句,定义了新枚举类型名ErrorStatus,代表左侧定义的枚举类型。,3、RCC_Configuration(复位和时钟设置)函数:在“HelloRobot.h”中,ErrorStatus HSEStartUpStatus;,void RCC_Configuration(void)/*将外设RCC寄存器组重新设置为默认值,即复位。RCC system reset*/RCC_DeInit();/*打开外部高速时钟晶振HSE,Enable HSE*/RCC_HSEConfig(RCC_HSE_ON
12、);/*等待HSE外部高速时钟晶振稳定,或者在超时的情况下退出,Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/SUCCESS:HSE晶振稳定就绪/*设置AHB时钟=SYSCLK=48 MHz,HCLK(即 AHB时钟)=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置高速PCLK2时钟(即APB2 clock)=AHB时钟/2=24 MHz,PCLK2=HCLK/2*/RCC_PCLK2Config(RCC_HCL
13、K_Div2);/*设置低速PCLK1时钟(即APB1 clock)=AHB时钟/4=12 MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);/RCC_HCLK_Div4:APB1 clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz)/*设置Flash 延时时钟周期数:为2*/FLASH_SetLatency(FLASH_Latency_2);/*Enable Flash Prefetch Buffer预取指令指令缓冲区,这2句与RCC没有关系*/FLASH_PrefetchBufferCmd(FLASH_Prefetc
14、hBuffer_Enable);/*利用锁相环将HSE外部8MHz晶振6倍频到48 MHz。PLLCLK=8MHz*6=48 MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);/此处不同于鸥鹏公司的程序:PLLCLK=8MHz*6=48 MHz/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready,等待 锁相环 输出稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/*Select PLL as system clock
15、source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/选择PLLCLK作为SYSCLK,所以SYSCLK为48 MHz/*Wait till PLL is used as system clock source*/while(RCC_GetSYSCLKSource()!=0 x08)/*Enable peripheral clocks-*/*GPIOA,GPIOB and SPI1 clock enable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_
16、APB2Periph_SPI1,ENABLE);/*Enable GPIOC,GPIOD clock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);,枚举类型,变量,/*设置低速PCLK1时钟(即APB1 clock)=AHB时钟/4=12 MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);/RCC_HCLK_Div4:APB1 clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz)/*设置Flash 延时时钟周期数:为2
17、*/FLASH_SetLatency(FLASH_Latency_2);/*Enable Flash Prefetch Buffer预取指令指令缓冲区,这2句与RCC没有关系*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*利用锁相环将HSE外部8MHz晶振6倍频到48 MHz,作为PLLCLK。PLLCLK=8MHz*6=48 MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);/此处不同于鸥鹏公司的程序:PLLCLK=8MHz*6=48 MHz/*Enable PLL
18、*/RCC_PLLCmd(ENABLE);,/*Wait till PLL is ready,等待 锁相环 输出稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/*Select PLL as system clock source*/选择PLLCLK作为SYSCLK,所以SYSCLK为48 MHz RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till PLL is used as system clock source*/while(RCC_GetSYSCLKSource()!=0 x0
19、8)/*Enable peripheral clocks-*/*GPIOA,GPIOB and SPI1 clock enable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABLE);/*Enable GPIOC,GPIOD clock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);,以上所见的固件库函数:详见“中文版:STM32F10 xxx_固件库函数 V
20、2.pdf P193”,固件库函数的具体实现:见文件“stm32f10 x_rcc.h”,其中RCC_DeInit();,/*Function Name:RCC_DeInit*Description:Resets the RCC clock configuration to the default reset state.*Input:None*Output:None*Return:None*/void RCC_DeInit(void)/*Set HSION bit*/RCC-CR|=(u32)0 x00000001;/*Reset SW1:0,HPRE3:0,PPRE12:0,PPRE22:
21、0,ADCPRE1:0 and MCO2:0 bits*/RCC-CFGR,2.3 STM32单片机I/O端口配置,2.3.1 STM32单片机的 I/O端口和管脚,2.3.2 STM32单片机的 I/O端口配置,2.3.1 STM32单片机的 I/O端口和管脚,STM32单片机 最多有7个16位的并行 I/O端口:PA、PB、PC、PD、PE、PF、PG。,STM32F103Cx单片机 只有4个16位的并行 I/O端口:PA、PB、PC、PD。,STM32F103CBT6 包含4个端口:PA口、PB口、PC口、PD口,共有37个I/O管脚:PA口 16脚+PB口16脚+PC口3脚+PD口2脚
22、。,STM32单片机的I/O端口和管脚:以STM32F103Cx为例,每个GPIOx端口:共有7个设置寄存器两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH)(GPIOx_CRL)(x=A.G):GPIOx configuration register low,GPIOx端口低配置寄存器,用于配置GPIOx端口的第0位第7位。两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR)(GPIOx_IDR)(x=A.G):GPIOx input data register 一个32位的置位/复位寄存器(GPIOx_BSRR)(GPIOx_BSRR)(x=A.G):GPIOx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 单片机 IO 端口 编程
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5576233.html