当前位置:
文档之家› 第2章 STM32单片机IO端口编程
第2章 STM32单片机IO端口编程
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*设置高速PCLK2时钟(即APB2 clock)= = AHB时钟/2 = 24 MHz,PCLK2 = HCLK/2 */
RCC_PCLK2Config(RCC_HCLK_Div2);
/*设置低速PCLK1时钟(即APB1 clock)= AHB时钟/4=12 MHz ,PCLK1 = HCLK/4 */
/* Peripheral base address in the bit-band region */
#define PERIPH_BASE
((u32)0x40000000)
/* Peripheral memory map */ #define APB1PERIPH_BASE #define APB2PERIPH_BASE #define AHBPERIPH_BASE
APB2:用于高速外设 APB1:用于低速外设
连接在APB2(高速外设)上的设备:有 连接在APB1(低速外设)上的设备:有
连接在AHB(Advanced High performance Bus)上的设备:有 STM32系统结构图
1、使能 挂接在APB1总线上的外设 对应的时钟 命令:
RCC_APB1PeriphClockCmd( ) 函数
RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);
/* Enable GPIOC, GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD, ENABLE); }
2.2.2 RCC_Configuration( )函数
( Reset and Clock Configuration( ), 复位和时钟设置 函数 ) 1、RCC复位和时钟配置寄存器组 2、枚举类型ErrorStatus
3、RCC_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_APB2ENR) ⑧一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR) ⑨一个32位的备份域控制寄存器 (RCC_BDCR) ⑩一个32位的控制/状态寄存器 (RCC_CSR)
第2章 STM32单片机IO端口编程
2.1 STM32单片机管脚和命名规则 2.2 STM32单片机时钟 配置 2.3 STM32单片机I/O端口配置 2.4 STM32单片机I/O端编程步骤
2.1 STM32单片机管脚和命名规则 • STM32单片机管脚 • STM32系列单片机命名规则
• STM32单片机管脚:以STM32F103Cx为例,
在文件“stm32f10x_map.h”中,定义如下:
/*------------------------ Real-Time Clock -----------------------------------*/ typedef struct {
vu32 CR; vu32 CFGR; vu32 CIR; vu32 APB2RSTR; vu32 APB1RSTR; vu32 AHBENR; vu32 APB2ENR; vu32 APB1ENR; vu32 BDCR; vu32 CSR; } RCC_TypeDef;
2.2.1 STM32时钟系统
2.2.2 RCC_Configuration(复位和时钟设置)函数
2.2.1 STM32时钟系统
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、LSE作为二级时钟源。
该宏定义的功能:在程序中,所有写RCC的地方,编译器的 预处理程序,都将它替换为:((RCC_TypeDef *) 0x40021000)
2、枚举类型ErrorStatus 在文件“stm32f10x_type.h”中,包含 typedef enum {ERROR=0, SUCCESS=! ERROR} ErrorStatus;
PERIPH_BASE (PERIPH_BASE + 0x1 0000) (PERIPH_BASE + 0x2 0000)
#define RCC_BASE
(AHBPERIPH_BASE + 0x1000)
#ifdef _RCC
#define RCC
#endif /*_RCC */
((RCC_TypeDef *) RCC_BASE)
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) { }
3、使能 挂接在AHB总线上的外设 对应的时钟 命令:
RCC_AHBPeriphClockCmd( ) 函数
例如,使能DMA对应的时钟: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
使用操作符“|”可以一次选中上表中的一个或多个取值的组合作为 该参数的值。
该语句,定义了新枚举类型名ErrorStatus,代表左侧定义的 枚举类型。
3、RCC_Configuration(复位和时钟设置)函数:在“HelloRobot.h”
中 枚举类型
变量
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void)
STM32时钟系统结构图(P56)
• AMBA片上总线:已成为一种流行的工业片上总线标准。 它包括AHB(Advanced High performance Bus)和 APB(Advanced Peripheral Bus ),前者作为系统总线, 后者作为外设总线。
• 外设总线:包括APB1(Advanced Peripheral Bus 1) 和APB2(Advanced Peripheral Bus 2)
STM32F103 xx增强型模 块框图
基于ARM Cortex内核的MCU 和 普通的8/16位单片机 在系统结构上 最大区别:
普通的8/16位单片机:只有1个系统时钟频率, 而基于ARM Cortex内核的MCU:具有多个时钟频率,分别供 给内核 和 不同外设模块使用。
本课程的学习难点之一:就是ARM时钟 比 单片机时钟 复杂得多。
以上所见的固件库函数: 详见“中文版:STM32F10xxx_固件库函数 V2.pdf P193”
固件库函数的具体实现:见文件“stm32f10x_rcc.h”
{ /*将外设RCC寄存器组重新设置为默认值,即复位 。 RCC system reset*/ RCC_DeInit();
/*打开外部高速时钟晶振HSE ,Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE外部高速时钟晶振稳定,或者在超时的情况下退出,Wait till HSE is ready */
详见参考手册 V10_1 第P60
Backup domain control register (RCC_BDCR)
1、RCC复位和时钟配置寄存器组
编程时,时钟的具体配置是从RCC(Reset and Clock Configuration,复位和时钟配置)寄存器组开始。在固件库中,用结构体 RCC_TypeDef 定义 RCC寄存器组:
采用的封装形式LQFP48
PC口 3脚 PD口 2脚
PA口 16脚
PB口 16脚
STM32F103CBT6 共有37个I/O管脚: PA口 16脚+ PB口16脚+ PC口3脚+ PD口2脚。
2.2 STM32单片机时钟配置
一般而言,嵌入式系统在工作前,都要进行初始化工作,其中包括 调用RCC_Configuration(复位和时钟设置)函数。用于系统复位 和初始化STM32系列微控制器的时钟。
/* Enable peripheral clocks --------------------------------------------------*/ /* GPIOA, GPIOB and SPI1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2PeriphBuffer预取指令指令缓冲区,这2句与RCC没有关系 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 利用锁相环将HSE外部8MHz晶振6倍频到48 MHz,作为PLLCLK。 PLLCLK = 8MHz * 6 = 48 MHz */